脉宽调制(PWM)
脉宽调制(PWM)是一种利用微处理器的数字输出对模拟电路进行控制的高效技术,通过控制脉冲的宽度实现。
除了TIM6和TIM7,STM32的定时器可以用于产生PWM输出。高级定时器TIM1和TIM8可以同时产生最多7路的PWM输出,通用定时器也可以同时产生最多4路的PWM输出。因此,STM32最多可以同时产生30路PWM输出!
STM32F03C8T6可用PWM资源:
高级定时器(TIM1):7路
通用定时器(TIM2至TIM4):各4路
PWM输出模式
PWM输出模式1:向上计数时,当CNT<CCRx时输出有效电平,否则为无效电平;向下计数时,当CNT>CCRx时输出无效电平,否则为有效电平
PWM输出模式2:向上计数时,当CNT<CCRx时输出无效电平,否则为有效电平;向下计数时,当CNT>CCRx时输出有效电平,否则为无效电平
有效电平(并非单指高电平或低电平,具体取决于设置的情况)
PWM周期与频率
周期和频率是相互倒数的关系
TimeOut = ((Prescaler + 1) * (Period + 1)) / TimeClockFren
公式参数的解释:
TimeOut:定时器溢出时间(单位为us),即TIM中断触发的时间间隔。
Prescaler:TIM时钟的预分频器值。
Period(ARR):计数重载值,当TIM计数超过此值时重新计数。
TimeClockFren:定时器的输入时钟频率(单位为MHZ),即当前使用的TIM所用的时钟频率。如不清楚,可通过相关参数查询获得。
PWM实验
需求:使用PWM点亮LED,实现呼吸灯效果。
问:为什么LED可以越来越亮、越来越暗?
答:这是由占空比决定的(占空比是指有效电平所占整个信号周期的百分比)。
问:如何计算周期/频率?
答:假设频率为2kHz,则PSC=71,ARR=499。
问:LED连接到哪个定时器的哪一路?
答:可从原理图中找到LED连接到哪个IO口,然后在产品手册中查询相关信息。
如下图所示:
使用CubeMX构建工程:
1. 修改debug设置
2. 设置时钟
3. 设置TIM4
主要设置如下:
关于TIM4设置的自动生成代码:
启动PWM:
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);
修改比较值,修改占空比:
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal);
完整代码如下:
int main(void){ uint16_t pwmVal = 0;uint8_t dir = 1;HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_TIM4_Init();HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_3);while(1){ HAL_Delay(1);if(dir == 1){ pwmVal++;}else{ pwmVal--;}if(pwmVal > 500){ dir = 0;}if(pwmVal == 0){ dir = 1;}__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_3,pwmVal);}}
STM32—PWM 有效建议和应对措施
1、......
2、......
3、......