MG90S简介

  1. 舵机
    是一种角度伺服电机,一般是由齿轮组、电位器、舵机控制电路、直流电机构成。由发送控制信号来控制输出轴的位置。
  2. 数字舵机与模拟舵机的区别:
    MG90S是一款常用的数字舵机,还有一款常用的模拟电机是MG90。
    ①数字舵机只需发送1次PWM信号就能转动到某个角度。
    模拟舵机是需要多次发送PWM信号才能够保持在规定的位置上。
    ②模拟舵机存在“无反应区”,对于细微的动作,反应非常迟钝,或者没有动作。
    数字舵机的“无反应区”更小,反应速度更快,加速和减速时也更快、更柔和。
    (原因是数字舵机的控制电路比模拟舵机的多了微处理器和晶振)
  3. 使用参数:
    舵机控制一般需要20ms左右的时基脉冲,高电平部分一般为0.5ms-2.5ms范围内的角度控制脉冲部分。总间隔为2ms。(此数据是0-180°的舵机)
0.5ms
1ms 45°
1.5ms 90°
2ms 135 °
2.5ms 180°

需求分析

  1. 需求:
    舵机通过PWM波型来控制,我们想要的是给舵机一个角度,让它自己转换成占空比。
  2. 实现:
    如下图所示:脉冲周期是20ms,高电平部分是2.5ms,表示180°。
    上文已提到(0°到180°)对应着(0.5ms-2.5ms)。
    假设角度为A,则A角度所占时间的比例为:(A/180)×(2.5-0.5),再加上0°初始时间,A角度所占的时间为0.5+(A/180) ×(2.5-0.5)时间基数是20ms,那么占空比为[0.5+(A/180) ×(2.5-0.5)]/20。
    上面计算的占空比,乘以20ms内总的定时器的计数次数,得到捕获比较寄存器(TIM_Pulse)的脉冲值,也就是A角度所占的定时器计数次数:[0.5+(A/180) ×(2.5-0.5)]/20×10000。10000是本设计设定的计数器的计数次数(详情见下文)。
  3. 分频系数和计数器设置:
    此设计使用的是72M的单片机,分频系数设为(144-1),72000000Hz/144=500000Hz,频率为500K,周期为1/500000=2us。计数次数为(10000-1),也就是10000次,2us×10000=20ms。也就是定时器的周期是20ms。
  4. 误差计算:
    当然定时器周期20ms,还有很多种设法。设计时,计数周期应该尽可能的大,这样计错一次数对舵机角度的影响越小(注意计数周期最大存在上限)。
    0-180°是0.5-2.5ms,量程是2ms,1度约为11.11us。计数器计数一次是2us, 2/11.11约为0.18度。也就是说计数器计数一次,约为0.18°。如果计数器计错一次,误差0.18°。所以本设计的误差0.18°,这对于一般的设计来说完全足够。

代码实现

#include "SG90.h"/*定时器1初始化*/
void TIM1_PWM_Init(u16 arr,u16 psc)
{  GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;                      //TimeBase初始化结构体TIM_OCInitTypeDef  TIM_OCInitStructure;                                 //Time输出比较初始化结构体//使能TIM1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);          //使能Time1时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);       //使能GPIO外设时钟//设置引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;                              GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    //复用推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure); TIM_DeInit(TIM1);  //设置TIM1的ARR和PSCTIM_TimeBaseStructure.TIM_Period = arr;                                //自动重装载寄存器周期的值TIM_TimeBaseStructure.TIM_Prescaler =psc;                                //预分频值TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;      //设置时钟分割:TDTS = Tck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //向上计数模式TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);                     //初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;              //选择定时器比较输出模式:TIM脉冲宽度调制模式2TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;     //输出极性:TIM输出比较极性高TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_Pulse = 750;                                       //初始计数值设为750,以防1度以内抖动TIM_OC2Init(TIM1, &TIM_OCInitStructure);                        //根据TIM_OCInitStruct中指定的参数初始化外设TIMxTIM_Cmd(TIM1, ENABLE);                                       //使能TIM1TIM_CtrlPWMOutputs(TIM1,ENABLE);                                //TIM外设的主输出开关 参数2:TIM外设主输出的新状态TIM_OC2PreloadConfig(TIM1,ENABLE);                             //在CCR1上启用或禁用TIMx外设预加载寄存器    TIM_ARRPreloadConfig(TIM1, ENABLE);                            //在ARR上启用或禁用TIMx外设预加载寄存器
}/*舵机角度控制传入参数:角度
*/
void SERVO_Angle_Control(uint8_t Angle)
{uint16_t temp=0;temp = Angle*50/9 + 250;        //(0.5+(A/180)*(2.5-0.5))/20*10000TIM_SetCompare2(TIM1, temp); //TIM1的通道2,Compare2给了捕获/比较寄存器一个捕获值
}
#include "stm32f10x.h"     // Device header
#include "SG90.h"
#include "Delay.h"uint8_t Anglecount=0;      //定义角度初始值int main(void)
{TIM1_PWM_Init(10000-1,144-1);  SERVO_Angle_Control(0);         //校正舵机while(1){int i=0;SERVO_Angle_Control(0);delay_ms(1000);for(i=0;i<90;i++){SERVO_Angle_Control(i);}SERVO_Angle_Control(90);delay_ms(1000);}
}

MG90S 舵机180°角度驱动相关推荐

  1. STM32CubeMX(09)MG90S舵机驱动实验

    文章目录 前言 一.舵机是什么? 二.STM32CubeMX配置 2.1时钟树配置 2.2定时器配置 2.3生成代码 三.代码编写 四.测试结果 注意: 总结 前言 今天我们来学习使用一下舵机,并用S ...

  2. MG996R舵机180度与360度驱动,ULN2003A步进电机驱动,触控开关控制

    产品类型:MG996R舵机 产品扭矩:9kg/cm(4.8V),11kg/cm(6V) 产品速度:0.19秒/60°(4.8V),0.18秒/60°(6V)   #0.19/60=0.0032s/度 ...

  3. MG90S舵机-基础角度控制

    MG90S舵机 1. 简介 舵机即可以通过输入指定占空比的PWM实现输出固定角度偏转的电机,通过调节输入的PWM波的占空比可以实现舵机不同角度的偏转 不同型号的舵机可实现偏转的角度不同,比如此次使用到 ...

  4. stc8a控制MG90S舵机

    1.实验目的: 利用硬件PWM进行控制舵机: 硬件PWM使用P6端口: 2.实验设备: 单片机开发板stc8a8k最小核心板: 7pin的OLED MG90S舵机: 3.原理: 舵机的控制原理, 舵机 ...

  5. 51单片机控制SG90舵机、MG90S舵机

    舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0-180度,呈线性变化.也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应 ...

  6. STM32F407学习笔记——MG90S舵机模块(基本控制)

    STM32F407学习笔记--MG90S舵机模块(基本控制) 一.基本原理: 通过改变PWM占空比来实现舵机进行不同角度转动,下面给出旋转角度与脉冲时间及对应占空比的关系(时基脉冲=20ms). 旋转 ...

  7. pwm控制舵机转动角度程序_01 舵机旋转控制基础

    从今天开始,我们将学习Python代码控制舵机专题.第一节课我们将学习舵机的旋转控制基础,探究180度舵机的图形化编程控制. 一.舵机 1.舵机简介 舵机也叫伺服电机,最早用于船舶上实现其转向功能,由 ...

  8. pwm控制舵机转动角度程序_舵机的内部结构及工作原理

    一.舵机实物图 舵机是机器人旋转关节中的常用部件,尤其是小型机器人.其实物就像下面这张图,相信大家都不会陌生.大家一定见过春晚上哪个跳舞的小机器人,其全身各关节都是有舵机组成.我们常见到的舵机就是这个 ...

  9. 舵机任意角度程序_【舵机初动】基于Mind+ Ardunio入门教程10

    点击上方"蘑菇云创造"可以关注我们哦 本项目要接触到舵机.舵机是一种电机,它使用一个反馈系统来控制电机的位置.可以很好掌握电机角度.大多数舵机是可以最大旋转180°的.也有一些能转 ...

最新文章

  1. 腾讯林衍凯:图神经网络,考虑「拓扑信息」会怎样?
  2. Uva 11396 爪分解
  3. Vue之通过连接数据库的接口获取列表实现添加删除功能
  4. JAVA类的继承、覆写和final关键字
  5. lombok有参构造注解_Java高效开发工具: Lombok
  6. 程序员面试 IT 公司,这些细节一定要注意!
  7. SDL附着window窗口的方法
  8. p12解析流程_iOS证书及描述文件制作流程详解
  9. mysql动态函数库_mysql自定义函数与动态查询
  10. .xls和.xlsx 有什么区别?
  11. Qt-添加软件图标(logo)
  12. matlab遗传算法配送路径,基于遗传算法的生鲜配送的路径优化问题
  13. 也许你会用到的58个硬件面试题!
  14. 大学物理(英文版)笔记 chapter1 Measurement
  15. 人生理财规划必备的“四笔钱”,你知道吗?
  16. CUTEFTP 权限的修改 之CuteFTP问题 修复CUTEFTP unable to transfer
  17. 8.1 子模块分析之IDMAC
  18. 基于Android平台的ffmpeg编译
  19. jmeter 阶梯式加压
  20. tcmalloc浅析

热门文章

  1. 5.5G,运营商能接受吗?
  2. CSS背景图拉伸不变形
  3. java毕业设计动漫网站Mybatis+系统+数据库+调试部署
  4. 惊喜Skr人,Istio的创始人Shriram Rajagopalan手把手教你如何使用Istio
  5. 个别网页打不开怎么办
  6. 数据离散程度的衡量指标
  7. 关于std::abs 和 abs在ACM中的避坑
  8. 第118章 SQL函数 REVERSE
  9. 我喜欢这个世界,我喜欢人
  10. 我只喜欢你,我不去爱你