你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【经验分享】STM32f1之舵机驱动+转动角度调整

[复制链接]
STMCU小助手 发布时间:2022-5-15 14:43
一、舵机的“自白”
我(舵机)是一种位置(角度)伺服的驱动器,适用于那些需要角度不断变化并可以保持的控制系统。

那么问题来了?我们用舵机来干嘛呢,当然是控制方向了,如今,基本上飞机或者智能车又或是机器人等等都会用到舵机这个东西,所以说,认识舵机,并且运用舵机就成为我们必不可少的知识学习了,下面附图:

NLXBK%R~EY5]S_~22XOI]GB.png

这里我用的是S3003舵机,其他类型的舵机应该也是大同小异。

其中,有三条线,一条接电源(5V即可),一条接地,最后一条接控制(即单片机输出的PWM控制),下面会给上具体实现代码,总的来说跟上一讲区别不大,主要就是PWM周期输出控制,利用 TIM_SetComparex()  函数来设置占空比实现,但是多出的是计算问题,因为舵机有对应角度的时间计算,下面具体讲解:

舵机的控制一般需要一个20ms左右的时基脉冲,该脉冲的高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分,总间隔为2ms。以180度角度为例,的其控制关系是这样的:

   0.5ms--------------0度;

   1.0ms------------45度;

   1.5ms------------90度;

   2.0ms-----------135度;

   2.5ms-----------180度;

基本上,我们学生党所需要的舵机的控制角度对应就是上述关系了,至于360度舵机这里简单提一下,主要是我这个舵机做不到(哈哈哈,这舵机180°的)

这里讲一下360°舵机的

   0.5ms--------------0度;正向持续转(最大速度)

   1.5ms------------90度;停止转动,速度无

   2.5ms-----------180度;逆向持续转(最大速度)

调整PWM周期即可改变转动速度和方向。

言归正传,到了这里基本上对控制舵机角度其实有了一定概念了,下面就直接附上代码部分了

二、代码部分
  1. #include "sys.h"
  2. #include "duoji.h"

  3. void duoji_Pwm_Init()
  4. {
  5.         GPIO_InitTypeDef GPIO_InitTypeStruce;
  6.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitTypeStruce;
  7.         TIM_OCInitTypeDef TIM_OCInitTypeStruce;
  8.         
  9.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
  10.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
  11.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE);
  12.         
  13.         GPIO_InitTypeStruce.GPIO_Mode=GPIO_Mode_AF_PP;
  14.         GPIO_InitTypeStruce.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;//这里是我之前的代码,主要是控制到4个舵机,这里大家只用一个输出口即可
  15.         GPIO_InitTypeStruce.GPIO_Speed=GPIO_Speed_50MHz;
  16.         
  17.         TIM_TimeBaseInitTypeStruce.TIM_Period=1999;//这里是自动重装值设置
  18.         TIM_TimeBaseInitTypeStruce.TIM_Prescaler=719;//这里是预分频系数
  19.         TIM_TimeBaseInitTypeStruce.TIM_ClockDivision=0;
  20.         TIM_TimeBaseInitTypeStruce.TIM_CounterMode=TIM_CounterMode_Up;
  21.         
  22.         TIM_OCInitTypeStruce.TIM_OCMode=TIM_OCMode_PWM1;
  23.         TIM_OCInitTypeStruce.TIM_OutputState=TIM_OutputState_Enable;
  24.         TIM_OCInitTypeStruce.TIM_OCPolarity=TIM_OCPolarity_High;
  25.         
  26.         GPIO_Init(GPIOB,&GPIO_InitTypeStruce);
  27.         TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitTypeStruce);
  28.         TIM_OC1Init(TIM4,&TIM_OCInitTypeStruce);
  29.         //TIM_OC2Init(TIM4,&TIM_OCInitTypeStruce);//这些是TIM4其他通道初始化
  30.         //TIM_OC3Init(TIM4,&TIM_OCInitTypeStruce);
  31.         //TIM_OC4Init(TIM4,&TIM_OCInitTypeStruce);
  32.         
  33.         TIM_OC1PreloadConfig(TIM4,TIM_OCPreload_Enable);
  34.         //TIM_OC2PreloadConfig(TIM4,TIM_OCPreload_Enable);
  35.         //TIM_OC3PreloadConfig(TIM4,TIM_OCPreload_Enable);
  36.         //TIM_OC4PreloadConfig(TIM4,TIM_OCPreload_Enable);
  37.         
  38.         TIM_Cmd(TIM4,ENABLE);
  39.         
  40. }
复制代码

主函数部分

  1. #include "led.h"
  2. #include "delay.h"
  3. #include "key.h"
  4. #include "sys.h"
  5. #include "usart.h"
  6. #include "duoji.h"


  7. int main()
  8. {

  9.         delay_init();                       
  10.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  11.         uart_init(115200);         //
  12.          LED_Init();                             //
  13.         KEY_Init();          //
  14.         duoji_Pwm_Init();
  15.         while(1)
  16.         {
  17.                 LED0 = !LED0;         

  18.                 TIM_SetCompare1(TIM4,50);//这里设置占空比改变角度,用TIM4定时器,可以自己更换
  19.                 TIM_SetCompare2(TIM4,50);
  20.         delay_ms(5000);
  21.         delay_ms(5000);
  22.                 TIM_SetCompare1(TIM4,250);
  23.                 TIM_SetCompare2(TIM4,250);
  24.         delay_ms(5000);
  25.         delay_ms(5000);
  26.         
  27.         }
  28.         
  29. }
复制代码

这里的代码是其他地方用的,拿来简单修改一下而已,基本上就是这样了。

三、如何计算得到该要控制的角度
这里直接上纸描述,字丑谅解哈哈哈

S]{(00DLU@@Z`3H{}4ABM5C.png

其中的arr和psc可以自己设置,再计算出相应角度的占空比值即可。大家可以自己调试一番,定会有所收获。


收藏 评论0 发布时间:2022-5-15 14:43

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版