首先我们需要了解一下如何驱动舵机。首先舵机有三根线,两根电源线和一根信号线。我们控制舵机时需要给舵机一个合适的工作电压,我一般习惯用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)); }
转载时请注明出处!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)