功能实现:
- 采用定时器PWM功能实现呼吸灯的功能,PWM频率为1KHz,呼吸灯周期为5s
准备工作:
- 1、STM32开发板(我的是STM32F103C8)
- 2、STM32CubeMx软件、 IDE: Keil软件
什么是PWM
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
原理讲解:
下图为向上计数模式:
在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的工作模式:
PWM模式1(向上计数) :计数器从0计数加到自动重装载值(TIMx_ARR),然后重新从0开始计数,并且产生一个计数器溢出事件
PWM模式2(向下计数) :计数器从自动重装载值(TIMx_ARR)减到0,然后重新从重装载值(TIMx_ARR)开始递减,并且产生一个计数器溢出事件
STM32定时器输出通道引脚
参照实验1,芯片选择“STM32F103C8”。
打开外部时钟,点击“System Core”,选择RCC,在右侧弹出的菜单栏中选择“Crystal/Ceramic Resonator”。
选择调试接口,点击“System Core”,选择RCC。,在右侧弹出的菜单栏中选择“Serial Wire”。
2、配置定时器2。位置Timers中选择TIM2选中定时器2;MODE里面clock source选择时钟源为“Internal Clock”,channel2选择“PWM Generation CH2”并且保证 3、4
位置3设置分频系数为71,计数周期为500,其它默认。
位置4设置占空比初始值为10,其实这里不写也没影响。
3、时钟配置。参照实验1.
4、参照实验1的步骤7,进行相应配置,生成工程文件。
5、修改工程。打开工程,主要修改main.c文件。先是位置1,定义一个变量,用来存储占空比
在48行的下面添加一行代码
初值设为10.
uint16_t duty_num = 10;
代码二:开始TIM2的通道2,输出PWM。
在93行下面添加:
代码:
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_2);
位置3,每隔50毫秒,占空比加10,如果超过500(也就是PWM周期),自动变成0.
在98行下面添加
main函数中代码
while (1) { /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ HAL_Delay(50); duty_num = duty_num + 10; if(duty_num > 500) { duty_num = 0; } __HAL_TIM_SetCompare(&htim2,TIM_CHANNEL_2,duty_num); }