当前位置:   article > 正文

STM32——舵机控制_stm32控制舵机 csdn

stm32控制舵机 csdn

一、舵机控制原理
(一)概述

        舵机是一种位置伺服驱动器器,是一种带有输出轴的小装置。当我们向伺服器发送一个控制信号时,输出轴就可以转到特定的位置。只在控制信号持续不变,伺服机构就会保持相对的角度位置不变。如果控制信号发生变化,输出轴的位置也会相应发生变化。舵机的控制大部分都是通过PWM信号控制的。

        注:舵机按角度分为90°、180°、270°、360°舵机,其中360°舵机只能控制旋转速度不能固定在某一角度上。

(二)PWM

        PWM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占整个信号周期的百分比。如下图

通过向舵机的信号线发送PWM信号控制舵机的输出量,一般来说,PWM的周期及占空比,可通过程序控制的。

        当我们向舵机发送脉冲宽度为1.5ms时,舵机的输出轴将移至中间位置0°;

        当脉冲宽度为1ms时,舵机的输出轴将移至中间位置-45°;

        脉冲宽度为2ms时,舵机的输出轴将移至中间位置45°。

        注:不同类型和品牌的伺服电机之间最大位置和最小位置的角度可能会不同。许多伺服器仅旋转约170度(或者只有90度),但宽度为1.5 ms的伺服脉冲通常会将伺服设置为中间位置(通常是指定全范围的一半);具体参考下图

  1. 占空比 = t / T 相关参数如下:
  2. t = 0.5ms —————— 舵机会转到 -90 °
  3. t = 1.0ms —————— 舵机会转到 -45°
  4. t = 1.5ms —————— 舵机会转到 0°
  5. t = 2.0ms —————— 舵机会转到 45°
  6. t = 2.5ms —————— 舵机会转到 90°

  1. void TIM4_CH1_PWM_Init(u16 arr,u16 psc)
  2. {
  3. GPIO_InitTypeDef GPIO_InitStruct;
  4. TIM_TimeBaseInitTypeDef TIM_TimeBaseStruct;
  5. TIM_OCInitTypeDef TIM_OCInitTypeStruct;
  6. RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  7. //要开启复用功能的时钟才能重映射
  8. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB ,ENABLE);
  9. //TIM3部分重映射
  10. /*
  11. *查看数据手册,引脚的定时器通道是完全映射,还是部分映射
  12. *二者调用参数不相同
  13. *完全映射 :GPIO_FullRemap_TIM4
  14. *部分映射 :GPIO_PartialRemap_TIM4
  15. */
  16. //设置该引脚为复用输出功能
  17. GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
  18. GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6;
  19. GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
  20. GPIO_Init(GPIOB,&GPIO_InitStruct);
  21. //初始化TIM4
  22. TIM_TimeBaseStruct.TIM_Period = arr;//重装载值
  23. TIM_TimeBaseStruct.TIM_Prescaler = psc;//预分频值
  24. TIM_TimeBaseStruct.TIM_ClockDivision = 0; //时钟分频124分频
  25. TIM_TimeBaseStruct.TIM_CounterMode = TIM_CounterMode_Up;//设置计数模式
  26. TIM_TimeBaseInit(TIM4,&TIM_TimeBaseStruct);
  27. //初始化输出比较参数
  28. TIM_OCInitTypeStruct.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式
  29. TIM_OCInitTypeStruct.TIM_OutputState = TIM_OutputState_Enable;//比较输出使能
  30. TIM_OCInitTypeStruct.TIM_OCPolarity = TIM_OCPolarity_High;//输出极性
  31. TIM_OC1Init(TIM4,&TIM_OCInitTypeStruct); //选择定时器输出通道 TIM4_CH1
  32. //使能预装载寄存器
  33. TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
  34. //使能定时器
  35. TIM_Cmd(TIM4,ENABLE);
  36. }
  1. int main(void)
  2. {
  3. TIM4_CH1_PWM_Init(1999,719);//PWM频率=72000000/719+1/1999+1=50hz=20ms
  4. while(1)
  5. {
  6. //-90
  7. TIM_SetCompare1(TIM4,1750);//占空比(2000-1750/2000*20ms=2.5ms
  8. //45
  9. //TIM_SetCompare1(TIM4,1800);//占空比(2000-1800/2000*20ms=2ms
  10. //0
  11. //TIM_SetCompare1(TIM4,1850);//占空比(2000-1850/2000*20ms=1.5ms
  12. //-45
  13. //TIM_SetCompare1(TIM4,1900);//占空比(2000-1900/2000*20ms=1ms
  14. //-90
  15. //TIM_SetCompare1(TIM4,1945);//占空比(2000-1945/2000*20ms=0.5ms
  16. }
  17. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Cpp五条/article/detail/281136
推荐阅读
相关标签
  

闽ICP备14008679号