
要实现的是用PWM实现呼吸灯的效果。 先简单说一下原理,比如对一个电灯来说,你在1秒内,打开开关0.5秒,再关闭0.5秒,如此反复,那么电灯就会闪烁,但是如果是1毫秒内,0.5毫秒打开,0.5毫秒关闭,由于视觉暂留作用,也可能由于灯光的亮灭速度赶不上开关速度(还没全亮就又没电了),于是人眼不感觉电灯在闪烁,而是感觉灯的亮度少了一半。同理,如果是0.1毫秒开,0.9毫秒灭,感觉灯的亮度就只有1/10了。 然后我们在cubemx中进行设置,STM32 的定时器除了 TIM6 和 7。其他的定时器都可以用来产生 PWM 输出。其中高级定时器 TIM1 和 TIM8 可以同时产生多达 7 路的 PWM 输出。而通用定时器也能同时产生多达 4路的 PWM 输出,这样, STM32 最多可以同时产生 30 路 PWM 输出。 设置一个led二极管的定时器及通道, , Z4 ^+ |- e# |4 s![]() ![]() 在定时器设置中设置通道1为PWM, 2 }6 m; }# c, T2 x0 V![]() ![]() 6 g& J4 w7 {& g4 U" @, B6 w: W 设置分频和计数 ![]() ![]() 以及通道有效的高低电平,我这是低电平二极管点亮,所以设为low,这个不能错,不然不亮。 ![]() ![]() ![]() ![]() 1、Mode(PWM的模式) 该选项中有PWM Mode 1和PWM Mode 2两个选项& i7 o5 d# N( X3 M8 y PWM Mode 1 :正常理解的PWM波 结果为:5 g5 `# g- j0 |8 t3 V ![]() PWM Mode 2 :与PWM1模式互补的波(PWM模式1为高电平时PWM2为低电平,反之亦然) 结果为: ![]() 2、Pulse(脉冲宽度) Pulse16位二进制数,可以输入范围为0-2^16等于 0-65535的10进制数 改变Pulse就是改变PWM的初始脉冲宽度。 3 N, Y0 t) N, {3、FastMode(快速模式【ENABLE/DISABLE】) 不用理。 4、CH Polarity(频道有效电平【High/Low】) 顾名思义,这个参数就是控制有效电平的,因为有一些芯片的处理需要的是高电平有效,一些是需要低电平有效,为了在提高STM32适应性的同时不把我们程序猿的脑子搞乱,就有了这个设置,以下是实验效果 当CH Polarity为High时,结果为: ![]() 当CH Polarity为Low时,结果为: ![]() 1 y! T7 E1 a% W) O 5、CH Idle State(空闲状态【Set/Reset】) 同样顾名思义,CH Idle State为该频道PWM不输出时的状态 这里比较重要的是分频和计数,上一节定时器中断的参数设定也可以知道,t为两者相乘除以对应的时钟频率。 频率是t的倒数。由时钟树可以得知时钟频率是72Mhz。 这里涉及到一个点,呼吸灯,当 PWM 周期太慢(低于 50Hz)的时候,我们就会明显感觉到闪烁了。因此, PWM 周期在这里不宜设置的太小。 频率f即PWM周期,即f = 72M /72 * 1000, 至于分频和计数具体是多少,个人认为是多少都行,只要他们的乘积符合条件。 一般来说,我会把分频设置为时钟频率的因子,便于计算。 然后计数的大小,大的话,可调节的PWM占空比就更加精细,越小就比较粗糙,一般设1000吧。 X4 T$ Z/ |! ?- T0 L! C( s6 j初始化完程序后,需要在程序中打开PWM的功能。即 ![]() ![]() ) ?9 f# [: ~/ ]. B; J/ g: ?8 ~ 还需要用到一个设置占空比的函数 ![]() ![]() % p. B0 W# Q8 j 改变第三个参数的值,可以设置对应的占空比。 占空比 = Pulse / Period,这里Period设的1000,Pulse 可以通过上面函数设置,也可以在PWM初始化函数设置。 & f* o9 A5 ?$ V1 O% \/ z+ f呼吸灯的话可以写成如下算法: ![]() ![]() 即完成PWM在HAL库中的应用。 7 E0 F3 G* U( ^0 {5 f- l& ?: C- L0 {5 c0 v' J$ l4 Z: i |
STM32固件库分享,超全系列整理
X-NUCLEO-IKS4A1实现手势滑动
STM32G系列RS485自动收发控制以及自适应波特率实战
STM32G0系列ADC扫描序列模式解读
【经验分享】FPGA作为从机与STM32进行SPI协议通信---Verilog实现
【管管推荐】STM32经验分享篇
STM32G030F6P6基于HAL库模拟SPI驱动1.8寸TFT LCD屏幕
STM32的CAN FD位定时设置注意事项
基于STM32将移植 SBSFU 到 STM32G070过程分享
基于STM32G030 RAM不够用经验分享