欢迎光临散文网 会员登陆 & 注册

FPGA研途之路——永远的步进(一)

2023-04-08 11:24 作者:先森加油  | 我要投稿


本例用的是Alinx的FPGA开发板,其主控芯片用的是cyclonelVCE6系列,后续因为要学习BLDC的驱控,就先拿步进电机练练手。既然是(一),程序.上肯定并不复杂,只实现简单的加减速及正反转,后续学习闭环驱动。

以两相电机为例,步进电机驱动器和控制器的接线方式有共阴和共阳两种接

法,不同的接法会导致程序的电平输出不同,程序中应格外注意。VCC3.3也能够驱动,不排除有些驱动器的TTL电平高些,所以有时I/O还会外接放大电路。

共阳极接线
共阴极接线

下图是整个程序的netlist,功能模块上有以下几个:

  1. 4个按键输入,分别用于加减速、使能及换向(图中的四个key,fliter用于按键消抖) ;

  2. 对按键输入累加速度(r/s),计算并转化为脉冲定时器count_max的值(module pulse_caculate) ;

  3. speed_ctr|用于最后的脉冲生成、EN和DIR控制。

步进电机简易驱动netlist

        上述三个功能模块实现过程中,对于新手需要注意的就是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/

LPM_ DIVIDE
ALTEF_ DIV

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

pulse_ caculate netlist

        话不多说,贴上关键module的代码。通过这个实验也能发现,给步进电机驱动器的脉冲过快的直接现象就是,步进电机变成蜂鸣器,只响不转。最开始频率过高,整的我怀疑程序编错了。。。。

        另外一个就是,转速过高时直接进行换向必然会造成丢步,因为这各例子很简单,不涉

及到加减速曲线,所以都是阶梯跳变。

        后续上闭环,写下此帖用于心得记录和分享。


FPGA研途之路——永远的步进(一)的评论 (共 条)

分享到微博请遵守国家法律