1.基本配置一下cubemx
我们配置的TIM2,所以时钟源为48MHZ
舵机要求的周期是20ms,也就是50HZ。那么我们设置48MHZ/48/20000=50HZ,也就是0.02s=20ms.
2. keil5编写
在tim.c下插入
/* USER CODE BEGIN TIM2_Init 2 */
HAL_TIM_Base_Start_IT(&htim2);
/* USER CODE END TIM2_Init 2 */
main.c下
/* USER CODE BEGIN PD */
#define SERVO_MIN_ANGLE 0 // 舵机最小角度
#define SERVO_MAX_ANGLE 180 // 舵机最大角度
#define PWM_PERIOD 20000 // PWM周期,单位为us
/* USER CODE END PD */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4);
/* USER CODE END 2 */
因为舵机需要高电平时间为0.5ms-2.5ms之间,所以当高电平为0.5ms,周期为20ms时,这时的Duty=0.5/20=2.5%。2.5%=CCR/(AAR+1),所以CCR=500.
所以当高电平为2.5ms,周期为20ms时,这时的Duty=2.5/20=12.5%。12.5%=CCR/(AAR+1),所以CCR=2500.
所以CCR的范围在500-2500。而角度代表0°-180°。
500 0
2500 180
因为一一对应的关系我们可以得到公式。angle=(CCR-500)(180°-0°)/(2500-500)
CCR=(angle /180°-0°)*(2500-500) + 500;
for(int angle = SERVO_MIN_ANGLE; angle <= SERVO_MAX_ANGLE; angle += 10)
{
/* 计算占空比 */
float duty_cycle = (angle * 11.11f) + 500.0f; // 角度转换为占空比
/* 设置PWM占空比 */
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, (uint32_t)duty_cycle);
HAL_Delay(100); // 延时一段时间
}
for(int angle = SERVO_MAX_ANGLE; angle >= SERVO_MIN_ANGLE; angle -= 10)
{
/* 计算占空比 */
float duty_cycle = (angle /180.0f)*2000.0f + 500.0f; // 角度转换为占空比 angle/180*2000+500
/* 设置PWM占空比 */
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, (uint32_t)duty_cycle);
HAL_Delay(100); // 延时一段时间
}
注: __HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL_4, (uint32_t)duty_cycle);
这个函数其实就是改变CCR的值,以达到改变占空比的目的
3.实验现象
当我设置CCR的值为1500时,现象应该是高电平时间为1.5ms。duty=1500/20000*20ms=1.5ms
所以实验现象成功
感想:学了很久的hal库,都写在笔记里了,后面会陆续发出来整理出来,给stm32阶段画一个句号,后面开始学习freertos。