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));
}

/*    *********换算过程:
由于在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***************/转载时请注明出处!

  • 2
    点赞
  • 38
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

mxyflame871

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值