[应用相关] [分享] STM32驱动舵机原理和实现

[复制链接]
1445|27
 楼主| lxs0026 发表于 2020-11-30 17:29 | 显示全部楼层
需要解释的是舵机原来主要用在飞机、汽车、船只模型上,作为方向舵的调节和控制装置。所以,一般的转动范围是45°、60°或者90°,这时候脉冲宽变一般只有1ms-2ms之间(比如你做一个遥控小车,用舵机控制方向,那么舵机转的角度肯定不是180度,对吧。因为你见过你开的车方向能转180度吗?)。
 楼主| lxs0026 发表于 2020-11-30 17:30 | 显示全部楼层
而后舵机开始在机器人上得到大幅度的运用,转动的角度也在根据机器人关节的需要增加到-90°至90°之间,甚至还有-135°至135°之间,脉冲宽度也随之有了变化。对于机器人控制而言,我们一般通过单片机产生PWM信号控制舵机。
 楼主| lxs0026 发表于 2020-11-30 17:32 | 显示全部楼层
4.STM32控制舵机代码
 楼主| lxs0026 发表于 2020-11-30 17:33 | 显示全部楼层
  1. 0.5ms---------0度
  2. 0.6ms---------9度
  3. 0.7ms---------18度
  4. 0.8ms---------27度
  5. 0.9ms---------36度
  6. 1.0ms---------45度
  7. 1.1ms---------54度
  8. 1.2ms---------63度
  9. 1.3ms---------72度
  10. 1.4ms---------81度
  11. 1.5ms---------90度
  12. 1.6ms---------99度
  13. 1.7ms---------108度
  14. 1.8ms---------117度
  15. 1.9ms---------126度
  16. 2.0ms---------135度
  17. 2.1ms---------144度
  18. 2.2ms---------153度
  19. 2.3ms---------162度
  20. 2.4ms---------171度
  21. 2.5ms---------180度

  22. \    |    /
  23. \---|---/   
  24.   \  |  /
  25.    \ | /
  26.     \|/      
  27. --------------------------------------------------------------

  28. 20ms的时基脉冲,如果想让舵机转63度,就应该发生一个高电平为1.2ms,
  29. 周期为20ms的方波,duty=1.2/20=6% ,而定时器自动重装载寄存器arr的值
  30. 为 1000 ,所以令duty=60,时占空比才为60/1000=6%.

  31. 20ms的时基脉冲,如果想让舵机转90度,就应该发生一个高电平为1.5ms,
  32. 周期为20ms的方波,duty=1.5/20=7.5% ,而定时器自动重装载寄存器arr的值
  33. 为 1000 ,所以令duty=75,时占空比才为75/1000=7.5%.

  34. 20ms的时基脉冲,如果想让舵机转126度,就应该发生一个高电平为1.9ms,
  35. 周期为20ms的方波,duty=1.9/20=9.5% ,而定时器自动重装载寄存器arr的值
  36. 为 1000 ,所以令duty=95,时占空比才为95/1000=9.5%.
  37. -----------------------------------------------------------------
  38. void SERVO_Init(void)
  39. {
  40.     GPIO_InitTypeDef  GPIO_InitStruct;
  41.     TIM_TimeBaseInitTypeDef TIM_TimeStructure;
  42.     TIM_OCInitTypeDef   TIM_OCInitStructure;

  43.     RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  44.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

  45.     GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;//配置为复用推挽输出
  46.     GPIO_InitStruct.GPIO_Pin=GPIO_Pin_7;
  47.     GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;
  48.     GPIO_Init(GPIOA,&GPIO_InitStruct);

  49.     TIM_TimeStructure.TIM_Period=1000;//1000 自动重装载寄存器的值,周期为50 000Hz/1000=50Hz,即输出PWM波形的频率为20ms。
  50.     TIM_TimeStructure.TIM_Prescaler=1440-1;;// 1400 时钟预分频系数为3600,72 000 000Hz/1400=50000Hz =50KHZ。  
  51.     TIM_TimeStructure.TIM_ClockDivision=TIM_CKD_DIV1;
  52.     TIM_TimeStructure.TIM_CounterMode=TIM_CounterMode_Up;
  53.     TIM_TimeStructure.TIM_RepetitionCounter=0;
  54.     TIM_TimeBaseInit(TIM3,&TIM_TimeStructure);
  55.     TIM_ARRPreloadConfig(TIM3,ENABLE);  //使能ARR预装载寄存器(影子寄存器)

  56.     TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  57.     TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  58.     TIM_OCInitStructure.TIM_Pulse=0;//占空比大小
  59.     TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  60.     TIM_OC2Init(TIM3,&TIM_OCInitStructure);

  61.     TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);   
  62.     TIM_Cmd(TIM3,ENABLE);
  63.     TIM_CtrlPWMOutputs(TIM3,ENABLE);   
  64. }
  65. //舵机角度控制
  66. void SERVO_Angle_Control(uint16_t Compare2)
  67. {
  68.     TIM_SetCompare2(TIM3,Compare2);//设置通道2为可变的pwm
  69. }
 楼主| lxs0026 发表于 2020-11-30 17:34 | 显示全部楼层
配置号上面的程序,如果你想让舵机旋转90度,只需要在你程序的某个位置放上这句话就可以了
 楼主| lxs0026 发表于 2020-11-30 17:35 | 显示全部楼层
配置号上面的程序,如果你想让舵机旋转90度,只需要在你程序的某个位置放上这句话就可以了
  1. SERVO_Angle_Control(75);//舵机旋转90度
 楼主| lxs0026 发表于 2020-11-30 17:35 | 显示全部楼层
原因就是20ms的时基脉冲,如果想让舵机转90度,就应该发生一个高电平为1.5ms,周期为20ms的方波,duty=1.5/20=7.5% ,而定时器自动重装载寄存器arr的值为 1000 ,所以令duty=75,时占空比才为75/1000=7.5%。以此类推,你想让舵机转多大的角度按照这个方法设置就行了。
 楼主| lxs0026 发表于 2020-11-30 17:36 | 显示全部楼层
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部