接口/总线/驱动
开发和测试汽车电子、航空电子设备及数字传感器的工程师和设计师们,经常需要测量和模拟设备所产生的脉冲宽度调制(Pulse Width Modulation, PWM)信号。LabVIEW FPGA模块可以用来为测试测量系统创建PWM接口。与专用的PWM I/O设备不同的是,LabVIEW FPGA允许自定义应用程序的PWM通道特性和行为,并且可以与其它的测量设备集成和同步。
LabVIEW FPGA模块和可重配置的I/O板卡可以用来实现各种自定义接口,其中包括:
- 用于其它测量设备的定时和触发功能
- 数字通信协议
- 开发快速原型或者硬件在环应用中的设备仿真
- AC和DC传感器仿真
除了上述这些应用以外,您还可以使用LabVIEW FPGA来实现脉冲宽度调制(PWM)信号的输入和输出。PWM信号不是仅针对某一类特殊的设备的,而是可以用于各种应用中广泛的测量。本文将告诉您如何使用可重配置的I/O板卡和LabVIEW FPGA模块建立PWM接口。
在传统的方法中,我们使用计数器进行测量和生成PWM信号。然而,为了适应更广泛的计数器应用,硬件的性能和应用程序编程接口(API)做了相应的优化,因而这种优化使得通过传统计数器生成PWM信号的应用程序开发难度变大了。而LabVIEW FPGA允许您使用自定义的硬件和软件接口设计PWM I/O通道,这样就可以很容易地将它们集成到您的测试测量应用中。
脉冲宽度调制(PWM)是一种调制方法,通过使用单个脉冲或者连续脉冲序列的宽度来对一个值进行编码。通常,一个PWM信号使用一个频率恒定且占空比可变的连续方波信号。一个方波的占空比或单个方波脉冲的宽度代表着信号值。该值定义的范围从0到1(或者从0到100%)占空比。这个PWM值对应于一个应用中设定范围的工程值,例如以RPM为单位的一个轮子的转动速度。由于PWM信号的数值范围不是无限的,因此它所对应的工程值也有限定的范围。例如,PWM值从0到1可能对应于传感器从0到8000 RPM。而大于8000的转速值则不能用这个传感器测量。
图1: 脉冲宽度调制(PWM)信号的实例
在下面的例子中,使用一个数字I/O线用来采集PWM信号,然后在FPGA上处理提取PWM值。从本质上讲,程序代码会观察相临的上升和下降边沿,并且基于边沿间的时间差,来确定脉冲宽度和脉冲周期。脉冲宽度除以脉冲周期,我们就可以得到PWM值,并从中可以导出对应的工程值。
下面的程序框图显示了一个简单PWM输入的实现方式。该VI监视数字线的下降和上升边沿,并且测量每对边沿之间的时间差。每个阶段的信号的长度被写入前面板上的簇显示控件中,可以通过上位机应用程序查询。PWM信号的频率和占空比是由上位机应用程序中高低电平持续的时间长度计算得到的。通过在上位机应用程序上进行PWM计算,我们可以减少实现该应用所需的FPGA空间,因此,我们可以在一个板卡上实现更大数量的PWM输入或者其它代码。这也减少了循环运行所需的时间,因而够测量更小的脉冲宽度和脉冲周期。
图2:一个简单的PWM输入
为了进一步优化循环的性能,我们将两次循环间的代码连接起来。在第一次循环中,实现了数字脉冲边沿的检测和时间标记,并将时间标签值传递给一对移位寄存器。在下一次循环中,检索时间标签值并计算脉冲长度,然后将它们写入到前面板上的簇显示控件中,以便上位机应用程序检索。将一项操作任务分割成两个循环执行,可以降低整体的循环周期。我们使用前面板上的簇,以确保高电平长度和低电平长度两个值在相同的时间更新,并由上位机应用程序同时读取。
对于简单的PWM输入,通常可以添加一个锁存器,以增强其功能。该锁存器布尔值用于锁存输出寄存器中当前的读数。VI将一直存储数值,在上位机释放锁存器之前,都不会用新的PWM值更新寄存器。利用该功能,可以通过上位机的锁存操作来控制在特定的时间读取测量值。另一个可选的功能,是基于另一个数字信号或者触发来锁存PWM数值,如来自RTSI/PXI触发总线的脉冲信号。相比于从上位机应用程序锁存读值的方式,此功能可以更好地与外部进程同步。
图3:使用锁存器的简单PWM输入
通常,一个应用程序可能需要在每个PWM信号周期内都读取PWM数值,而不是间歇地读取PWM值或者使用锁存操作。在这种情况下,我们需要在每次循环结束时将PWM数据存储在缓冲区中,而每次循环对应于PWM信号的一个周期。在缓冲区相关的参考范例中,列举了将数据发回到上位机应用程序之前在FPGA上进行数据缓冲存储的过程。
若要测试您的PWM输入,您将需要一个PWM信号发生器。如果您没有合适的信号源,则可以使用FPGA生成的PWM输出信号,如本文中PWM输出部分所述。
参见:
利用LabVIEW FPGA和7831R进行PWM输入
4. 高级PWM输入
在高级PWM输入程序中,PWM值的计算过程从上位机应用程序移到FPGA VI中进行。由于在FPGA上缺乏浮点运算功能,VI将基于测得信号的高低电平,使用整数运算确定PWM值。PWM的数值被返回为一个16位的无符号整数,对应于所有的PWM值。例如,32768对应于0.5或者50%的PWM值。
图4: 高级PWM输入
为了让计算得到的PWM值具有合理的分辨率,时间标签的测量分辨率为16位,从而我们可以使用扩展的32位范围划分两个脉冲长度值。这意味着,相比于使用32位整数的时间标签的简单PWM输入程序来说,它可以测量的脉冲长度是有限的。在每个特定的应用程序中,您可以选择时钟计数函数的时间单位。该函数用于记录PWM信号边沿的时间标签。通过选择时钟计数函数的计数节拍、微秒或者毫秒模式,您可以根据信号的频率,匹配最佳的PWM输入方式。
参见:利用LabVIEW FPGA和7831R进行PWM输入
在一些应用程序中,可能需要监测大量的PWM信号。但是由于FPGA上资源的限制,实施大量的独立的PWM输入可能是不可行的。针对这种情况,一个替代方案是建立一个多路复用的PWM输入,用来在大量可用信号中选择监控有限数量的PWM信号。这种方法类似于一个多路复用器,将许多信号中的某一个切换到输入。对于连接在7831R 可重配置 I/O 板卡的 DIO线上的多个PWM信号,您可以选择其中的一个或几个来进行处理。
下图显示了一个多路复用的PWM输入,上位机应用程序从40个不同的输入信号上作出选择,这些信号来自于7831R板上一个DIO连接器的40条数字线。每一微秒,VI会读取所有40条数字线的信号,分组为5个端口,每个端口包含8条数字线。所有40条数字线的当前状态值通过具有40个元素的布尔数组进行存储,并传递到循环的移位寄存器中。VI处理由Active PWMs控件所选择的PWM信号中的数据。对于每一个被选到的PWM信号,VI会检索当前的和最近的信号状态,并检测信号的上升或者下降边沿。信号中的每个边沿都是带有时间标识的,其信息存储在簇数组中。簇数组中包含每个活动信号的最近边沿的时间标识信息,以及该信号最近的完整高低脉冲的长度。基于每个PWM信号的脉冲长度,上位机应用程序计算每个活动信号的PWM值。
图5:多路复用的PWM输入
根据FPGA上可用的空间,开发者可以设置每次处理的活动PWM信号的数量,具体可以通过设置框图上簇数组常量的数组大小、以及前面板上Active PWMs数组和PWM数据数组的大小来实现。这三个数组都必须有相同数量的元素,对应于活动PWM信号的总数。此外,VI需要能够在设定的循环周期时间内里处理所有的活动PWM信号。如果您增加了活动PWM信号的数量,您可能还需要增加循环时间,为VI提供足够的处理时间。
许多应用程序要求测试系统也能够产生PWM输出。这些信号可以用来模拟在正常的操作环境中与被测设备相连的其它设备。
图6中所示简单的PWM输出程序中,可以设置PWM信号的周期和脉冲宽度。与PWM输入范例程序相似的是,这两个参数都通过指定FPGA的时钟周期(节拍)来实现,虽然也可以选择微秒或者毫秒模式的循环定时器和等待时间参数。
图6: PWM输出
即使您的应用程序中不需要PWM输出,您也可以将输出与输入对接起来,快速地测试和表征您的PWM输入应用程序。利用LabVIEW FPGA,您可以使用一部分程序框图写入一个输出电平到一条数字线路上,并通过另一部分程序框图读取该数字线路,而不需要与外部回路连接。
在需要多个PWM输出的应用程序中,我们可以对简单PWM输出算法进行复制。但是,如果我们有很多的输出信号,这种方法复制了大量的代码,由于FPGA上空间的限制,效率很低。对于多个PWM输出的应用,我们可以设计一个基于多线逻辑的实施方案。下面的程序显示了如何使用一个循环更新8个PWM信号。8条线路都包含在一个数字端口中,而该端口作为一个整体进行更新。
我们使用可重配置板卡上的存储器而不是使用前面板控件来存储每个PWM信号的当前设置,具体可以通过LabVIEW FPGA模块中的存储器扩展通用程序实现。此通用程序允许我们访问更大的内存块,以及访问内存为8-、 16-、或者 32-位的寄存器。使用板载内存来存储PWM设置,极大地减少了该程序所需的FPGA空间量,特别是对额外的输出通道使用多个端口时。在7831R可重配置I/O板卡的一个DIO连接器上,我们可以实施多达40路PWM输出。
下图中上方的循环是用来在上位机应用程序中与FPGA的可用内存进行通信,将PWM设置写入到板卡中。每个PWM输出使用两个内存地址。第一个地址是用来存储以微秒为单位的脉冲宽度;第二个是用来存储脉冲间的暂停宽度,同样是以微秒为单位。这两个值加在一起表示脉冲周期。地址0和1代表第一个PWM输出,地址2和3代表第二个PWM输出,以此类推。
因为我们需要处理下方的循环中所有的PWM输出信号,因此使用循环定时函数进行配置,以1微秒的间隔运行。我们将其编译为按照FPGA的80MHz时钟速率运行,因此需要在80个时钟周期内完成我们所有的处理任务。
在主循环中,我们对状态数组进行保持和更新,数组中存储了每个PWM输出(共计8个)的当前状态和时间,一直到状态发生下一次改变。在主(While)循环内的For循环是用来处理每个单独的PWM输出状态。在主循环的每个周期中,我们递减状态数组中Next Edge的值,直到其达到0。在这种状态的转换下,将从用户内存读取接下来的脉冲或者暂停的长度,并且更新状态数组。For循环也将每个PWM输出的状态整合为一个布尔数组,将其传递到移位寄存器中,并转换为一个8位整数,用于更新数字端口。由于循环是微秒级定时的,该程序的分辨率是以1微秒为单位记录PWM信号的脉冲和暂停周期。
如果在内存缓冲区的PWM设置未经初始化或者设置为0,则PWM线路的输出将设置为低电平。
图7:多路复用的PWM输出
靠近PWM范围两端的值(接近0和1)可能导致很难解调PWM波形,因为它们产生的脉冲宽度极其微小。许多PWM输入设备,包括本文中所述的产品,都有所能够测量的最小和最大的PWM值。
在上述的LabVIEW FPGA PWM 输入应用程序中,我们测量了PWM信号的连续边沿间的时间间隔。由于FPGA本身及其内部时钟的特性,以及个别的应用中的特殊性,都会限制所能测量的最小脉冲宽度。这种限制对于信号的高电平脉冲和低电平脉冲可能会有所变化。可测量的范围是由这些最小脉冲宽度和PWM信号频率(脉冲周期)决定的。
例如,如果在您实施的应用中,最小的可测量的脉冲宽度是5个 FPGA时钟周期,而PWM频率为5 kHz,则可测量的PWM值的范围如下所示:
脉冲宽度:5 * ( 1 / 40MHz ) = 5 * 25ns = 125ns = 0.125us
脉冲周期:1 / 5kHz = 200us
最小PWM值:0.125us / 200 us = 0.000625 = 0.0625%
最大PWM值:1 - 0.000625 = 0.999375 = 99.9375%
(us=微秒)
具体的可测量PWM范围依赖于所实施的应用程序和FPGA时钟速率。因此,确保开发人员知道这些限制,并根据应用程序的需求设计代码,这一点非常重要。
对于PWM输入,当内部的定时器达到其最大值后回零,则会存在另外一个边界条件。在这种情况下,可能导致某一个循环中的脉冲持续时间和周期的计算出现错误。这个错误可以使用一些额外的编程消除,具体可以检查连续的定时值以确定翻转条件,并且暂不更新测量值。
LabVIEW FPGA与可重配置I / O板卡为设计优化适用于每个特定应用的PWM输入和输出功能提供广泛的灵活性。无论是侧重于极端的测量范围,还是侧重易于使用、多路复用输入或者运行并行通道,开发者都可以进行自定义设计,实现最佳性能。将PWM接口与其它信号类型和测量类型相结合,同时,使用内部和外部定时和触发信号将PWM测量同步,可以进一步扩展这些基本模块的应用范围和功能。
全部0条评论
快来发表一下你的评论吧 !