基础知识:
舵机可以通过控制PWM波占空比来调节相应角度
关于SG-5010舵机,我自己测得的它的工作脉冲宽度范围为0.4ms ~2.6ms
参数自定义:
首先设置时钟为72Mhz,预分频系数为72-1,自动重装载计数器的值为5000-1,这样的话就可以得到一个5ms的脉冲宽度,5000的计数值可以让舵机的旋转角度变得更加易控且相对精准,计算旋转角度的时候也可以更加精确。
所以我们5ms脉宽,period是5000,那么有这么一个对应表:
脉宽-------------角度----------pulse
0.5ms-------------0度----------500;
1.0ms------------45度---------1000;
1.5ms------------90度---------1500;
2.0ms-----------135度---------2000;
2.5ms-----------180度---------2500;
(其实pulse值为400和2600也可以转到)
代码:
1、先定义一个全局变量count
2、然后在main函数里:
按键设置占空比的代码(写在while里):
if(HAL_GPIO_ReadPin(KEY1_GPIO_Port,KEY1_Pin) == GPIO_PIN_RESET)
{
count++;//增
if(count <500)
{count = 500;}
else if(count>=2500)
{count = 2500;}//if-else是为了让计数器被设置的值不超过工作范围
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,count);//设置占空比
//为了区分是在加占空比还是减占空比,两个led灯
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_SET);
}
else if(HAL_GPIO_ReadPin(KEY2_GPIO_Port,KEY2_Pin) == GPIO_PIN_RESET)
{
count--;//减
if(count <500)
{count = 500;}
else if(count>=2500)
{count = 2500;}
__HAL_TIM_SET_COMPARE(&htim2,TIM_CHANNEL_4,count);
HAL_GPIO_WritePin(LED1_GPIO_Port,LED1_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(LED2_GPIO_Port,LED2_Pin,GPIO_PIN_RESET);
}
OLED_ShowNum(3,1,((count-500)*9)/100,5);//把旋转角度打印在oled屏上
HAL_Delay(1);//为了防止count值增减太快
OK,就这样^v^!