最近做项目时烧了两个舵机才发现自己对舵机的学习还不够透彻,所以又重新找了一些资料看看,在这里做个总结,欢迎大家一起来探讨。
一、舵机的控制原理
舵机的控制周期一般是20ms。也就是给其一个20ms的脉冲,其中高电平部分一般为0.5ms-2.5ms,脉冲宽度为1.5ms时作为基准信号,对应180°舵机的90°位置,对应360°舵机的速度为0。
180°舵机: 360°舵机:
0.5ms--------------0度; 0.5ms ------------正向最大转速
1.0ms------------45度;
1.5ms------------90度; 1.5ms ------------速度为0
2.0ms-----------135度;
2.5ms-----------180度; 2.5ms -----------反向最大转速
补充:180°舵机和360°舵机的控制逻辑是不同的。舵机本质是个位置伺服电机,90度、180度舵机的功能实现就能很明显的体现出这一点;但360度舵机相当于一个无极变速的减速电机,控制的是速度和方向,并不能做位置控制。所以大家在选购舵机时要根据自己的需求进行选择。
(关于舵机的控制周期以及高电平部分参数为什么是这些笔者也不知道,可能跟舵机的内部结构原理有关,如果有知道的大佬,还请在评论区或者私信多多指点)
二、CUBEMX——PWM配置
以stm32f4xx+TIM5为例:
1.时钟配置
2.定时器配置——TIM5
·
(1+19999) / ( 84Mhz / 84 ) = 20ms,这样就配置出来一个控制周期为20ms的PWM信号。
3.代码实现
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_TIM5_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start (&htim5 );
HAL_TIM_PWM_Start (&htim5, TIM_CHANNEL_1 );
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 500-1); // 0°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 1000-1); // 45°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 1500-1); // 90°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 2000-1); // 135°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 2500-1); // 180°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 2000-1); // 135°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 1500-1); // 90°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 1000-1); // 45°
HAL_Delay(1000);
__HAL_TIM_SetCompare(&htim5 , TIM_CHANNEL_1 , 500-1); // 0°
HAL_Delay(1000);
}
/* USER CODE END 3 */
}