stm32输入角度控制舵机

stm32输入角度控制舵机,第1张

stm32输入角度控制舵机

首先我们需要了解一下如何驱动舵机。首先舵机有三根线,两根电源线和一根信号线。我们控制舵机时需要给舵机一个合适的工作电压,我一般习惯用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));
}


转载时请注明出处!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713842.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存