原创 【转】FPGA控制远程控制伺服马达

2010-11-20 09:50 1332 4 4 分类: FPGA/CPLD

远程控制伺服马达
FPGA也适合用来控制“远程控制伺服马达”( R/C Servos)


什么是远程伺服马达?
“远程控制伺服马达”由有电动机和一系列安装在盒子里的齿轮组成。此设备有一根转动轴,你可以通过使用PWM(脉宽调制)脉冲来精确控制它的转向。下面是一副它的图片(虽然又旧又破,但是完成了我们的设计目的)。
 (图中句子的意思:你可以通过发送脉冲信号到白线上来控制这个轮子的转角)
从下面的连接,可以找到一些有用的参考资料:



他们用在哪里?



  • 远程控制模块中 (汽车, 飞机等...).
  • 机器人技术.

伺服系统的连接
伺服马达有三根线,它们是:



  • 红色:电源线(+5V)
  • 黑色:地
  • 白色:转动控制(PWM)

PWM脉冲
    控制脉冲的宽度需要调整在1-2毫秒之间。1.5毫秒宽度的脉冲使得转轴转到其转动范围的中间位置。脉冲信号需要以固定时间间隔(10-20毫秒)发送,即使不需要调整转轴的转向,否则的话,伺服马达将不会再维持转轴原有的转向。


FPGA产生PWM脉冲
让我们以8位(0-255)的精度来控制这个伺服马达。 这意味着我们需要以3.9微秒(1mS/256)的精度控制产生宽度在1-2毫秒之间的PWM脉冲.


时钟分频
考虑使用25MHz的时钟信号(每周期40nS),首先要做的就是将时钟分频产生周期为3.9uS的时钟信号。


parameter ClkDiv = 98; // 25000000/1000/256 = 97.56
reg [6:0] ClkCount;
reg ClkTick;
always @(posedge clk) ClkTick <= (ClkCount==ClkDiv-2);
always @(posedge clk) if(ClkTick) ClkCount <= 0; else ClkCount <= ClkCount + 1;


我们引入一个12位的计数器,用“ClkTick”作为其技术节拍。


reg [11:0] PulseCount;
always @(posedge clk) if(ClkTick) PulseCount <= PulseCount + 1;


    每拍的时间间隔为3.9uS,所以 256 拍一共持续1mS的时间,并且12位的“PulseCount”计数器每16mS会回到初值。正好是我们需要产生新的PWM信号的时间间隔。


产生PWM脉冲
我们在"PulseCount"等于0的时候开始发出脉冲信号,在其等于256到511之间的某个值时停止该脉冲,这样就可以产生宽度在1到2mS之间的脉冲信号。假设"RCServo_position"是一个8位的位置值(0到255),我们在其前补上"0001"得到一个12位的值在256到511之间的新变量。最后,我们将这个12位的变量与“PulseCount”比较来产生脉冲信号。


reg RCServo_pulse;
always @(posedge clk) RCServo_pulse = (PulseCount < {4'b0001, RCServo_position});
完整的代码在

这里

可以看到,仅需要很少的硬件资源就可以控制“远程控制伺服马达”,所以FPGA可以同时控制多个这样的“远程控制伺服马达”。
下面该你们去实践了:)
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条