首先我们需要了解一下如何驱动舵机。首先舵机有三根线,两根电源线和一根信号线。我们控制舵机时需要给舵机一个合适的工作电压,我一般习惯用5V供电,但是当舵机数量比较多时可以采用2s锂电池供电。其次要想驱动舵机转动就要给他一个合适的工作频率,控制舵机时需要频率50hz的脉冲波来控制,也就是周期为20ms的脉冲波(T=1/F)。当周期为0.5ms时对应舵机为0度,当周期为2.5ms时对应舵机为180度,也就是占空比为0.5/20=0.025到2.5/20=0.125之间对应舵机转动角度0度到180度。那么思路就清晰了。我们需要先生成一个50hz的脉冲波,然后对应占空比来控制舵机。下面我以stm32f4为例:
Servo_Init(20000-1,84-1); //初始化为一个50hz的脉冲波
void Servo_Init(u32 arr,u32 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE);
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9);
GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_TIM9);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOE,&GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);//初始化定时器12
//初始化TIM14 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式1
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM9, &TIM_OCInitStructure);
TIM_OC2Init(TIM9, &TIM_OCInitStructure);
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable);
TIM_OC2PreloadConfig(TIM9, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM9,ENABLE);//ARPE使能
TIM_Cmd(TIM9, ENABLE);
}
//配置PWM模式时注意若定时器模式:TIM脉冲宽度调制模式为1,则TIM输出比较极性要配置为低
void angle1(float x)
{ // 把角度值, 换算成CCR值
if(x<0)
x = 0;
if(x>180)
x = 180;
// TIM_SetCompare1(TIM9,(int)(x*(0.1*arr/180)+0.025*arr)); 注意:stm32不能算除法,必须需要手动算一下1/arr
TIM_SetCompare1(TIM9,(int)(x*11.11+500));
}
void angle2(float x)
{ // 把角度值, 换算成CCR值
if(x<0)
x = 0;
if(x>180)
x = 180;
//TIM_SetCompare2(TIM9,(int)(x*(0.1*arr/180)+0.025*arr)); 注意:stm32不能算除法,必须需要手动算一下1/arr
TIM_SetCompare1(TIM9,(int)(x*11.11+500));
}
/* *********换算过程:
由于在50HZ即20ms的脉冲波下,0.5ms的脉冲波对应0度,2.5ms的脉冲波对应180度。所以
占空比为0.5/20即0.025%下对应0度,占空比为2.5/20即0.125%下对应180度。若装载值为arr
则占空比为0.025*arr-0.125*arr对应0-180度。则每度对应占空比为0.1*arr/180,0度时对应占空比为0.025*arr,所以对应角度对应占空比为x*(0.1*arr/180)+0.025*arr,防止出现小数,应该加上强制转换(我在这上面吃过亏),即(int)(x*(0.1*arr/180)+0.025*arr)***********但记住stm32不能算除法,所以需要手动算一下1/arr*/
/***************作者:mxyflame871***************/转载时请注明出处!