FPGA适用于控制R / C伺服电机。
R / C伺服(“遥控伺服电机”)由一个电机,一些电子设备和一组装在一个小盒子中的齿轮组成。单轴从伺服器出来。您可以通过向伺服器发送脉冲来精确控制轴的旋转角度。轴旋转角度限制为大约270度(它不能旋转一整圈,而只能旋转3/4圈)。
有用的信息链接包括:
R / C Servos用于:
伺服系统有3条线:
白线上的PWM控制脉冲长度需要在1ms到2ms之间。
1.5ms的脉冲使轴在其旋转范围的中间旋转。
即使不需要更改角度位置,也需要定期发送新脉冲(每10到20ms),否则伺服将停止尝试保持该脉冲。
让我们以8位分辨率(256步,从0到255)控制一个伺服器。这意味着我们需要产生一个1ms(0)到2ms(255)的脉冲,分辨率为1ms / 256 = 3.9µs。
分钟
使用25MHz时钟(周期为40ns),第一步是对时钟进行分频,以产生周期的“滴答声”,使其尽可能接近3.9µs。
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;
使用“ ClkTick”,我们实例化一个12位计数器,该计数器在每个滴答处递增。
reg [11:0] PulseCount; always @(posedge clk) if(ClkTick) PulseCount <= PulseCount + 1;
每个滴答持续3.9µs,因此256个滴答持续1ms,12位计数器“ PulseCount”每16ms翻转一次。正是我们需要定期产生新的脉冲。
产生PWM脉冲
当“ PulseCount”等于0时,我们开始每个脉冲。当“ PulseCount”
在256和511之间时,我们结束每个脉冲。这将在1ms和2ms之间产生脉冲。
假设“ RCServo_position”是8位位置值(从0到255),我们在其前面连接一个“ 0001”以创建一个范围为256 ot 511的12位值。最后,我们将这12位与“ PulseCount”进行比较以产生脉冲。
reg RCServo_pulse; always @(posedge clk) RCServo_pulse = (PulseCount < {4'b0001, RCServo_position});
那就是所有人!完整的代码可以在这里找到。
如您所见,控制R / C伺服器所需的硬件很少,因此FPGA可以同时控制多个。