精华内容
下载资源
问答
  • 基于STM32的MG995舵机程序,适合该型号舵机的基础学习(适合新手)
  • 基于51单片机控制mg995舵机仿真设计资料 包含源程序仿真文件
  • MG995舵机工作原理及基于STM32的驱动源代码

    万次阅读 多人点赞 2018-01-29 14:55:43
    MG995舵机工作原理及基于STM32的驱动源代码 一·MG995舵机工作原理 1.MG995舵机简介 产品型号 MG995 产品尺寸 40.7*19.7*42.9mm 产品重量 55g 工作扭矩 13KG/cm 反应转速 53-62R/M 使用温度 -30~+60° ...

    MG995舵机工作原理及基于STM32的驱动源代码

    一·MG995舵机工作原理

    1.MG995舵机简介

    产品型号 MG995
    产品尺寸 40.7*19.7*42.9mm
    产品重量 55g
    工作扭矩 13KG/cm
    反应转速 53-62R/M
    使用温度 -30~+60°
    死区设定 4微秒
    插头类型 JR、FUTABA通用
    转动角度 最大180度
    舵机类型 模拟舵机
    工作电流 100mA
    使用电压 3-7.2V
    结构材质 金属铜齿、空心杯电机、双滚珠轴承 无负载
    操作速度 0.17秒/60度(4.8V);0.13秒/60度(6.0V)
    附件包含 舵盘、线长 30CM、固定螺钉、减振胶套及铝套等附件
    适用范围 1:10和1:8平跑车、越野车、卡车、大脚车、攀爬车、双足机器人、机械手、遥控船,适合50级-90级甲醇固定翼飞机以及26cc-50cc汽油固定翼飞机等模型。
    这里写图片描述

    2.舵机接线

    舵机上有三根线,分别为VCC、GND、信号线。控制信号一般要求周期为20ms的PWM信号。VCC、GND需要另外接驱动给舵机供电,而且得和开发板共地。
    这里写图片描述
    中间的永远是电源正极。

    3.控制原理

    舵机的控制一般需要一个20ms的时基脉冲,该脉冲的高电平部分一般为0.5ms~2.5ms范围内的角度控制脉冲部分。以180度角度舵机为例,那么对应的控制关系是这样的:
    0.5ms————–0度;
    1.0ms————45度;
    1.5ms————90度;
    2.0ms———–135度;
    2.5ms———–180度;
    这里写图片描述

    二·基于STM32的驱动源代码

    1.主函数

    #include "led.h"
    #include "delay.h"
    #include "sys.h"
    #include "pwm.h"
     int main(void)
     {    
        delay_init();            //延时函数初始化    
        LED_Init();         //初始化与LED连接的硬件接口
        TIM1_PWM_Init(199,7199);//(7200*200)/72000000=0.02=20ms
        while(1)
        {   
        TIM_SetCompare1(TIM1,190); //45度,1ms
         delay_ms(1000); 
        TIM_SetCompare1(TIM1,185); //90,1.5ms
         delay_ms(0100);        
        } 
    }
    

    二·PWM初始化

    void TIM1_PWM_Init(u16 arr,u16 psc)
    {  
         GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);// 
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE);  //使能GPIO外设时钟使能
       //设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //TIM_CH1
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
      TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值  80K
      TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频
      TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
      TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
      TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据     TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
      TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
      TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
      TIM_OCInitStructure.TIM_Pulse = 0; //设置待装入捕获比较寄存器的脉冲值
      TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
      TIM_OC1Init(TIM1, &TIM_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
      TIM_CtrlPWMOutputs(TIM1,ENABLE);  //MOE 主输出使能 
      TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);  //CH1预装载使能     
      TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIMx在ARR上的预装载寄存器
      TIM_Cmd(TIM1, ENABLE);  //使能TIM1
    }
    

    2018.8.30更 。。。。。
    前面的程序给的注释有点少,我想大家既然做到舵机了,对PWM应该比较清楚了,
    不过在此我还是多罗嗦几句:
    ① 建议你看一看STM32手册关于定时器的部分。
    ② 占空比是指在一个脉冲循环内,通电时间相对于总时间所占的比例。
    ③ 函数 TIM_SetCompare1 的作用是设置 TIMx 捕获比较 1 寄存器值(注意不一定是设置高电平的时间)
    ④ 文中我采用了TIM向上计数模式,且设置TIM输出比较极性高。(即当前捕获/比较寄存器值同计数器TIMx_CNT比较,当比较匹配之后输出口输出高电平,即从190匹配以后,占空比为(200-190)/200,占空比为5%,PWM周期为20ms, 则20ms*5%=1ms)
    附源代码下载地址:https://download.csdn.net/download/he__yuan/10229647

    展开全文
  • MG995基于STM32的驱动源代码,亲测,效果很好。~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • stm32f407对mg995舵机的控制,角度范围为0-180度,可通过按键来调整pwm占空比,进而对舵机转动角度进行控制;也可以通过串口通信设置转动角度
  • 我写的程序可以驱动s3003和sg90,但是驱动不了mg995,按照网上的很多说法也修改了程序和硬件,但是舵机就是不转,求大神帮忙,小弟感激不尽
  • MG995舵机控制

    千次阅读 2013-07-10 21:08:00
    左右按键,单次旋转15度。锁相环不分频、倍频,只是为了锁定频率。KEY_M键旋转到中间位置。 舵机的控制脉冲是0.5ms~2.5ms,1.5ms时居中,但是会存在一定的偏差。 1 //==================... 2 //Module: MG995 ...

    左右按键,单次旋转15度。锁相环不分频、倍频,只是为了锁定频率。KEY_M键旋转到中间位置。

    舵机的控制脉冲是0.5ms~2.5ms,1.5ms时居中,但是会存在一定的偏差。

      1 //=============================================================================
      2 //Module:    MG995
      3 //Author:    YangFei
      4 //Date:        2013-7-7
      5 //E-mail:    646874160@qq.com
      6 //Function:    Steering Engine control
      7 //=============================================================================
      8 `timescale    1ns/1ns
      9 module    MG995_15D(
     10         EXT_CLK,    //external clock = 50MHz = 20us
     11         RST_N,        //low enable
     12         KEY_L,        //trun left
     13         KEY_M,        //trun middle
     14         KEY_R,        //trun right
     15         PWM_OUT_H,    //horizontal
     16 //        PWM_OUT_V    //vertical
     17         );
     18 input        EXT_CLK;
     19 input        RST_N;
     20 input        KEY_L;
     21 input        KEY_M;
     22 input        KEY_R;
     23 output        PWM_OUT_H;
     24 //output        PWM_OUT_V;
     25 wire        clk;
     26 //-----------------------------------------------------------------------------
     27 reg    [19:0]    cnt;
     28 always    @(posedge clk or negedge RST_N)
     29 begin
     30     if(!RST_N)
     31         cnt    <=    0;
     32     else if((!KEY_L)||(!KEY_M)||(!KEY_R))
     33     begin
     34         if(cnt>=20'd100_0000-1)    //100_0000*20us=20ms=a cycle
     35             cnt <= 0;
     36         else
     37             cnt    <=    cnt + 1;
     38     end
     39     else
     40         cnt    <=    0;
     41 end
     42 //-----------------------------------------------------------------------------
     43 //  total 185 degree
     44 //-----------------------------------------------------------------------------
     45 //  H 水平方向舵机
     46 /*
     47 wire        out_h_l;    //左  -92.5 degree
     48 wire        out_h_m;    //中    0
     49 wire        out_h_r;    //右  92.5
     50 //    理论值+-偏差
     51 assign        out_h_l = (!KEY_L)?((cnt<25000+7000)?1:0):0;//25000*20us=0.5ms
     52 assign        out_h_m = (!KEY_M)?((cnt<75000+7000)?1:0):0;//75000*20us=1.5ms
     53 assign        out_h_r = (!KEY_R)?((cnt<125000+10100)?1:0):0;//...=2.5ms
     54 assign        PWM_OUT_H = out_h_l|out_h_m|out_h_r;
     55 */
     56 //-----------------------------------------------------------------------------
     57 reg    [31:0]    m_vef;
     58 reg            FLAG;
     59 always    @(posedge clk or negedge RST_N)
     60 begin
     61     if(!RST_N)
     62     begin
     63         m_vef    <=    75000+7000;
     64         FLAG    <=    0;
     65     end
     66     else if(!KEY_L)
     67     begin
     68         if(!FLAG)
     69         begin
     70             if(m_vef<25000+7000)
     71                 m_vef <= 25000+7000;
     72             else
     73                 m_vef <= m_vef -8333;
     74         end
     75         FLAG    <=    1;
     76     end
     77     else if(!KEY_M)
     78     begin
     79         FLAG    <=    0;
     80         m_vef    <=    75000+7000;
     81     end
     82     else if(!KEY_R)
     83     begin
     84         if(!FLAG)
     85         begin
     86             if(m_vef>125000+10100)
     87                 m_vef    <=    125000+10100;
     88             else
     89                 m_vef    <=    m_vef + 8500;//8850;
     90         end
     91         FLAG     <=    1;
     92     end
     93     else
     94         FLAG    <=    0;
     95 end
     96 assign        PWM_OUT_H = (cnt<m_vef)?1'b1:1'b0;
     97 //  V 垂直方向舵机
     98 /*
     99 wire        out_v_l;
    100 wire        out_v_m;
    101 wire        out_v_r;
    102 assign        out_v_l = (!KEY_L)?((cnt<25000+4000)?1:0):0;
    103 assign        out_v_m = (!KEY_M)?((cnt<75000-1000)?1:0):0;
    104 assign        out_v_r = (!KEY_R)?((cnt<125000-5000)?1:0):0;
    105 assign        PWM_OUT_V = out_v_l|out_v_m|out_v_r;
    106 */
    107 pll i_pll(
    108     .inclk0    (EXT_CLK),
    109     .c0        (clk)
    110     );
    111 
    112 endmodule

     


     

    转载于:https://www.cnblogs.com/phelonYang/p/3182842.html

    展开全文
  • 本程序为keil MDK创建的工程,适用于STM32F1系列的芯片,根据角度计算公式,控制舵机任意角度转动(0--180度 MG995舵机)。
  • 本程序为keil MDK创建的工程,适用于STM32F1系列的芯片,根据角度计算公式,控制舵机任意角度转动(0--180度 MG995舵机)。你需要修改time.c里面的引脚定义和PWM重映射。你需要设定什么样的角度,直接调用...
  • 基于fpga的舵机控制(MG995

    千次阅读 2018-12-11 21:01:48
    1、MG995舵机原理 a、这是一款由脉冲控制的舵机,周期为20ms,高脉冲部分所占多少就决定了舵机转动多少度。 b、高脉冲部分与角度关系 0.5ms-------------------0° 1ms---------------------45° 1.5ms------------...

    1、MG995舵机原理
    a、这是一款由脉冲控制的舵机,周期为20ms,高脉冲部分所占多少就决定了舵机转动多少度。
    网上找的动图,如果有冒犯,望见谅
    b、高脉冲部分与角度关系
    0.5ms-------------------0°
    1ms---------------------45°
    1.5ms-------------------90°
    2ms----------------------135°
    2.5ms-------------------180°
    2、设计需求
    通过按键控制舵机的转动角度,并且有数码管可判断当前转动角度。

    代码部分
    
    module  pwm_cont(
    				clk,
    				rst_n,
    				da_in,
    				pwm_out
    );
    
    input					clk;
    input					rst_n;
    input   [3:0]   	da_in;
    output	reg		pwm_out;
    
    parameter      s=1000_000,//20ms-----T
    					s0=125_000,//2.5ms----180
    					s1=100_000,//2ms-----135
    					s2=75_000,//1.5ms----90
    					s3=50_000,//1ms-----45
    					s4=25_000;//0.5ms---0
    					
    reg	[31:0]   cnt_r;	
    reg	[31:0]	cnt;				
    reg 	[3:0]    da_in_r;
    always@(posedge clk or negedge rst_n)begin
    	if(!rst_n)
    		da_in_r <= 4'd0;
    	else
    		da_in_r <= da_in;
    end
    
    always@(*)begin
    	if(!rst_n)
    		cnt_r <= 31'd0;
    	else
    		begin
    			case(da_in_r)
    				4'd0: cnt_r <= s0;
    				4'd1: cnt_r <= s1;
    				4'd2: cnt_r <= s2;
    				4'd3: cnt_r <= s3;
    				4'd4: cnt_r <= s4;
    				default: cnt_r <= s0;
    			endcase
    		end
    end
    
    always@(posedge clk or negedge rst_n)begin
    	if(!rst_n)
    		cnt <= 31'd0;
    	else if(cnt >= s)
    		cnt <= 31'd0;
    	else
    		cnt <= cnt + 1'b1;
    end
    
    always@(posedge clk or negedge rst_n)begin
    	if(!rst_n)
    		pwm_out <= 1'b0;
    	else if(cnt <= cnt_r)
    		pwm_out <= 1'b1;
    	else
    		pwm_out <= 1'b0;
    end
    endmodule
    

    以下的是我工程的RTL视图。这个思路我亲自验证过,可以用的噢。
    所有模块RTL视图
    我给出了pwm控制模块,至于按键模块和数码管模块需要大家自己去写。因为我自己的板子数码管可能跟你们的不一样。如果有什么地方不懂的,大家可以留言讨论噢。。。。。。。

    展开全文
  • 使用 MG995 R 伺服电机模拟单轴太阳能跟踪器。 伺服电机的传递函数模型已被模拟
  • 使用NodeMCU V3 / ESP8266和MG995伺服器进行DIY智能百叶窗。 与SmartThings集成。 注意:本代码中我已实现零安全性。 自行承担使用风险 部分 美元 -$ 3.08 微型USB电缆 改装伺服器以使其连续旋转 MG995伺服只能...
  • mg995舵机控制程序

    热门讨论 2013-05-04 10:18:56
    /**************************************** 舵机转角90度 *************************************/ void t1() { while(1) { if(count1==41) { …… /************************************* ...
  • MG995舵机解决防抖问题 下面留下代码和说明 import multiprocessing as mp import time import RPi.GPIO as GPIO def gpio_init(): #初始化GPIO,设置初始角和信号输出口36 global pwm global num_ global ...

    MG995舵机解决防抖问题

    下面留下代码和说明

    import multiprocessing as mp
    import time
    import RPi.GPIO as GPIO
    
    def gpio_init():  #初始化GPIO,设置初始角和信号输出口36
        
        global pwm
        global num_
        global angle
        angle = 90
        num_ = 0
        GPIO.setmode(GPIO.BOARD)
        GPIO.setup(40,GPIO.IN)
        GPIO.setup(36, GPIO.OUT)
        pwm = GPIO.PWM(36, 50)
        pwm.start(10 / 180 * 90 + 2)
        pwm.ChangeDutyCycle(0)  #清空占空比,这句是防抖关键句,如果没有这句,舵机会狂抖不止
    
    def show_cap(): #死循环
        while(1):
            if GPIO.input(40):
                break
                
    def setDirection(direction):  
        duty = 10 / 180 * direction + 2
        pwm.ChangeDutyCycle(duty)
        print("direction =", direction, "-> duty =", duty)   
        time.sleep(0.04) #等待控制周期结束
        pwm.ChangeDutyCycle(0)   #清空占空比,这句是防抖关键句,如果没有这句,舵机会狂抖不止
        
    def runrun():
    
        gpio_init()
        show_cap()
        GPIO.cleanup()
        
    if __name__=='__main__':
    
        runrun()
    

    下面两句是防抖的关键句:

      time.sleep(0.04) #等待控制周期结束,舵机的控制周期是20ms,但是不知道为什么要等0.04ms才不会抖
      pwm.ChangeDutyCycle(0)   #清空占空比,这句是防抖关键句,如果没有这句,舵机会狂抖不止
    

    至此就结束了,希望可以帮到你!

    展开全文
  • 3、舵机模块 mg995 直流电机 + 控制电路 3.1 驱动程序  mg995有三条线:  电源线  GND线  控制线  要想控制舵机,就是操作控制线,只需要控制这一根。  控制线连接到CPU特定的管脚上去    '编程...
  • MG995 C语言控制程序

    2014-02-09 23:32:34
    本例程适用于SG5010舵机测试 希望对大家有用!
  • OpenMV4驱动mg995舵机

    2021-02-19 13:33:21
    ch.pulse_width_percent(5) #配置通道占空比 time.sleep(1000) ch.pulse_width_percent(7.5) #配置通道占空比 time.sleep(1000) mg995舵机简单来说就是输入50Hz(周期20ms)的PWM信号,4.8-7.2V供电,一般用5v供电...
  • stm32之MG995舵机+原理+程序+详解

    千次阅读 多人点赞 2020-10-07 15:59:54
    舵机参数 产品型号 MG995 产品重量 55g 工作扭矩 13KG/cm 反应转速 53-62R/M 使用温度 -30~+60° 死区设定 4微秒 插头类型 JR、FUTABA通用 转动角度 最大180度 舵机类型 模拟舵机 工作电流 100mA 使用电压 3-7.2V ...
  • 原理解释 使用50Hz的不同占空比的PWM波来控制舵机 舵机的控制一般需要一个20ms 50Hz的脉冲,角度对应如下: t = 0.5ms——————-舵机会转动 0 ° t = 1.0ms——————-舵机会转动 45° t = 1.5ms——————-...
  • 非常不错的舵机学习资料,从模拟舵机和数字舵机的基本使用方法和原理,再到舵机内部的机械和电路原理的进行了详细的解释说明,图文并茂。
  • 应为TIM都用光了,只能使用GPIO,使用GPIO 好处就是很好移植。程序如下: 省略GPIO等初始化。PIN设置为 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;...
  • 板球系统2017电赛B题

    2018-07-16 19:43:10
    没怎么做好,思路大概这样,自己无聊做的,思路可以参考,OV7725摄像头,MG995R舵机,32 f1系列

空空如也

空空如也

1 2 3 4 5 ... 9
收藏数 164
精华内容 65
关键字:

MG995