国外课栈 - 国外电子信息技术视角栈

FPGA微型板Verilog实现PWM和伺服电机

 二维码 74
文章附图

PWM介绍

下图显示了PWM的工作原理。 如果脉冲很短(例如,仅在5%的时间内为高),则每个脉冲仅传递少量能量。 脉冲越长,向负载提供的能量就越多。 在为电动机供电时,这将控制电动机的旋转速度。 使用PWM驱动LED时,亮度似乎会发生变化。 实际上,LED每秒可以打开和关闭数百万次,因此PWM脉冲将变成光脉冲。

PWM输出为高电平的时间百分比称为占空比。 在实践中,比起百分比,更常见的是将占空比表示为介于0和2的幂乘以1的上限之间的值。非常常见的范围是0到255,其中0完全关闭, 255一直打开。

PWM Verilog模块

实施PWM模块非常容易。 您使用一个计数器,并将其值与计数器进行比较。 如果计数器低于占空比值,则输出为高电平;如果不正确,则输出为低电平。

PWM模块仅称为“ pwm”,具有两个输入pwm_clk和duty。 它的单个输出PWM_PIN将连接到需要PWM输出的GPIO引脚:

pwm_clk输入与FPGA的系统范围时钟不同。常见的PWM频率范围是500 Hz至几千赫兹。 上述PWM模块使用8位计数器,因此pwm_clk的频率需要为所需PWM频率的256倍。 当您测试模块时,您将看到如何使用预分频器计数器得出较低的时钟频率以用于PWM模块。

PWM模块的其余代码如下:

8位计数器计数随pwm_clk信号的上升沿递增。 然后将输出PWM_PIN设置为(计数<占空比)的结果。 换句话说,如果count小于占空比,则PWM_PIN将为1;否则,PWM_PIN将变为1。 否则为0。

在本文中,用于测试PWM模块的模块要比pwm模块本身复杂得多。 当您按下“向上”和“向下”按钮时,它将改变LED的亮度。

测试仪模块具有系统时钟(CLK)的输入和两个开关引脚,用于上下改变LED的亮度。 输出将链接到要更改其亮度的LED。 测试器模块的代码包含在文件pwm_tester.v中:

连线和去抖模块的定义现在应该以一种熟悉的方式进行:

寄存器占空比用于保持占空比值(0至255),该值将使用“ Up”和“ Down”按钮进行设置。

pwm模块实例使用预分频器的位6的输出将pwm_clk输入提供给PWM模块:

测试仪模块的always块会增加预分频器,然后检查是否有按下开关。 按下“ Up”和“ Down”开关可将占空比值增加或减少5:

为了使Verilog保持简单,没有测试检查占空比的值是否超过255。如果确实如此,它将被自动换行,因为只有8位用于占空比,最大范围为255。

生成项目的位文件,然后将其加载到板上。 您将看到“向上”和“向下”按钮如何增加和减少LED的亮度。 如果您想了解PWM的工作原理,请尝试将整个过程放慢约1000倍。为此,请更改pwm_tester.v的第13和14行,向预分频器计数器添加另外10个级。 更改在此处以粗体突出显示:

伺服电机

伺服电动机(下图)是电动机,变速箱和传感器的组合,通常在远程控制车辆中使用它们来控制远程控制飞机和直升机上的转向或表面角度。

除非它们是专用伺服电机,否则它们不会连续旋转。 它们通常仅旋转大约180度,但是可以通过发送脉冲流将它们精确地设置到任何位置。 下图显示了一个伺服电动机,并显示了脉冲的长度如何确定伺服电动机的位置。

伺服电机具有三个连接:GND,正电源(5至6 V)和控制连接。 GND连接通常连接到棕色或黑色引线,正极连接到红色引线,控制连接到橙色或黄色引线。

尽管电动机可以消耗相当大的电流,但控制连接所消耗的电流却很小。 伺服电机预计每20毫秒左右接收一次脉冲。 如果脉冲持续时间为1.5毫秒,则伺服器将位于其中间位置。 如果脉冲较短,则它将稳定在一侧的位置,如果脉冲较长,则将移动至中心位置的另一侧的位置。

硬件

尽管可以通过FPGA的5 V电源为至少一个小型伺服电机供电,但最好使用单独的电源,因为较大的启动电流会导致FPGA复位。

连接

伺服Verilog模块

伺服模块本身位于文件Servo.v中,尽管所有三块板的时钟速度不同,但实际上它们是相同的。

模块具有CLK和pulse_len的输入。 输入pulse_len是脉冲的持续时间(以微秒为单位)。 这是一个16位数字,最大持续时间为65,536μs(65 ms)。 假设脉冲将每20 ms到达一次,这实际上远远超出了伺服器要求1到2 ms之间的脉冲所需要的数量。 这使您可以将此模块用于高分辨率PWM。

模块输出CONTROL_PIN将携带一系列脉冲:

为了解决由于FPGA板的不同时钟速度而导致时序混乱的问题,使用了一个参数。 这与模块的输入和输出参数的不同之处在于,它是在合成项目(生成的位文件)时而不是在实际运行时进行评估的。 您可以这样声明一个参数:

两个16位寄存器,预分频器和计数器,用于控制脉冲时序:

always模块与FPGA的时钟同步,第一步是在预分频器上加1。 预分频器将每微秒达到参数CLK_F-1的值。 这样做时,预分频器将被重置,然后将1加到count。 然后,将控制引脚设置为与pulse_len比较计数的结果。

为了保持20毫秒的脉冲长度,当计数达到19,999时,也将其重置:

两种测试程序都提供0.5到2.5毫秒范围内的脉冲,该范围比标准伺服脉冲范围稍宽,因此您会发现该范围末端的伺服器可能存在一些抖动。 使用更宽的范围确实可以使伺服电机使用最大旋转范围。

该测试程序在操作上与PWM测试程序非常相似。 主要要注意的是,在实例化伺服模块的地方,使用文本#(12)将伺服模块的CLK_F参数覆盖为值12。如果您有多个参数,则这些值将以逗号分隔。

源码

阅读完整文档

文章分类: 嵌入式VerilogFPGA
分享到: