系列文章目录
【STM32】HAL库 新建MDK工程
【STM32】HAL库 定时器中断
【STM32】HAL库 PWM驱动LED呼吸灯
前言
使用按键控制PWM,驱动舵机
一、SG90舵机
舵机的控制一般需要一个20ms左右的时基脉冲,脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度伺服为例,那么对应的控制关系是这样的:
高电平时间 | 旋转角度 |
---|---|
0.5ms | 0度 |
1.0ms | 45度 |
1.5ms | 90度 |
2.0ms | 135度 |
2.5ms | 180度 |
计数器自动重装值为ARR,0.5ms的计数次数为h。
ARR/ 20 = h / 0.5,h = ARR /40。
1ms旋转45度,1ms的计数次数为0.5ms的两倍 ,求系数k
ARR/ 40 * 2 = 45 *k + ARR/40,k = ARR/ 1800。
1ms的占空比为1 / 20
CCR = 占空比 * ARR = ARR / 20 = ARR/ 40 * 2
CCR = 角度 * ARR / 1800 + ARR /40
二、STM32CubeMX设置
舵机的控制一般需要一个20ms左右的时基脉冲,所以一个周期的时间为20ms,50Hz。舵机的死区时间为5us,所以重装载值需要小于4000 = 20ms/5us。重装载值取2000,50Hz = 72MHz / 分频系数/2000 ,分频系数为720。
三、代码
HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_2);
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
if(HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1) == GPIO_PIN_RESET)
{
HAL_Delay(20);
while (HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_1) == GPIO_PIN_RESET);
HAL_Delay(20);
Angle += 30;
if (Angle > 180)
{
Angle = 0;
}
}
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_2,Angle * (htim2.Init.Period + 1) / 1800 + (htim2.Init.Period + 1) / 40);
}
/* USER CODE END 3 */