远程控制伺服马达
FPGA也适合用来控制“远程控制伺服马达”( R/C Servos)
什么是远程伺服马达?
“远程控制伺服马达”由有电动机和一系列安装在盒子里的齿轮组成。此设备有一根转动轴,你可以通过使用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});
完整的代码在
这里 |
文章评论(0条评论)
登录后参与讨论