帮我解释完善以下代码并添加注释 inline FunctionalState Servo_SetAngle(uint8_t angle, uint8_t angler) { uint16_t pulse_width; // 脉宽 uint16_t pulse_hight; // 高电平时间 // 计算脉宽和高电平时间 pulse_width = SERVO_MIN_PULSE_WIDTH + (SERVO_MAX_PULSE_WIDTH - SERVO_MIN_PULSE_WIDTH) * angle / 180; pulse_hight = SERVO_MIN_PULSE_WIDTH + (SERVO_MAX_PULSE_WIDTH - SERVO_MIN_PULSE_WIDTH) * angler / 270; printf("pulse_width=%d\r\n", pulse_width); // 设置比较寄存器1和比较寄存器4的值 TIM_SetCompare1(TIM4, pulse_width); TIM_SetCompare4(TIM4, pulse_hight); // 清除比较寄存器1和比较寄存器4更新标志位 TIM_ClearFlag(TIM4, TIM_FLAG_CC1); TIM_ClearFlag(TIM4, TIM_FLAG_CC4); // 等待比较寄存器1更新完成 while (TIM_GetFlagStatus(TIM4, TIM_FLAG_CC1 & TIM_FLAG_CC4) == RESET) { // 等待比较寄存器1更新完成 } // 检查比较寄存器1是否更新成功,返回结果 if (TIM_GetFlagStatus(TIM4, TIM_FLAG_CC1 & TIM_FLAG_CC4) == RESET) { return ENABLE; } else { return DISABLE; } }
时间: 2023-08-24 16:07:20 浏览: 153
这段代码实现的是一个舵机控制函数,根据输入的角度和倾斜角度来设置舵机的脉宽和高电平时间,使舵机转到指定的角度和倾斜角度。以下是对代码的注释:
```c
/**
* @brief 设置舵机角度
* @param angle: 舵机角度(0~180)
* @param angler: 倾斜角度(0~270)
* @retval 设置结果,ENABLE表示成功,DISABLE表示失败
*/
inline FunctionalState Servo_SetAngle(uint8_t angle, uint8_t angler) {
uint16_t pulse_width; // 脉宽
uint16_t pulse_hight; // 高电平时间
// 计算脉宽和高电平时间
pulse_width = SERVO_MIN_PULSE_WIDTH + (SERVO_MAX_PULSE_WIDTH - SERVO_MIN_PULSE_WIDTH) * angle / 180;
pulse_hight = SERVO_MIN_PULSE_WIDTH + (SERVO_MAX_PULSE_WIDTH - SERVO_MIN_PULSE_WIDTH) * angler / 270;
// 输出脉宽
printf("pulse_width=%d\r\n", pulse_width);
// 设置比较寄存器1和比较寄存器4的值
TIM_SetCompare1(TIM4, pulse_width);
TIM_SetCompare4(TIM4, pulse_hight);
// 清除比较寄存器1和比较寄存器4更新标志位
TIM_ClearFlag(TIM4, TIM_FLAG_CC1);
TIM_ClearFlag(TIM4, TIM_FLAG_CC4);
// 等待比较寄存器1更新完成
while (TIM_GetFlagStatus(TIM4, TIM_FLAG_CC1 & TIM_FLAG_CC4) == RESET) {
// 等待比较寄存器1更新完成
}
// 检查比较寄存器1是否更新成功,返回结果
if (TIM_GetFlagStatus(TIM4, TIM_FLAG_CC1 & TIM_FLAG_CC4) == RESET) {
return ENABLE;
} else {
return DISABLE;
}
}
```
其中,使用了`TIM_SetCompare1`和`TIM_SetCompare4`函数来设置比较寄存器1和比较寄存器4的值,从而实现设置舵机的脉宽和高电平时间。同时,使用`TIM_ClearFlag`函数清除比较寄存器1和比较寄存器4的更新标志位。在等待比较寄存器1更新完成的过程中,使用了`TIM_GetFlagStatus`函数来检查标志位的状态。最后,通过判断比较寄存器1是否更新成功,返回设置结果。
阅读全文