当前位置:   article > 正文

STM32--舵机驱动_数字舵机pwm

数字舵机pwm

目录

舵机接线:

数字舵机与模拟舵机的区别:

舵机驱动(90度、180度、270度、360度):

90度舵机驱动:

180度舵机驱动:

270度舵机驱动:

360度舵机驱动:

STM32定时器配置:

stm32f4为例(时钟频率为84Mhz):

stm32f1为例(时钟频率为72Mhz):

STM32定时器PWM输出配置要点:

STM32定时器配置:


舵机接线:

红色线电源线(VCC)
黑色  /  棕色地线(GND)
白色  /  黄色信号线(pwm输出)

注意:如果外接电源,那么舵机和开发板、电源之间需要共GND,即开发板上的GND与电源的GND和舵机的GND三者相连接。

如果三者没有共GND,这时舵机无法接收到正常的pwm驱动信号,如图所示,开发板输出周期为20ms,脉冲宽度(高电平宽度)为1.5ms的pwm完全变形,无法正常驱动舵机。


数字舵机与模拟舵机的区别:

数字舵机只需发送1次PWM信号就能运动到预定的角度,模拟舵机需要给它不停的发送PWM信号,才能让它保持在预定的角度。

数字舵机与模拟舵机的驱动控制方法是一样的。


舵机驱动(90度、180度、270度、360度):

90度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-45度20ms0.5ms
0度20ms1.5ms
45度20ms2.5ms

180度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-90度20ms0.5ms
-45度20ms1ms
0度20ms1.5ms
45度20ms2ms
90度20ms2.5ms


270度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-135度20ms0.5ms
0度20ms1.5ms
135度20ms2.5ms

360度舵机驱动:

转动角度脉冲周期脉冲宽度(高电平宽度)
-180度20ms0.5ms
-90度20ms1ms
0度20ms1.5ms
90度20ms2ms
180度20ms2.5ms

所以90度、180度、270度、360度的舵机驱动方法是一样的。

1.驱动脉冲周期都是20ms

2.所有舵机在脉冲宽度为1.5ms驱动下,都位于0度。


STM32定时器配置

stm32f4为例(时钟频率为84Mhz):

设置arr(自动重装载值)为10000-1=9999,psc(定时器分频系数)为168-1=167

时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck

                                   =(9999+1)*(167+1)/  84Mhz                

                                   =  20  ms


stm32f1为例(时钟频率为72Mhz):

设置arr(自动重装载值为10000-1=9999),psc(定时器分频系数144-1=143)

时钟周期计算公式:T=(arr+1)*(psc+1)/ Tck

                                   =(9999+1)*(143+1)/  84Mhz                

                                   =  20  ms

*(stmf4的时钟频率为84Mhz,stm32f1时钟频率为72Mhz,Tck为时钟频率)*


STM32定时器PWM输出配置要点:

***  注意定时器通道的输出极性  ***

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高。

TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低。

1. TIM_OCPolarity_High:当定时器计数小于比较数值是输出高电平,大于比较数值是输出低电平。

  输出极性:TIM_OCPolarity_High  比较极性高     

设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);

如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 1ms

2.TIM_OCPolarity_Low:当定时器计数小于比较数值是输出低电平,大于比较数值是输出高电平。

 输出极性:TIM_OCPolarity_Low比较极性低      

设置 arr=9999,psc=167,TIM_SetCompare1(TIM14,500);

如图所示:周期20ms,频率50Hz,脉冲宽度(高电平宽度)= 19 ms

输出极性:TIM_OCPolarity_High  比较极性高      TIM_SetCompare1(TIM14,number);

设置 arr=9999,psc=167

脉冲宽度(高电平宽度)比较数值,
0.5msnumber  =  250
1msnumber  =  500
1.5msnumber  =  750
2msnumber  =  1000
2.5msnumber  =  1250

 输出极性:TIM_OCPolarity_Low比较极性低      TIM_SetCompare1(TIM14,number);

设置 arr=9999,psc=167

脉冲宽度(高电平宽度)比较数值,TIM_SetCompare1(TIM14,number);
0.5msnumber  =  9750
1msnumber  =  9500
1.5msnumber  =  9250
2msnumber  =  9000
2.5msnumber  =  8750

STM32定时器配置:

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "pwm.h"
  5. int main(void)
  6. {
  7. NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  8. delay_init(168);
  9. TIM14_PWM_Init(10000-1,168-1);
  10. while(1)
  11. {
  12. TIM_SetCompare1(TIM14,500);
  13. }
  14. }
  15. void TIM14_PWM_Init(u32 arr,u32 psc)
  16. {
  17. //此部分需手动修改IO口设置
  18. GPIO_InitTypeDef GPIO_InitStructure;
  19. TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
  20. TIM_OCInitTypeDef TIM_OCInitStructure;
  21. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能
  22. RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟
  23. GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14
  24. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9
  25. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
  26. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
  27. GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
  28. GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
  29. GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9
  30. TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
  31. TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
  32. TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
  33. TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  34. TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
  35. //初始化TIM14 Channel1 PWM模式
  36. TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
  37. TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
  38. TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
  39. TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
  40. TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器
  41. TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
  42. TIM_Cmd(TIM14, ENABLE); //使能TIM14
  43. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/956035
推荐阅读
相关标签
  

闽ICP备14008679号