一,理论部分
可参考(11条消息) 【STM32】通用定时器的PWM输出(实例:PWM输出)_Yngz_Miao的博客-CSDN博客
(具体可见中文参考手册,在操作过程中会提)
二,操作步骤:
1,CUBEMX配置:
呼吸灯:
(1)从原理图找到自己板子上LED0对应的IO口(如图为PB5)
(2)将PB5设置为定时器通道
(3)发现是定时器3(由中文参考手册找到TIM3所挂的总线)配好时钟树
(4)看板子的原理图找到LED是低电平亮
配置输出模式:
mode1:在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。
注意:模式只决定何时输出有效电平,而什么是有效电平通过输出极性(Polarity)确定
mode2:与mode1相反
PWM输出控制舵机:
MG996参数:接收的PWM信号频率为50HZ,即周期为20ms。
当高电平的脉宽在0.5ms-2.5ms之间时舵机就可以对应旋转到不同的角度。
2.在main中开启PWM输出:
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_2);
3.设置角度的函数
/*
每增加1 °,需加高电平时长:(2500-500)÷180 = 11.1us
因此某角度值ang,需要的总高电平时长:(ang*11.1 +500)us
*/
void My_SetServo(float angle)
{
uint16_t pwmout;
if(angle > 180)
{
angle = 180;
}
if(angle < 0 )
{
angle = 0;
}
pwmout = (angle*11.1 +500);
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_1, pwmout);
}
4.main函数:
while (1)
{
//呼吸灯:
while(i < 19000)
{
i++;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, i);
}
while(i)
{
i--;
__HAL_TIM_SET_COMPARE(&htim3, TIM_CHANNEL_2, i);
}
//控制舵机(90°与45°切换)
/*HAL_Delay(1000);
My_SetServo(90);
HAL_Delay(1000);
My_SetServo(45);
*/