目录
一、PWM脉冲宽度调制
1、使用脉冲占空比拟合不同波形的方式称为 PWM(脉冲宽度调制)控制技术——通过 对一系列脉冲的宽度进行调制,来等效地获得所需要波形(含形状和幅值)。PWM 控制 的基本原理为:冲量相等而开头不同的窄脉冲加在具有惯性的环节上时,其效果基本 相同。其中冲量指窄脉冲的面积;效果相同指环节输出响应波形基本相同。 例如:可以用一系列等幅不用一系列等幅不等宽的脉冲来代替一个正弦半波,见图
要改变等效输出正弦波幅值,按同一比例改变各脉冲宽度即可。 若把拟合的波形改成呼吸特性曲线,即可得到控制呼吸灯使用的 PWM 波形,要生成 拟合的 PWM波形,通常使用计算法和调制法,本文中使用计算法:根据拟合波形的频率、幅值和半周期脉冲数,准确计算 PWM 波各脉冲宽度和
间隔,据此控制开关器件的通断,就可得到所需 PWM 波形。在下边编程实现中会详细说明。
2、要改变PWM输出波形的宽度,就要改变比较寄存器 CCRx 的值,想要输出不通宽度来拟合正弦波,则需要CCRx的值呈现如下图的变化趋势,即要生成一张CCRx的数值表,按周期变化将表中元素的值赋给CCRx。
二、实验工具
1、芯片: STM32F103C8T6系统最小板
2、STM32CubeMx软件
3、IDE: MDK-Keil软件
4、STM32F1xx/STM32F4xxHAL库
5、烧录软件:FlyMcu
三、STM32CubeMX新建项目
1、RCC打开外部时钟
2、选择调试接口为串行
3、配置定时器3和定时器4,选择时钟源为内部时钟“internal clock”,通道2选择"PWM Generation CH2",对应的引脚是PB7 , PA7。
定时器3设置分频系数为71,计数周期为500,其他默认。
定时器4设置分频系数为71,计数周期为1000,其他默认。
4、时钟配置
5、生成工程文件
四、Keil修改代码
1、定义两个变量,用来分别存储两个定时器的占空比
uint16_t duty_num = 10;
uint16_t duty_num2 = 10;
2、开启定时器通道,输出PWM
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim4,TIM_CHANNEL_2);
3、在while循环中添加如下代码:
while (1)
{
/* USER CODE END WHILE */
HAL_Delay(50);
duty_num = duty_num + 10;
duty_num2 = duty_num2+10;
if(duty_num > 500)
{
duty_num = 0;
}
__HAL_TIM_SetCompare(&htim3,TIM_CHANNEL_2,duty_num);
if(duty_num2 > 1000)
{
duty_num2 = 0;
}
__HAL_TIM_SetCompare(&htim4,TIM_CHANNEL_2,duty_num2);
/* USER CODE BEGIN 3 */
}
其中定时器3设置为每隔50ms,占空比加10.如果超过500(也就是PWM周期),自动变成0。定时器4PWM周期为1000,led灯亮按周期是定时器1的两倍。
五、实验效果图和总结
可以看到,外接的led与最小版上的led灯在周期性的逐渐变亮和变暗。
总的来说,这次实验学到了PWM输出控制LED实现流水灯,还是比较简单。需要控制PWM周期只需要改变时钟周期或者改变代码中输出的部分。
参考资料:https://blog.csdn.net/zmhDD/article/details/111942507