STM32
直播中

风尚男人

8年用户 889经验值
私信 关注
[问答]

如何使用STM32F103输出PWM波?

如何使用STM32F103输出PWM波?

回帖(1)

卢原继

2021-11-15 10:45:12
1、PWM(脉冲宽度调制)介绍

脉冲宽度调制是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字信号对模拟电路进行控制的一种非常有效的技术。脉冲宽度调制是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。————来源“百度百科”

  PWM是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调 制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控 制的一种非常有效的技术,其控制简单、灵活和动态响应好等优点而成 为电力电子技术最广泛应用的控制方式,其应用领域包括测量,通信, 功率控制与变换,电动机控制、伺服控制、调光、开关电源,甚至某些 音频放大器,因此学习PWM具有十分重要的现实意义。 其实我们也可以这样理解,PWM是一种对模拟信号电平进行数字编码 的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个 具体模拟信号的电平进行编码。PWM 信号仍然是数字的,因为在给定的 任何时刻,满幅值的直流供电要么完全有(ON),要么完全无(OFF)。电压 或电流源是以一种通(ON)或断(OFF)的重复脉冲序列被加到模拟负载上去 的。通的时候即是直流供电被加到负载上的时候,断的时候即是供电被 断开的时候。只要带宽足够,任何模拟值都可以使用 PWM 进行编码。





——几个基本概念
(1)pwm频率:是指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);
(2)pwm周期:
T=1/f
周期=1/频率
50Hz = 20ms 一个周期
如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
(3)占空比:
是一个脉冲周期内,高电平的时间与整个周期时间的比例
单位: % (0%-100%)
表示方式:20%





2、STM32F1——PWM

在STM32F1中除了基本的TIM6和TIM7,其他定时器都可以产生PWM输出。
PWM的输出其实就是对外输出脉宽可调(即占空比调节)的方波信号 ,信号频率是由自动重装寄存器 ARR 的值决定,占空比由比较寄存器 CCR 的值决定。





3、使用STM32F103输出PWM波

使用例程,野火自带的程序例程——TIM高级定时PWM互补输出带死区时间
打开工程例程程序后,编译烧到至开发板中(这里使用的是野火STM32mini板)
主程序如下:
// TIM—高级定时器-PWM互补输出带死区时间应用#include "stm32f10x.h"#include "bsp_led.h"#include "bsp_AdvanceTim.h"  /**  * @brief  主函数  * @param  无    * @retval 无  */int main(void){                /* 高级定时器初始化 */        ADVANCE_TIM_Init();          while(1)  {        }}/*********************************************END OF FILE**********************/ 以上我们说到了除了TIM6和TIM7,其他定时器都可以产生输出PWM,本实验也是使用的高级定时器方法。我们根据引脚图





可以将板子上的引脚接入到PA8或PB13上
4、输出展示






STM32DAC——输出正弦波

1、DAC简介

DAC 为数字/模拟转换模块,故名思议,它的作用就是把输入的数字编码,转换成对 应的模拟电压输出,它的功能与 ADC 相反。在常见的数字信号系统中,大部分传感器信 号被化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、处理的数字编码, 由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压模拟信号常常用来驱动某些 执行器件,使人类易于感知。如音频信号的采集及还原就是这样一个过程。 STM32 具有片上 DAC 外设,它的分辨率可配置为 8 位或 12 位的数字输入信号,具有 两个 DAC 输出通道,这两个通道互不影响,每个通道都可以使用 DMA 功能,都具有出错 检测能力,可外部触发。
STM32 的 DAC 外设有固定的输出通道,分别为 PA4 和 PA5,不过开发板已经在板载 SPI-FLASH 芯片中使用了这两个引脚,所以用作 DAC 通道输出电压时会受到干扰,影响 实验,见图 。





2、DAC功能框图剖析






3、正弦波表制作脚本

采用matlab脚本制作正弦波脚本
使用MATLAB打开sinWave.m
修改代码如下:
%用于产生正弦数据表,输出到文件dac_sinWave.c 文件中,复制到c语言数组即可n = 2*pi/3600 : 2*pi/3600 : 2*pi      %分成3600等份a = sin(n)+1;                     %求取sin函数值并向上平移一个单位,消除负数值a = a * 3.3/2;                    %调整幅值,使范围限制为0~3.3   r = a* (2.^12) /3.3               %求取dac数值,12位dac LSB = 3.3/2.^12 r = uint16(r);                     %把double型数据转化成16位整型数据 for i = 1:3600                        if r(i) > 4095                      %限制数据最大不超过4095    r(i) = 4095endend dlmwrite('dac_sinWave.c',r);      %把数据写入到文件,方便添加到stm32工程中plot(n,r,'.')                     %把这些点画出来  运行后产生如下的取样点





取样点将保存在dac_sinWave.c中





4、引入工程文件

将产生的数据复制并打开工程文件
将内容复制到“波形数据”中





5、使用示波器检验

此时使 用示波器测量 PA4、PA5 引脚查看其输出的波形





将一段数字音频歌曲数据转换为模拟音频波形输出

我们使用Audition截取一段mp3的音频文件,右键选取的音频段,保存为Wave文件










同时使用WavToC工具——将wav音频文件转为c语言代码





可以用记事本打开,也可以用UltraEdit打开,其实我们不需要太长的一段,太长反而难以复制。
将生成的十六进制代码复制到原输出正弦波程序中。


举报

更多回帖

发帖
×
20
完善资料,
赚取积分