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

STM32驱动SG90舵机

[复制链接]
STMCU小助手 发布时间:2021-8-6 12:51
1. 材料介绍
STM32F103VET6开发板,此处我使用的是野火的指南者,不过F103系列的应该都是可以通用的,具体大家可以自行参考相对应开发板的用户手册。
SG90舵机一个。我使用的是180°旋转的,实际上在某宝购买的时候360°、180°、90°的SG90都叫这个名字,如果你真的不懂的话,选购之前最好是问问客服可以旋转多少度。
杜邦线若干。


2.接线方法
主要是SG90舵机的三根线,我使用的这款舵机红线接5V(3.3V带不动舵机),棕色接GND,黄色线接开发板的PC6.
1.png



3.舵机控制原理
控制信号
舵机的控制信号为PC6输出的PWM信号,周期为20ms,其中脉冲宽度从0.5ms~2.5ms,对应舵盘的0°到180°,呈线性变化。
也就是说,给舵机提供一定的脉宽,它的输出轴就会保持在一个与之对应的角度上,直到下一个不同的脉宽出现,转到新的对应角度。


反馈信号
舵机接收来自信号线的控制信号,电机在转动时,会带动反馈电位计的转动,电位计将输出一个电压信号到舵机控制板,进行反馈,该信号与控制信号进行比较,从而调整转动方向与速度,直到反馈信号与控制信号相同。


代码部分
  1. <font face="微软雅黑" size="3">#include "stm32f10x.h"   
  2. void pwm_init(void);
  3. void delay(uint32_t x);
  4. int main()
  5. {         
  6.         pwm_init();         //PWM初始化
  7.         while(1)
  8.         {
  9.                 TIM_SetCompare1(TIM3, 195);//0度
  10.                 delay(10000000);
  11.                 TIM_SetCompare1(TIM3, 190);//45度
  12.                 delay(10000000);
  13.                 TIM_SetCompare1(TIM3, 185);//90度
  14.                 delay(10000000);
  15.                 TIM_SetCompare1(TIM3, 180);//135度
  16.                 delay(10000000);
  17.     TIM_SetCompare1(TIM3, 177);//比180度旋转的稍微小一点,因为舵机旋转到180度之后可能会卡一下,详细原因可以自行查找
  18.                 delay(10000000);        
  19. //                TIM_SetCompare1(TIM3, 175);//180度
  20. //                delay(10000000);        
  21.         }
  22. }


  23. void pwm_init()
  24. {
  25.         GPIO_InitTypeDef GPIO_InitStructure;   //声明初始化GPIO的结构体变量

  26.         TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;//声明初始化定时器的结构体变量

  27.         TIM_OCInitTypeDef TIM_OCInitStructure;//根据TIM_OCInitStruct中指定的参数初始化外设TIMx

  28.         //开启时钟
  29.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC,ENABLE);
  30.         RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);
  31.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);

  32.         //  配置GPIO的模式和IO口
  33.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_6;// PC6
  34.         GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  35.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;//复用推挽输出
  36.         GPIO_Init(GPIOC,&GPIO_InitStructure);
  37.         
  38.         //TIM3定时器初始化
  39.         TIM_TimeBaseInitStructure.TIM_Period = 199; //PWM 频率=72000/(199+1)=36Khz//设置自动重装载寄存器周期的值
  40.         TIM_TimeBaseInitStructure.TIM_Prescaler = 7199;//设置用来作为TIMx时钟频率预分频值
  41.         TIM_TimeBaseInitStructure.TIM_ClockDivision = 0;//设置时钟分割:TDTS = Tck_tim
  42.         TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式
  43.         TIM_TimeBaseInit(TIM3, & TIM_TimeBaseInitStructure);

  44.         GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);//改变指定管脚的映射 规则在F103参考手册里。

  45.         //PWM初始化
  46.         TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  47.         TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//PWM输出使能
  48.         TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;

  49.         TIM_OC1Init(TIM3,&TIM_OCInitStructure);
  50.         TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);//使能或者失能TIMx在CCR1上的预装载寄存器
  51.         TIM_Cmd(TIM3,ENABLE);//使能或者失能TIMx外设
  52. }

  53. void delay(uint32_t x)
  54. {
  55.   while(x--);
  56. }
  57. </font>
复制代码


收藏 评论0 发布时间:2021-8-6 12:51

举报

0个回答

所属标签

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