HIT电子设计自动化,通过FPGA生成带死区的三相互补SPWM,以双极性的方式驱动三相步进电机。
SPWM生成的基本原理是比较正弦波和三角波的大小,在任意时刻,如果三角波大于正弦波,输出为0;否则输出为1。
该程序的原理是,通过时钟脉冲发生器进行分频,通过在细分波形发生器中查表的方式,生成三组正弦波;在PWM发生器中,将正弦波与三角波比较,生成三组SPWM;最后将SPWM输入死区发生器,生成三组带死区的互补SPWM。
主程序文件位于头文件夹中,调试文件,也就是用于生成波形的文件,位于sin1文件夹中。
- 主程序中的文件包括
SPWM_3Phase.v:顶层模块,在这里将各个主要的子模块实例化,并且连接起来,包括1个时钟脉冲发生器(TimePulGenerator)实例, 1个细分波形发生器(Interface)实例, 3个脉宽调制信号发生器(SPWMGenerator)实例。
TimePulGenerator.v:时钟脉冲发生器模块,用于产生分频信号CP和1个四位Sublevel信号,通过Sublevel可以控制正弦波的采样频率,实现调频的效果。
Interface.vhd:细分波形发生器模块,产生三相正弦波(非PWM),输出3个12位二进制数字量。该模块通过查表生成正弦波,CP控制查表的频率,Sublevel控制查表的分辨率。
BaseCarrior.vhd:锯齿波发生器模块,要求幅度比细分波形发生器模块输出的正弦波略大。
comp.v:比较器模块。
dead.vhd:死区发生器模块,输入PWM,输出一组带死区的互补PWM。
SPWMGenerator.v:脉宽调制信号发生器,通过比较正弦波和三角波的大小来实现SPWM波,再将该SPWM输入死区发生器,即可生成一组互补的SPWM。包括1个锯齿波发生器(BaseCarrior)实例,1个比较器(comp)实例和1个死区发生器(dead)实例。
step_sin.mif:包含正弦波形的数据文件,将该数据文件导入到FPGA的ROM中,来查表生成正弦波。
sin.qip和sin.v:将mif导入ROM后生成的文件,和step_sin.mif配合食用。
- 用于仿真的文件包括:
romtest.v:测试细分波形发生器模块,要求是输出三组相位差为120°的正弦波。
testCarrior.v:测试载波发生器模块,生成锯齿波。
testSPWMGenerator.v:测试脉宽调制信号发生器模块,生成单相SPWM波。
testTimePlustGen.v:测试时钟脉冲发生器模块。
testSPWM3Phase.v:测试顶层模块,能生成三相互补SPWM,而且能够根据输入调节参数。
这是使用Quartus (Quartus Prime 17.1) Lite Edition 创建的工程,工程文件为SPWM_3Phase.qpf。
仿真使用的是ModelSim SE-64 10.4,工程文件为sim1.mpf。
如果不能直接打开工程文件,那么新建工程,将子模块全部导入然后编译也是可行的,很简单。
关于如何将mif文件导入到ROM中并且实例化,参考教程: https://www.cnblogs.com/BitArt/archive/2012/12/16/2819347.html
-
这个工程还没有分配引脚,需要自行分配。
-
需要修改一下芯片。
-
Modelsim的低版本不支持Verilog HDL和VHDL联合仿真,需要选择一个较高的版本。
-
最初仿真细分波形发生器模块的时候,出不来正弦波,输出一直是高阻态,查了半天资料,发现这是由于在ModelSim的工程中添加了sin_bb.v这个工程导致的。将该文件移出Modelsim工程,输出低电平,提示找不到step_sin.mif这个文件。将这个文件复制到sim1目录下,问题解决。
-
需要注意的是,读取step_sin.mif文件中的数据,似乎需要向ModelSim里面添加一些库,否则会报ERROR,细节已经忘记了,自行百度吧。
-
vhdl文件都是老师和学长们造的轮子,原本的轮子中RST=1代表复位,已经改为了RST=0代表复位。
-
原本的Interface.vhd生成的三组正弦波相位差不是120°,经过检查以后发现原本的程序时序存在问题,已经改过来了。
最后感谢这门课的指导老师和学长们造的轮子,还是很好用的,嗯。