差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
r_c伺服电机 [2020/07/09 09:54]
zili
r_c伺服电机 [2022/04/26 13:14] (当前版本)
gongyusu
行 1: 行 1:
 ###​R/​C伺服电机 ###​R/​C伺服电机
 +
 +[[RC_servos|R/​C伺服电机]]
 +
 [[https://​www.fpga4fun.com/​RCServos.html|R/​C Servos]]\\ [[https://​www.fpga4fun.com/​RCServos.html|R/​C Servos]]\\
 \\ \\
  
-FPGA适用于控制R / C伺服。 +FPGA适用于控制R / C伺服电机\\ 
- +\\ 
-什么是遥控伺服器? +####什么是遥控伺服器? 
-R / C伺服(“遥控伺服电机”)由一个电机,一些电子设备和一组装在一个小盒子中的齿轮组成。单轴从伺服器出来。您可以通过向伺服器发送脉冲来精确控制轴的旋转角度。轴旋转角度限制为大约270度(它不能旋转一整圈,而只能旋转3/​4圈)。 +\\ 
- +R / C伺服(“遥控伺服电机”)由一个电机,一些电子设备和一组装在一个小盒子中的齿轮组成。单轴从伺服器出来。您可以通过向伺服器发送脉冲来精确控制轴的旋转角度。轴旋转角度限制为大约270度(它不能旋转一整圈,而只能旋转3/​4圈)。\\
-这是一个伺服器的图片(已被咬住,但已说明了我们的目的)。 +
  
 +这是一个伺服器的图片(已被咬住,但已说明了我们的目的)。\\
 +{{ ::servo.jpg |}}
 +\\
  
 有用的信息链接包括: 有用的信息链接包括:
-RC伺服控制 +  * [[http://​www.epanorama.net/​documents/​motor/​rcservos.html|RC伺服控制]] 
-RC飞机伺服系统使用指南 +  * [[http://​www-cdr.stanford.edu/​dynamic/​servo/​|RC飞机伺服系统使用指南]] 
-遥控伺服器101+  * [[http://​www.cs.wisc.edu/​~bolo/​shipyard/​servos101.html|遥控伺服器101]] 
 +\\
 R / C Servos用于: R / C Servos用于:
-在遥控模型中(汽车,飞机...)。 +  * 在遥控模型中(汽车,飞机...)。 
-在机器人技术中。 +  ​* ​在机器人技术中。 
-电气连接和PWM脉冲+\\ 
 + 
 +####电气连接和PWM脉冲
 伺服系统有3条线: 伺服系统有3条线:
-黑色:地面。 +  * 黑色:地面。 
-红色:电源(+ 5V)。 +  ​* ​红色:电源(+ 5V)。 
-白色:旋转控制(使用PWM)。 +  ​* ​白色:旋转控制(使用PWM)。 
-白线上的PWM控制脉冲长度需要在1ms到2ms之间。 +\\ 
-1.5ms的脉冲使轴在其旋转范围的中间旋转。+白线上的PWM控制脉冲长度需要在1ms到2ms之间。\\ 
 +1.5ms的脉冲使轴在其旋转范围的中间旋转。\\ 
 +\\ 
 +即使不需要更改角度位置,也需要定期发送新脉冲(每10到20ms),否则伺服将停止尝试保持该脉冲。\\ 
 +\\
  
-即使不需要更改角度位置,也需要定期发送新脉冲(每10到20ms),否则伺服将停止尝试保持该脉冲。 +####来自FPGA的PWM脉冲 
-来自FPGA的PWM脉冲 +让我们以8位分辨率(256步,从0到255)控制一个伺服器。这意味着我们需要产生一个1ms(0)到2ms(255)的脉冲,分辨率为1ms / 256 = 3.9µs。\\ 
-让我们以8位分辨率(256步,从0到255)控制一个伺服器。这意味着我们需要产生一个1ms(0)到2ms(255)的脉冲,分辨率为1ms / 256 = 3.9µs。 +\\ 
-分钟 +**分钟** 
-使用25MHz时钟(周期为40ns),第一步是对时钟进行分频,以产生周期的“滴答声”,使其尽可能接近3.9µs。+\\ 
 +使用25MHz时钟(周期为40ns),第一步是对时钟进行分频,以产生周期的“滴答声”,使其尽可能接近3.9µs。\\
  
 +<code verilog>
 parameter ClkDiv = 98;    // 25000000/​1000/​256 = 97.56 parameter ClkDiv = 98;    // 25000000/​1000/​256 = 97.56
  
行 39: 行 52:
 always @(posedge clk) ClkTick <= (ClkCount==ClkDiv-2);​ always @(posedge clk) ClkTick <= (ClkCount==ClkDiv-2);​
 always @(posedge clk) if(ClkTick) ClkCount <= 0; else ClkCount <= ClkCount + 1; always @(posedge clk) if(ClkTick) ClkCount <= 0; else ClkCount <= ClkCount + 1;
 +</​code>​
  
 +使用“ ClkTick”,我们实例化一个12位计数器,该计数器在每个滴答处递增。\\
  
-使用“ ClkTick”,我们实例化一个12位计数器,该计数器在每个滴答处递增。 +<code verilog>
 reg [11:0] PulseCount; reg [11:0] PulseCount;
 always @(posedge clk) if(ClkTick) PulseCount <= PulseCount + 1; always @(posedge clk) if(ClkTick) PulseCount <= PulseCount + 1;
 +</​code>​
  
-每个滴答持续3.9µs,因此256个滴答持续1ms,12位计数器“ PulseCount”每16ms翻转一次。正是我们需要定期产生新的脉冲。 +每个滴答持续3.9µs,因此256个滴答持续1ms,12位计数器“ PulseCount”每16ms翻转一次。正是我们需要定期产生新的脉冲。\\ 
-产生PWM脉冲 +\\ 
-当“ PulseCount”等于0时,我们开始每个脉冲。当“ PulseCount” +**产生PWM脉冲** 
-在256和511之间时,我们结束每个脉冲。这将在1ms和2ms之间产生脉冲。 +\\ 
- +当“ PulseCount”等于0时,我们开始每个脉冲。当“ PulseCount”\\ 
-假设“ RCServo_position”是8位位置值(从0到255),我们在其前面连接一个“ 0001”以创建一个范围为256 ot 511的12位值。最后,我们将这12位与“ PulseCount”进行比较以产生脉冲。+在256和511之间时,我们结束每个脉冲。这将在1ms和2ms之间产生脉冲。\\ 
 +\\ 
 +假设“ RCServo_position”是8位位置值(从0到255),我们在其前面连接一个“ 0001”以创建一个范围为256 ot 511的12位值。最后,我们将这12位与“ PulseCount”进行比较以产生脉冲。\\
  
 +<code verilog>
 reg RCServo_pulse;​ reg RCServo_pulse;​
 always @(posedge clk) RCServo_pulse = (PulseCount < {4'​b0001,​ RCServo_position});​ always @(posedge clk) RCServo_pulse = (PulseCount < {4'​b0001,​ RCServo_position});​
 +</​code>​
  
-那就是所有人!完整的代码可以在这里找到。 +那就是所有人!完整的代码可以在[[https://​www.fpga4fun.com/​files/​RCServo.zip|这里]]找到。\\ 
-如您所见,控制R / C伺服器所需的硬件很少,因此FPGA可以同时控制多个。+如您所见,控制R / C伺服器所需的硬件很少,因此FPGA可以同时控制多个。\\ 
 +\\
  
-##​轮到您尝试了!+\\ 
 +###​轮到您尝试了!