- 易迪拓培训,专注于微波、射频、天线设计工程师的培养
多路可编程PWM芯片设计
录入:edatop.com 点击:
系统中的H桥驱动电路采用2路脉宽调制器(PWM)信号驱动一个电机来控制其正,反两个方向的运转,且两路信号必须有一定的时间间隔来避免驱动电流过大损害驱动元件。为使其能灵活应用,针对系统要求,PWM控制器应具备以下功能:
3路独立PWM输出,每路输出2个驱动信号,周期、占空比、死区时间可编程,对应10MHz系统时钟,周期为1μs-6.5536ms;
精简地址线,节省外围引脚及地址资源占用;
提供与8/16bits单片机的双向数据接口,内置地址/数据锁存器。
PWM结构规划
在采用自顶向下(Top_Down)正向设计中,芯片的结构划分,规格定制是整个设计中最重要的环节,合理的结构设计将决定整个设计的成败。
PWM输出信号的周期、脉宽、死区时间等参数可以通过加载内部的寄存器来实现,写入PWM芯片的数据分数据字与控制字两部分。由内部控制逻辑模块来处理控制字信息,并译码产生各内部通道内部信息寄存器的片选信号。数据字通过内部数据总线在各通道模块传递PWM的特征信息数据。
芯片内部的各模块通过内部片选结合读写使能完成数据交换。芯片与外围控制器进行数据交换时采用双模式接口(8/16bits),可通过外置选择引脚DataWidth来选配。
芯片的核心是由3个完全独立且相同的通道模块构成。通道内部的数据接口将完成外部读写逻辑(RWLogic)传输到内部数据总线的数据收发工作。PWM周期生成模块(ClkGen)则依据写入的周期信息,输出PWM的周期控制信号。
PWM输出由通道状态机完成,通道接收到PWM信息数据后,进行数据校验,合格的数据将在合适的条件下启动状态机,并在不同的状态下完成PWM输出。不合格的数据将被忽略。
地址/数据锁存则依据通用74LS373的逻辑功能,编写一个完全可替代的L74LS373来实现。
根据总体构建思路,最终的芯片总体结构图如图1所示。
PWM电路结构设计
从图1中开可以看出,PWM主要由模块片选译码、控制逻辑、读写逻辑、通道等四个模块组成,下面简要介绍各部分功能。
模块片选译码模块通过地址信号Addr与片选信号Csb通过组合逻辑电路生成内部各子模块的片选信号。
图1 PWM整体结构图
控制逻辑模块主要产生通道内部Regs(寄存器)片选控制信号、各通道输出控制信号,并完成精简地址线的操作。
每个通道都包含各自独立的4个16bits的Regs—正向信号长度、负向信号长度、死区长度、周期长度,控制字寄存器为8bits,因此整个芯片至少将占用3×4×2+1=25个地址(每个地址存储8bits数据),传统做法则至少需要5根地址线译码,而采用区分数据信息类型(控制字,数据字),则可以精简地址线到2根。相对单片机紧缺的外面地址资源而已,好处是显而易见的。具体来说,通过对写入ControlRegister(控制字寄存器)的值进行分析,结合数据传输宽度生成内部Regs片选控制信号,这样就可以通过控制字信息来完成内部Regs的地址译码,同时反馈被操作的寄存器的信息到RWLogic模块完成8/16bits的数据读写操作。
值得注意的是,由于PWM内部包含3个完全一样的独立通道,因此为了更方便的对控制字进行操作,通过对控制字寄存器的分析,控制逻辑电路将自动将当前被操作通道的控制寄存器信息存储在对应的控制寄存器备份中。这样既方便在编程中灵活的操作各通道,又可避免在读写过程中误修改非相干通道控制信息。
读写逻辑模块用于处理外部数据Data[15:0](包括外部为16位或8位数据总线连接方式)到内部DataInternal[15:0]的转换。
当DataWidth为1,采用16bits的数据传输、当DataWidth为0,采用8bits数据传输。PWM能完成对外部8bits或16bits的信息传输要求,准确的读写内部16bits的Regs,其具体实现方法如下:
采用16bits传输时,内部数据采用16bits传输,因此可以采用每个地址对应16bits数据,每个数据位一一对应的传输方式。
采用8bits传输时,内部数据采用16bits传输,因此通过分析地址的奇偶特性可以确定数据高低字节存放,具体来说通过ControlLogic反馈的字节选择位,读写逻辑电路能够自适应的把16bits的Regs的数据信息分割加载到合适的数据通道上,完成数据的输入输出控制。
为了精简数据线,实现数据的双向流通,本模块通过由片选,读写使能信号控制的双向的三态门接口电路隔离读写信息。
通道是PWM芯片的核心部分,每个通道模块都由3个子模块组成,如图2所示。
图2 通道子模块内部结构图
数据接口模块通过组合通道片选,内部寄存器片选信号及模块读写使能信号产生各寄存器的读写使能信号。读写操作通过三态门与内部数据通道进行数据交换。
写入本模块的寄存器信息将进行数据校验,只有校验合格的数据才能被载入到内部寄存器的一级缓冲器(Buf)中,内部寄存器的一级缓冲器数据将输出到PWMFSM模块,提供PWM的特征数据。
周期信号发生器生成PWM的周期控制信号,其周期长短由数据接口传过来的周期寄存器值(CycleReg)决定。模块通过内部计数器计数时钟,并与CycleReg比对,产生PWM的周期控制信号CycleScale。
状态机产生PWM的核心功能模块。通过加载数据接口模块接收到的通道内部寄存器值,状态机进行运转。状态机模块中包含一个自运转状态机。当符合条件的寄存器值写入通道寄存器后,状态机在CycleScale信号的起始信息引导下,在时钟的上升沿将内部寄存器一级缓冲器写入到本模块中的PWM信息寄存器Buf中,以便在下一个运行周期内载入到PWM的状态机中。
状态机启动后,根据当前状态输出脉冲驱动信号。状态机的转换图如图3所示。状态机的运转流程如下:
复位或停止工作时进入IDLE状态。
在合法的数据写入通道寄存器后,在CycleScale的启始信号被接收后,状态机载入当前的通道内部寄存器缓冲器的值到状态机定时器,并进入正向脉冲状态。准备输出正向电机驱动信号。
在正向脉冲状态下,定时器开始减计数,直到完成正向驱动所需要的时间。并在结束正向驱动的输出后进入死区状态死区。
在死区状态,关闭正向,负向电机驱动信号,并通过定时器等待死区时间结束后进入负向电机驱动状态负向脉冲。
在负向脉冲状态下,定时器开始减计数,直到完成负向驱动所需要的时间。结束负向驱动的输出后进入死区状态死区。
图3 状态机转换图
在死区状态,关闭正向,负向电机驱动信号,并通过定时器等待死区时间结束,然后进入空闲等待状态。等待下一次的启动信号。
PWM编程方法
PWM芯片输出使能由PWMh_b设定:
1: 全局使能输出,为正常工作模式,但各Channel工作模式取决其PWMEN位的值
0: 全局禁止输出,整个芯片不工作。此时芯片进入低功耗模式,时钟被禁止输入到内部通道模块。
PWM芯片控制字寄存器决定当前芯片工作模式,控制字寄存器ControlReg[7:0]: 地址: [A1,A0] = 00
由于控制字寄存器仅有一个,但实际各通道都有一个备份的控制字寄存器来控制对应的通道。因此并不会由于对控制字的操作而影响到无关的通道。
PWMEN: 当芯片全局使能输出时,由此位决定各通道PWM输出使能,当PWMh_b为1时各通道的输出正常工作,当为0时则通道禁止输出。
Channel2Cs: 选通Channel2。使能对Channel2模块的操作,并将控制字信息存储到通道2的备份控制字。
Channel1Cs: 选通Channel1。使能对Channel1模块的操作,并将控制字信息存储到通道1的备份控制字。
Channel0Cs: 选通Channel0。使能对Channel0模块的操作,并将控制字信息存储到通道0的备份控制字。
[B2,B1,B0] : 内部寄存器片选译码。每个通道的PWM内部有8个寄存器地址。通过ChannelX的选通结合[B2,B1,B0]的译码产生内部通道Regs的片选信号。
PWM芯片在上电后,加载时钟,所有通道禁止输出。采样DataWidth来确定外围数据接口的宽度,如果采用16bits传输(DataWidth=1)则Data[15:0]都使用;如果采用8bits传输(DataWidth=0),则仅使用Data[7:0],高8bits需要外接地。
在复位(Reset_b)结束后,片选(Cs_b)有效的情况下,可以对芯片进行读写操作。对通道的一次完整的读写包括写控制字与读写通道寄存器两个过程,写控制字选中通道内寄存器,读写通道寄存器获取通道寄存器信息。仅当合理的数据写入后,在PWMH_b有效(PWMH_b=1)时,PWM内部通道使能输出信号。各通道的输出使能由各通道的控制字寄存器的PWM_EN位决定。
由于采用了控制字自动备份的方式,控制字的编程非常灵活。既可以采用同一个类型的寄存器(不同通道),一起写控制字,亦可同一个通道一块操作。(所有控制字命令都可以在PWM的控制字命令列表查询)
PWM的仿真及验证
PWM的仿真是PWM功能验证的必要环节。利用Modelsim[3]结合脚本文件进行了仿真,并采用89c51结合FPGA验证板对整个设计进行了验证。
ModeslSim仿真需要解决PWM的双向IO端口,PWM的Regs的读写控制时序。
对于双向端口的数据交换,采用读写控制结合三态门可以比较完好的解决。对于大量的Regs读写操作,通过模拟单片机对外围器件的操作。利用Task调用的方式实现。
模拟仿真的结果如图4。
图4 读写操作过程
从图4中,可以看到当采用16bits读写时,各寄存器通过内部DataInternal数据总线的传输过程与电路设计要求完全一致。RWLogic与DataInterface模块的功能完全符合设计预想。
图5 输出结果与程序设定的周期和PWM波形完全一致
从图5中,可以看到PWM输出信号,在ClkGen的CycleScale信号的控制下周期输出编程设定的PWM波形,并能异步响应ChannelHold_b信号的输出控制。
PWM的fpga验证,采用8bits数据接口,89c51[4]做外围控制器(12MHz),对PWM进行操作。为了方便与单片机接口,将74LS373锁存器内置到PWM中。整个数字设计部分见图6。
图6 PWM+L74LS373电路图(与51单片机验证)
通过Synplify Pro编译后的结果显示:
ProjectTopModule : PWMTopFor8051
Estimated Frequency: 72.9 MHz
Total LUTs: 1478 of 4160 (35%)
占用FPGA资源35%。针对51系列的单片机而言,PWM可运行的频率远超过系统频率。因此在读写时序上可以完全保证整个设计的可靠性。
将编译后的pof文件下载到APEX20KE EP20K100E TQ144-2X(Altera) fpga[5]验证板。采用40MHz的FPGA时钟。根据先前软件仿真的步骤,将读写操作转换为单片机程序烧录到单片机。最后的结果通过示波器我们可以清楚的看到实际输出与设计完全一致。芯片采用.35工艺,一次流片成功后,测试结果显示结果非常理想,实现了当初的设计要求。
3路独立PWM输出,每路输出2个驱动信号,周期、占空比、死区时间可编程,对应10MHz系统时钟,周期为1μs-6.5536ms;
精简地址线,节省外围引脚及地址资源占用;
提供与8/16bits单片机的双向数据接口,内置地址/数据锁存器。
PWM结构规划
在采用自顶向下(Top_Down)正向设计中,芯片的结构划分,规格定制是整个设计中最重要的环节,合理的结构设计将决定整个设计的成败。
PWM输出信号的周期、脉宽、死区时间等参数可以通过加载内部的寄存器来实现,写入PWM芯片的数据分数据字与控制字两部分。由内部控制逻辑模块来处理控制字信息,并译码产生各内部通道内部信息寄存器的片选信号。数据字通过内部数据总线在各通道模块传递PWM的特征信息数据。
芯片内部的各模块通过内部片选结合读写使能完成数据交换。芯片与外围控制器进行数据交换时采用双模式接口(8/16bits),可通过外置选择引脚DataWidth来选配。
芯片的核心是由3个完全独立且相同的通道模块构成。通道内部的数据接口将完成外部读写逻辑(RWLogic)传输到内部数据总线的数据收发工作。PWM周期生成模块(ClkGen)则依据写入的周期信息,输出PWM的周期控制信号。
PWM输出由通道状态机完成,通道接收到PWM信息数据后,进行数据校验,合格的数据将在合适的条件下启动状态机,并在不同的状态下完成PWM输出。不合格的数据将被忽略。
地址/数据锁存则依据通用74LS373的逻辑功能,编写一个完全可替代的L74LS373来实现。
根据总体构建思路,最终的芯片总体结构图如图1所示。
PWM电路结构设计
从图1中开可以看出,PWM主要由模块片选译码、控制逻辑、读写逻辑、通道等四个模块组成,下面简要介绍各部分功能。
模块片选译码模块通过地址信号Addr与片选信号Csb通过组合逻辑电路生成内部各子模块的片选信号。
图1 PWM整体结构图
控制逻辑模块主要产生通道内部Regs(寄存器)片选控制信号、各通道输出控制信号,并完成精简地址线的操作。
每个通道都包含各自独立的4个16bits的Regs—正向信号长度、负向信号长度、死区长度、周期长度,控制字寄存器为8bits,因此整个芯片至少将占用3×4×2+1=25个地址(每个地址存储8bits数据),传统做法则至少需要5根地址线译码,而采用区分数据信息类型(控制字,数据字),则可以精简地址线到2根。相对单片机紧缺的外面地址资源而已,好处是显而易见的。具体来说,通过对写入ControlRegister(控制字寄存器)的值进行分析,结合数据传输宽度生成内部Regs片选控制信号,这样就可以通过控制字信息来完成内部Regs的地址译码,同时反馈被操作的寄存器的信息到RWLogic模块完成8/16bits的数据读写操作。
值得注意的是,由于PWM内部包含3个完全一样的独立通道,因此为了更方便的对控制字进行操作,通过对控制字寄存器的分析,控制逻辑电路将自动将当前被操作通道的控制寄存器信息存储在对应的控制寄存器备份中。这样既方便在编程中灵活的操作各通道,又可避免在读写过程中误修改非相干通道控制信息。
读写逻辑模块用于处理外部数据Data[15:0](包括外部为16位或8位数据总线连接方式)到内部DataInternal[15:0]的转换。
当DataWidth为1,采用16bits的数据传输、当DataWidth为0,采用8bits数据传输。PWM能完成对外部8bits或16bits的信息传输要求,准确的读写内部16bits的Regs,其具体实现方法如下:
采用16bits传输时,内部数据采用16bits传输,因此可以采用每个地址对应16bits数据,每个数据位一一对应的传输方式。
采用8bits传输时,内部数据采用16bits传输,因此通过分析地址的奇偶特性可以确定数据高低字节存放,具体来说通过ControlLogic反馈的字节选择位,读写逻辑电路能够自适应的把16bits的Regs的数据信息分割加载到合适的数据通道上,完成数据的输入输出控制。
为了精简数据线,实现数据的双向流通,本模块通过由片选,读写使能信号控制的双向的三态门接口电路隔离读写信息。
通道是PWM芯片的核心部分,每个通道模块都由3个子模块组成,如图2所示。
图2 通道子模块内部结构图
数据接口模块通过组合通道片选,内部寄存器片选信号及模块读写使能信号产生各寄存器的读写使能信号。读写操作通过三态门与内部数据通道进行数据交换。
写入本模块的寄存器信息将进行数据校验,只有校验合格的数据才能被载入到内部寄存器的一级缓冲器(Buf)中,内部寄存器的一级缓冲器数据将输出到PWMFSM模块,提供PWM的特征数据。
周期信号发生器生成PWM的周期控制信号,其周期长短由数据接口传过来的周期寄存器值(CycleReg)决定。模块通过内部计数器计数时钟,并与CycleReg比对,产生PWM的周期控制信号CycleScale。
状态机产生PWM的核心功能模块。通过加载数据接口模块接收到的通道内部寄存器值,状态机进行运转。状态机模块中包含一个自运转状态机。当符合条件的寄存器值写入通道寄存器后,状态机在CycleScale信号的起始信息引导下,在时钟的上升沿将内部寄存器一级缓冲器写入到本模块中的PWM信息寄存器Buf中,以便在下一个运行周期内载入到PWM的状态机中。
状态机启动后,根据当前状态输出脉冲驱动信号。状态机的转换图如图3所示。状态机的运转流程如下:
复位或停止工作时进入IDLE状态。
在合法的数据写入通道寄存器后,在CycleScale的启始信号被接收后,状态机载入当前的通道内部寄存器缓冲器的值到状态机定时器,并进入正向脉冲状态。准备输出正向电机驱动信号。
在正向脉冲状态下,定时器开始减计数,直到完成正向驱动所需要的时间。并在结束正向驱动的输出后进入死区状态死区。
在死区状态,关闭正向,负向电机驱动信号,并通过定时器等待死区时间结束后进入负向电机驱动状态负向脉冲。
在负向脉冲状态下,定时器开始减计数,直到完成负向驱动所需要的时间。结束负向驱动的输出后进入死区状态死区。
图3 状态机转换图
在死区状态,关闭正向,负向电机驱动信号,并通过定时器等待死区时间结束,然后进入空闲等待状态。等待下一次的启动信号。
PWM编程方法
PWM芯片输出使能由PWMh_b设定:
1: 全局使能输出,为正常工作模式,但各Channel工作模式取决其PWMEN位的值
0: 全局禁止输出,整个芯片不工作。此时芯片进入低功耗模式,时钟被禁止输入到内部通道模块。
PWM芯片控制字寄存器决定当前芯片工作模式,控制字寄存器ControlReg[7:0]: 地址: [A1,A0] = 00
由于控制字寄存器仅有一个,但实际各通道都有一个备份的控制字寄存器来控制对应的通道。因此并不会由于对控制字的操作而影响到无关的通道。
PWMEN: 当芯片全局使能输出时,由此位决定各通道PWM输出使能,当PWMh_b为1时各通道的输出正常工作,当为0时则通道禁止输出。
Channel2Cs: 选通Channel2。使能对Channel2模块的操作,并将控制字信息存储到通道2的备份控制字。
Channel1Cs: 选通Channel1。使能对Channel1模块的操作,并将控制字信息存储到通道1的备份控制字。
Channel0Cs: 选通Channel0。使能对Channel0模块的操作,并将控制字信息存储到通道0的备份控制字。
[B2,B1,B0] : 内部寄存器片选译码。每个通道的PWM内部有8个寄存器地址。通过ChannelX的选通结合[B2,B1,B0]的译码产生内部通道Regs的片选信号。
PWM芯片在上电后,加载时钟,所有通道禁止输出。采样DataWidth来确定外围数据接口的宽度,如果采用16bits传输(DataWidth=1)则Data[15:0]都使用;如果采用8bits传输(DataWidth=0),则仅使用Data[7:0],高8bits需要外接地。
在复位(Reset_b)结束后,片选(Cs_b)有效的情况下,可以对芯片进行读写操作。对通道的一次完整的读写包括写控制字与读写通道寄存器两个过程,写控制字选中通道内寄存器,读写通道寄存器获取通道寄存器信息。仅当合理的数据写入后,在PWMH_b有效(PWMH_b=1)时,PWM内部通道使能输出信号。各通道的输出使能由各通道的控制字寄存器的PWM_EN位决定。
由于采用了控制字自动备份的方式,控制字的编程非常灵活。既可以采用同一个类型的寄存器(不同通道),一起写控制字,亦可同一个通道一块操作。(所有控制字命令都可以在PWM的控制字命令列表查询)
PWM的仿真及验证
PWM的仿真是PWM功能验证的必要环节。利用Modelsim[3]结合脚本文件进行了仿真,并采用89c51结合FPGA验证板对整个设计进行了验证。
ModeslSim仿真需要解决PWM的双向IO端口,PWM的Regs的读写控制时序。
对于双向端口的数据交换,采用读写控制结合三态门可以比较完好的解决。对于大量的Regs读写操作,通过模拟单片机对外围器件的操作。利用Task调用的方式实现。
模拟仿真的结果如图4。
图4 读写操作过程
从图4中,可以看到当采用16bits读写时,各寄存器通过内部DataInternal数据总线的传输过程与电路设计要求完全一致。RWLogic与DataInterface模块的功能完全符合设计预想。
图5 输出结果与程序设定的周期和PWM波形完全一致
从图5中,可以看到PWM输出信号,在ClkGen的CycleScale信号的控制下周期输出编程设定的PWM波形,并能异步响应ChannelHold_b信号的输出控制。
PWM的fpga验证,采用8bits数据接口,89c51[4]做外围控制器(12MHz),对PWM进行操作。为了方便与单片机接口,将74LS373锁存器内置到PWM中。整个数字设计部分见图6。
图6 PWM+L74LS373电路图(与51单片机验证)
通过Synplify Pro编译后的结果显示:
ProjectTopModule : PWMTopFor8051
Estimated Frequency: 72.9 MHz
Total LUTs: 1478 of 4160 (35%)
占用FPGA资源35%。针对51系列的单片机而言,PWM可运行的频率远超过系统频率。因此在读写时序上可以完全保证整个设计的可靠性。
将编译后的pof文件下载到APEX20KE EP20K100E TQ144-2X(Altera) fpga[5]验证板。采用40MHz的FPGA时钟。根据先前软件仿真的步骤,将读写操作转换为单片机程序烧录到单片机。最后的结果通过示波器我们可以清楚的看到实际输出与设计完全一致。芯片采用.35工艺,一次流片成功后,测试结果显示结果非常理想,实现了当初的设计要求。
射频工程师养成培训教程套装,助您快速成为一名优秀射频工程师...
射频和天线工程师培训课程详情>>