资讯详情

【嵌入式】实现STM32的PWM和DAC功能

目录

  • 一、实验准备
  • 二、使用定时器完成PWM波形输出
    • 1.PWM简介
    • 2.相关工程
    • 3.keil仿真
    • 4.示波器演示效果
  • 三、使用DAC输出波形
    • 1.DAC简介
    • 2.DAC输出正弦波
    • 3.数字音频数据转模拟音频波形输出
  • 四、参考

一、实验准备

阅读和学习野火开发板材料(零死角玩转)stm32-中级篇,零死角玩 STM32F103-指南)和在线资源熟悉脉冲宽度调制(PWM)数模/模数转换原理。完成以下实验:

  1. 用STM32F103输出一路PWM波形,建议采用定时器方法。这种方法用于野火和网络资源,并且有完整的源代码。用示波器观察输出波形。
  2. 用STM32F103的DAC功能完成以下波形输出,用示波器观察波形,用蜂鸣器或手机耳机听输出声效,感受歌曲的音质差异。
  • 输出周期2khz正弦波(循环)。这种波形驱动作用于蜂鸣器或喇叭,将呈现滴滴…”的单音;
  • 将数字音频歌曲数据转换为模拟音频波形输出(循环);

提示:首先使用音频制作工具audition制作一段数字2khz正弦波wav制作文件时,应指定采样频率、量化位数和通道数,以及时间长度。MCU资源有限,建议采样8khz,量化16bit,单通道2秒左右的单通道。音频wav可似汉字字模的数据可以直接保存copy到Keil不需要在代码中使用数组SD卡上的wav文件(野火开发板读取SD卡上的wav文件)。

单音音频还原输出成功完成后(示波器观察),然后将你喜欢的歌曲片段转换为实验wav还原输出文件。

硬件:开发板上的野火指南 软件:keil 5、Audition、WavToC

二、使用定时器完成PWM波形输出

1.PWM简介

如下图所示:PWM等效正弦波 在这里插入图片描述

其划分方法是将正弦半波分成 N 等分,可视为 N相互连接的脉冲序列宽度相等,但振幅值不同;然后用矩形脉冲代替,每个矩形脉冲等宽,中点与脉冲序列重叠,脉冲宽度根据正弦规律变化,脉冲总面积(冲量)等于正弦半波。脉冲波形称为SPWM 波形是一种极其典型的波形 PWM 波形。

TIM3_CH1:PA六、完全重视图像PC6 TIM3_CH2:PA7,完全重映像PC7 TIM3_CH3:PB完全重视图像PC8 TIM3_CH4:PB1.完全重现图像PC9

2.相关工程

本次实验使用的工程是野火STM32F103-mini开发板资料\1-程序源码_教程文档\1《STM32库开发实战指南(标准库源码)优先学习\1-书籍配套例程-F103RCMINI\32-TIM—高级定时器\3-TIM—高级定时器-PWM输入捕获 或者直接使用以下链接

链接:https://pan.baidu.com/s/1OqQOXjhiV_TPu65sdoV24Q 提取码:tj44

解压打开工程后,打开main.c文件,在main以下函数在函数前定义,以实现定时器TIM1的初始化

//PWM输出初始化 //arr:自动重装值 //psc:时钟预分频率 void TIM1_PWM_Init(u16 arr,u16 psc) { 
             GPIO_InitTypeDef GPIO_InitStructure;  TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;  TIM_OCInitTypeDef  TIM_OCInitStructure;   RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);//    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能                                                                             ///将引脚设置为复用输出功能TIM1 CH1的PWM脉冲波形  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1,引脚是PA8  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  GPIO_Init(GPIOA, &GPIO_InitStructure);

	
	TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80K
	TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 不分频
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
	TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

 
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
	TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
	TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx

    TIM_CtrlPWMOutputs(TIM1,ENABLE);	//MOE 主输出使能 

	TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能 
	
	TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
	
	TIM_Cmd(TIM1, ENABLE);  //使能TIM1
 
}

main函数

int main(void)
 { 
        	
	u16 led0pwmval=0;    
	u8 dir=1;	
	//delay_init(); //延时函数初始化 
	//LED_Init(); //初始化与LED连接的硬件接口
	TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz 
   	while(1)
	{ 
        
 		//delay_ms(10); 
		if(dir)led0pwmval++;
		else led0pwmval--;	 
 		if(led0pwmval>300)dir=0;
		if(led0pwmval==0)dir=1;	   					 
		TIM_SetCompare1(TIM1,led0pwmval);//设置不同的占空比 
	} 
}

3.keil仿真

编译完成后,进行设置 点击调试,然后确定 选择逻辑分析器

拖动窗口将其展示出来

点击setup,添加PORTA,将Display Type设置成Bit,选择自己喜欢的颜色,然后就可以点击close关闭了 点击run,一段时间后结束 然后就能显示出波形图了,可以看到占空比在逐渐发生变化

可以使用鼠标滚轮查看

生成.hex文件后将程序烧录到板子上

4.示波器演示效果

三、使用DAC输出波形

1.DAC简介

DAC,数模转换器,又称D/A转换器,简称DAC,它是把数字量转变成模拟的器件,主要由数字寄存器、模拟电子开关、位权网络、求和运算放大器和基准电压源(或恒流源)组成。用存于数字寄存器的数字量的各位数码,分别控制对应位的模拟电子开关,使数码为1的位在位权网络上产生与其位权成正比的电流值,再由运算放大器对各电流值求和,并转换成电压值。

名称 型号类型 注释
VREF+ 输入,正模拟参考电压 2.4V ≤ V REF+ ≤ V DDA (3.3V)
VDDA 输入,模拟电源 模拟电源
VSSA 模拟输出信号 DAC通道x的模拟输出

2.DAC输出正弦波

这里我使用的例子是野火官方的工程 链接:https://pan.baidu.com/s/1Zj_UHdquiT5nCtw76ohweQ 提取码:zz0t

野火使用的是踩点输出波形 编译烧录进开发板后即可运行,示波器演示效果如下:

3.数字音频数据转模拟音频波形输出

打开Audition,文件打开,找到歌曲文件 截取一段音频,右键选择存储选区,先改格式为Wave PCM,接着更改采用类型 使用WavToC将wav文件转换为C语言代码

将数组内的代码粘到刚刚的正弦波工程中去

数据太多编译时会报错,我只留下了一部分

编译后将程序烧录到开发板中,示波器演示效果如下:

四、参考

①(stm32f103学习总结)—stm32 PMW输出实验 ②STM32F103使用TIM DMA DAC实现播放WAV音乐 ③使用STM32F103输出PWM波形 ④Keil5的仿真调试 ⑤DAC(数模转换模块)-STM32F103

标签: 20zj1b矩形连接器

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台