一、PWM
PWM脉冲宽度调制,是一种常用的调制技术,它通过控制信号的占空比(即高电平时间占总周期时间的比例)来调节电压、功率或者信号的大小。
首先我们要知道PWM的3个重要的成员值,PWM频率、PWM占空比、PWM分辨率。
这3个成员值的赋值是完成呼吸灯,操作电机、舵机、马达的重要步骤。
1.频率
1秒钟内信号从高电平到低电平再回到高电平的次数,
而1/(PWM频率)就是完成一次从高电平到低电平再回到高电平,也就是一个周期所要的时间。
2.占空比
周期内,高电平的时间占整个周期时间的比例,
这个占空比能对对输出的平均电压产生改变
下面是占空比50%和占空比10%的区别
3.分辨率
也就是刷新频率,它的原理是将一个周期分成很多份,只有在进入下一份时,电平才会出现改变。
如果给分辨率设为10%,那它就把一个周期分成10份,每一份中的电平是不变的,只有在进入下一份时,才会展示下一份中的电频。
二、实现延时灯
1.使用STM32CubeMX创建工程
(1)进入时钟界面,进行修改,将时钟修改为下图模式;
修改如下:
(2)在Times中选择Tim2进行设置。
设置效果如下图:
其中根据赋值公式进行数据设置。
赋值公式如下:
(3)配置GPIO引脚。本次配置的引脚为GPIO_PA4。在GPIO选项中配置。
效果如图:
(4)代码编写。
HAL_TIM_Base_Start_IT(&htim2);
将代码写进这一部分。
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
static unsigned char ledState = 0;
if (htim == (&htim2))
{
if (ledState == 0)
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_RESET);
else
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,GPIO_PIN_SET);
ledState = !ledState;
}
}
将代码放在这一部分:
(5)实验效果:
三、呼吸灯
(1)创建工程
在设置界面选择TIM3,在这里面进行条件设置。
设置如下:
这其下面继续设置:
(2)时钟设置
(3)代码编写
代码如下:
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
在这一部分放下代码;
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
在这一部分 放下代码:
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
HAL_Delay(200);
}
/* USER CODE END 3 */
在这一部分放下代码:
(4)实验效果:
总结
本次实验学习到了呼吸灯的实现,加强了延时灯的运用。