|
远程控制伺服马达 FPGA也适合用来控制“远程控制伺服马达”( R/C Servos) 什么是远程伺服马达? “远程控制伺服马达”由有电动机和一系列安装在盒子里的齿轮组成。此设备有一根转动轴,你可以通过使用PWM(脉宽调制)脉冲来精确控制它的转向。下面是一副它的图片(虽然又旧又破,但是完成了我们的设计目的)。
(图中句子的意思:你可以通过发送脉冲信号到白线上来控制这个轮子的转角) 从下面的连接,可以找到一些有用的参考资料: - 远程控制伺服马达的控制
- 远程控制飞机伺服马达使用指南(A Guide to Using RC Airplane Servos)
- 远程控制伺服马达 101(R/C Servos 101)
- 远程控制伺服马达脉冲的PPM,PCM编码(R/C Servo Pulse, PPM and PCM coding )
他们用在哪里? - 远程控制模块中 (汽车, 飞机等...).
- 机器人技术.
伺服系统的连接 伺服马达有三根线,它们是: - 红色:电源线(+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可以同时控制多个这样的“远程控制伺服马达”。 下面该你们去实践了:)
下一篇链接:FPGA自适应数字频率计
上一篇链接:FPGA实现的步进电机细分控制信号发生器
|