使用STM32生成多路的PWM信号

我们可以使用stm32来生成多路的pwm信号。首先我们来了解一下什么是pwm信号,pwm的全称为pulse width modulation,即脉冲宽度调制,我们通常也称pwm信号为占空比信号。pwm信号包含3个主要属性:占空比、频率、振幅。
信号频率与周期:pwm信号频率f与周期t的关系为 f = 1 / f,也就是说频率和周期互为倒数。例如,我们有一个频率为400hz的pwm信号,那么每一个pwm周期的时间为2500us。
占空比:就是pwm方波信号高电平占整个信号周期的比例。例如:pwm周期为2500us,而每一个高电平的时长为1000us,那么占空比为1000 / 2500 = 40%;
振幅:振幅就是高低电平差,也就是我们所说的高电平的电压,通常我们使用stm32单片机所产生的pwm信号为3.3v的pwm波,而有一些芯片和系统可能会产生5.0v或其它电压的pwm波。
例如,我们给出两个pwm信号的例子:
频率400hz;周期2500us;占空比44%;
频率400hz;周期2500us;占空比8%
注意,上图中给出的ms表示毫秒,us表示微秒(1毫秒等于1000微秒,1ms等于1000us)。
接下来,我们使用stm32f407来生产4路pwm信号,首先开启tim4和gpiod的时钟总线:
rcc_apb1periphclockcmd(rcc_apb1periph_tim4, enable);rcc_ahb1periphclockcmd(rcc_ahb1periph_gpiod, enable);然后,我们查看控制模块的原理图,找到需要生成pwm信号的4个引脚:
配置pd12、pd13、pd14、pd15这4个引脚,将它们配置为推挽输出模式:
gpio_inittypedef gpio_initstructure;gpio_initstructure.gpio_pin = gpio_pin_12 | gpio_pin_13 | gpio_pin_14 | gpio_pin_15;gpio_initstructure.gpio_mode = gpio_mode_af;gpio_initstructure.gpio_speed = gpio_speed_100mhz;gpio_initstructure.gpio_otype = gpio_otype_pp;gpio_initstructure.gpio_pupd = gpio_pupd_down;gpio_init(gpiod, &gpio_initstructure);由于我们使用的stm32f4xx系列,所以还需要打开这4个gpio脚的af的pinsource功能:
gpio_pinafconfig(gpiod, gpio_pinsource12, gpio_af_tim4);gpio_pinafconfig(gpiod, gpio_pinsource13, gpio_af_tim4);gpio_pinafconfig(gpiod, gpio_pinsource14, gpio_af_tim4);gpio_pinafconfig(gpiod, gpio_pinsource15, gpio_af_tim4);第三步,打开配置tim4的时钟周期和pwm周期:
tim_timebaseinittypedef tim_timebasestructure;tim_timebasestructure.tim_prescaler = 84 - 1; //配置预分频数tim_timebasestructure.tim_countermode = tim_countermode_up; //向上计数tim_timebasestructure.tim_period = 2500 - 1; //配置时钟周期tim_timebasestructure.tim_clockdivision = tim_ckd_div1;tim_timebaseinit(tim4, &tim_timebasestructure);第四步,配置tim4的各个pwm通道:
tim_ocinittypedef tim_ocinitstructure;tim_ocinitstructure.tim_ocmode = tim_ocmode_pwm1;tim_ocinitstructure.tim_outputstate = tim_outputstate_enable;tim_ocinitstructure.tim_pulse = 0;tim_ocinitstructure.tim_ocpolarity = tim_ocpolarity_high;tim_oc1init(tim4, &tim_ocinitstructure); //通道1tim_oc1preloadconfig(tim4, tim_ocpreload_enable);tim_oc2init(tim4, &tim_ocinitstructure); //通道2tim_oc2preloadconfig(tim4, tim_ocpreload_enable);tim_oc3init(tim4, &tim_ocinitstructure); //通道3tim_oc3preloadconfig(tim4, tim_ocpreload_enable);tim_oc4init(tim4, &tim_ocinitstructure); //通道4tim_oc4preloadconfig(tim4, tim_ocpreload_enable);最后,分别配置4路pwm的占空比值,然后开启tim4:
tim_setcompare1(tim4, 400);tim_setcompare2(tim4, 800);tim_setcompare3(tim4, 1800);tim_setcompare4(tim4, 2200);tim_arrpreloadconfig(tim4, enable);tim_cmd(tim4, enable);tim_ctrlpwmoutputs(tim4, enable);我们使用了tim_setcompare1/2/3/4()函数,将pd12、pd13、pd14和pd15分别设置高电平时长为400us、800us、1800us和2200us。我们将程序编译并烧录到我们的控制模块当中,然后使用示波器或逻辑分析仪来查看pwm的信号:

51单片机对读卡器的编程设计
特价IC:MC34119,0755-83982320,饶小姐
全球智能手机市场都在下滑的时候,拉丁美洲的市场却反其道而行
Jaunt利用AR技术让体积视频捕获变得简单
硅片价格上涨 引发Intel和TSMC供应风险
使用STM32生成多路的PWM信号
Linux和QNX操作系统在智能驾驶上的使用区别
Nature:当AI遇见量子计算,会引发科学革命吗?
高端对话║互联网设计如何服务制造业
Verilog和SystemVerilog定义了4种描述信号状态
iphone6plus爆炸前有征兆? 澳男子iphone6plus碎屏之后突然爆炸
LED显示屏室内的与室外的有哪些区别?
微芯宣布与Cartesiam、Edge Impulse和Motion Gestures达成合作
proteus步进电机仿真
语音合成芯片的特点及选型
SKJ-II型数字随动系统中PWM功率变换控制系统
Omniverse 课程系列 7:使用 Isaac Sim 实现机器人仿真入门
一文详解HLS从C/C++到VHDL的转换
ARHT和伦敦商学院合作推出了实时全息讲师
全新结构开放数控系统的研究