查看: 302|回复: 0

[原创] 【学习笔记Ⅴ】基于FPGA的机器人舵机控制

[复制链接]

5

主题

1

好友

135

积分

童生

Rank: 2

  • TA的每日心情

    2016-11-3 20:21
  • 签到天数: 12 天

    [LV.3]偶尔看看II

    发表于 2016-8-20 19:31:58 |显示全部楼层
    本帖最后由 叫我小杜可好 于 2016-8-20 19:34 编辑

    原理


    舵机.jpg


         控制信号由接收机的通道进入信号调制芯片,获得直流偏置电压。它内部有一个基准电路,产生周期为20ms,宽度为1.5ms的基准信号,将获得的直流偏置电压与电位器的电压比较,获得电压差输出。最后,电压差的正负输出到电机驱动芯片决定电机的正反转。当电机转速一定时,通过级联减速齿轮带动电位器旋转,使得电压差为0,电机停止转动。
    舵机.gif


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

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

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

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

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

    代码
    1. `timescale 1ns / 1ps
    2. //////////////////////////////////////////////////////////////////////////////////
    3. // Company: UJS
    4. // Engineer: Doby
    5. //
    6. // Create Date:    14:07:42 08/20/2016
    7. // Design Name:         SMG
    8. // Module Name:    SMG
    9. // Project Name:         SMG
    10. // Target Devices:         ?EP4CE10F17C8
    11. // Tool versions:
    12. // Description:
    13. //
    14. // Dependencies:
    15. //
    16. // Revision:
    17. // Revision 0.01 - File Created
    18. // Additional Comments:
    19. //
    20. //////////////////////////////////////////////////////////////////////////////////
    21. module servo_one(
    22.                                 input                        wire                        sclk,
    23.                                 input                        wire                        rst,
    24.                                // input                        wire[7:0]        angle_one,
    25.                                // input                        wire[2:0]        Option_Key,
    26.                                 output                wire                        servo_one_pwm
    27.                                 );
    28.                                                 
    29.          reg [19:0]System_Seg;//产生 20ms的方波
    30.         
    31.     always @ ( posedge sclk or negedge rst )
    32.              if( !rst )
    33.                       System_Seg <= 20'd0;
    34.                   else if( System_Seg == 20'd999999 )
    35.                       System_Seg <= 8'd0;
    36.                   else
    37.                       System_Seg <= System_Seg + 1'b1;
    38.                                 
    39. //------控制舵机来回转动-------------------                                
    40.          wire[19:0]Option_Seg;
    41.          reg[7:0]        data;
    42.          reg[24:0]        cnt;
    43.          reg        plus;
    44.          always@(posedge        sclk        or        negedge        rst)
    45.                 if(!rst)
    46.                                 data<=8'b0;
    47.                 else        if(cnt==25'd250000)
    48.                         begin
    49.                                         if(plus)
    50.                                                 data<=data+8'b1;
    51.                                         else        
    52.                                                 data<=data-8'b1;
    53.                         end
    54.                         
    55.         always@(posedge        sclk        or        negedge        rst)
    56.                 if(!rst)
    57.                         plus<=1'b1;
    58.                 else        if(data==8'b0)
    59.                         plus<=1'b1;
    60.                 else        if(data==8'd150)
    61.                         plus<=1'b0;
    62.                         
    63.                         always@(posedge        sclk        or        negedge        rst)
    64.                                 if(!rst)
    65.                                         cnt<=25'd0;
    66.                                 else        if(cnt==25'd250000)
    67.                                         cnt<=25'd0;
    68.                                 else        
    69.                                         cnt<=cnt+1'b1;
    70. //----------------------对舵机的初始角度和转动的步进进行调整                                       
    71.          assign        Option_Seg=19'd30000+data*340;                                
    72. //---------------------产生20MS的PWM波         
    73.     assign servo_one_pwm = ( System_Seg < Option_Seg ) ? 1'b1 : 1'b0;
    74.         
    75.         
    76.         
    77. endmodule
    复制代码
    效果

    机械手

    机械手


    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    关闭

    站长推荐上一条 /6 下一条


    手机版|爱板网 |网站地图  

    GMT+8, 2016-12-6 22:08 , Processed in 0.130407 second(s), 11 queries , Memcache On.

    苏公网安备 32059002001056号

    Powered by Discuz!

    回顶部