一、PWM
1、PWM基本介绍
PWM(Pulse Width Modulation)即脉冲宽度调制,简称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术;它是一种模拟控制方式,根据相应载荷的变化来调制晶体管基极或MOS管栅极的偏置,来实现晶体管或MOS管导通时间的改变,从而实现开关稳压电源输出的改变。PWM就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。
2、PWM工作原理
STM32的每个通用定时器都有独立的4个通道可以用来作为:输入捕获、输出比较、PWM输出、单脉冲模式输出等。\n\nSTM32的定时器除了TIM6和TIM7(基本定时器)之外,其他的定时器都可以产生PWM输出。其中,高级定时器TIM1、TIM8可以同时产生7路PWM输出。
PWM的工作模式:
-
PWM模式1(向上计数) :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件
-
PWM模式2(向下计数)
:计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件
上图为向上计数模式
- 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
- 当CNT小于CCRx时,TIMx_CHx通道输出低电平;
- 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
PWM的一个周期
- 定时器从0开始向上计数
- 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
- t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
- 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数…循环此过程
至此一个PWM周期完成
二、基于PWM的呼吸灯
1、创建CubeMX工程
新建工程,进行基本的配置。
选取需要的芯片,这里我选择STM32F103C8T6,然后点击Start。
打开外部时钟,选择RRC,在菜单栏中选择Crystal/Ceramic Resonator。
然后选择SYS,进行相应设置。
配置定时器3和4,如图选中TIM3,选择时钟源为Internal Clock,通道二选择PWMGeneration CH2。设置分频系数为71,计数周期为500。TIM4同样设置。
然后进行时钟配置。
填写项目名和存储路径,勾选相应选项然后生成工程文件。
2、keil中修改
在keil中打开工程,修改main.c文件,定义两个变量存储占空比:
添加在main函数外。
uint16_t duty_num1 = 10; //存储占空比
uint16_t duty_num2 = 10;
在main函数里面添加如下代码,开启TIM3、TIM4的通道2,输出PWM。
//开启TIM3和TIM4的通道2,输出PWM
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);