FPGA研途之路——永远的步进(一)
本例用的是Alinx的FPGA开发板,其主控芯片用的是cyclonelVCE6系列,后续因为要学习BLDC的驱控,就先拿步进电机练练手。既然是(一),程序.上肯定并不复杂,只实现简单的加减速及正反转,后续学习闭环驱动。
以两相电机为例,步进电机驱动器和控制器的接线方式有共阴和共阳两种接
法,不同的接法会导致程序的电平输出不同,程序中应格外注意。VCC3.3也能够驱动,不排除有些驱动器的TTL电平高些,所以有时I/O还会外接放大电路。


下图是整个程序的netlist,功能模块上有以下几个:
4个按键输入,分别用于加减速、使能及换向(图中的四个key,fliter用于按键消抖) ;
对按键输入累加速度(r/s),计算并转化为脉冲定时器count_max的值(module pulse_caculate) ;
speed_ctr|用于最后的脉冲生成、EN和DIR控制。

上述三个功能模块实现过程中,对于新手需要注意的就是pulse_caculate。 我的想法是通过按键直接控制转速的加减,所以必然涉及到转速到脉冲频率的转换。当然这个计算肯定是小问题,问题出在verilog描述上。不同于C/C++等高级语言,verilog在进行数学运算时大多数情况是不能直接进行乘除法的运算的。最开始我直接使用下面的计算公式:
num<=1000_000_000/(2*1600*speed*T)
其中num是脉冲定时器的载入值,之后传给speed_ ctrl模块进行定时生成脉冲; speed是转速(单位r/s) ; T是时钟周期; 1600是细分。
编译后进行modelsim仿真,发现num[31:0]的值一直处于不定状态,搜攻略才注意到这个问题是入门很常见的问题。对于--些简单的乘除法,quatus有 时会自动生成乘法/除法器,这个时候就不需要自己去创建算术IP核。但大多是时候,保险起见还是需要自行创建除法器。
quatus现成的除法器IP核有两个,分别是LPM_ DIVIDE和ALTEF_ DIV。LPM_ DIVIDE相当于"/ "运算,会生成商和余数; ALTEF_ DIV则是浮点运算,精度会更高。具体了解看以下链接。

verilog中浮点数的表示以及浮点数除法IP核的使用
https://mbb.eet-china.com/blog/1835172-370138.html
IP核的使用---乘法器和除法器
https://www.freesion.com/article/5077434666/



下图是pulse_ caculate的netlist,可以看到生成了名为ip_divider的除法器

话不多说,贴上关键module的代码。通过这个实验也能发现,给步进电机驱动器的脉冲过快的直接现象就是,步进电机变成蜂鸣器,只响不转。最开始频率过高,整的我怀疑程序编错了。。。。
另外一个就是,转速过高时直接进行换向必然会造成丢步,因为这各例子很简单,不涉
及到加减速曲线,所以都是阶梯跳变。
后续上闭环,写下此帖用于心得记录和分享。