步进电机控制器设计 利用Quartus ii9.0设计一个具有四相单四拍,四相双四拍和四相八拍的脉冲分配器。 设计一个三选一数据选择器来控制pause信号选择工作方式,以及用两个74160与两个7447设计成计数器来对步进电机进行计数。 并用该软件对其进行了仿真。 报告设计说明书原理图程序
我蹲在实验室角落盯着示波器上的波形,手指头在开发板上来回拨动。步进电机突然抽风似的转了个圈,吓得隔壁桌做电源的同学差点把烙铁扔了——这玩意儿控制不好真能当暗器使。
脉冲分配器是整个系统的节奏大师。用Verilog搞了个四相驱动模块,核心就是个状态机轮播:
always @(posedge clk) begin case(mode) 2'b00: //单四拍 case(step_counter) 0: phase <= 4'b0001; 1: phase <= 4'b0010; 2: phase <= 4'b0100; 3: phase <= 4'b1000; endcase 2'b01: //双四拍 case(step_counter) 0: phase <= 4'b0011; 1: phase <= 4'b0110; 2: phase <= 4'b1100; 3: phase <= 4'b1001; endcase default: //八拍混合 case(step_counter) 0: phase <= 4'b0001; 1: phase <= 4'b0011; 2: phase <= 4'b0010; 3: phase <= 4'b0110; 4: phase <= 4'b0100; 5: phase <= 4'b1100; 6: phase <= 4'b1000; 7: phase <= 4'b1001; endcase endcase end这代码看着像俄罗斯方块,实际运行时相位切换必须严丝合缝。特别是八拍模式下的半步切换,稍有不慎电机就会原地蹦迪。
步进电机控制器设计 利用Quartus ii9.0设计一个具有四相单四拍,四相双四拍和四相八拍的脉冲分配器。 设计一个三选一数据选择器来控制pause信号选择工作方式,以及用两个74160与两个7447设计成计数器来对步进电机进行计数。 并用该软件对其进行了仿真。 报告设计说明书原理图程序
控制方式选择用了个三选一MUX,硬件实现比软件更直接:
assign pause = (select == 2'b00) ? modeA_pause : (select == 2'b01) ? modeB_pause : modeC_pause;其实用三个与非门搭更省资源,但当时赶时间直接调用了库里的74153。后来发现这货的传输延迟比预期多了15ns,差点让脉冲时序崩盘。
计数器部分最闹心,两个74160级联扩展计数范围时,同步进位信号的处理让我掉了不少头发。关键在第二个芯片的ENT端要接第一个的RCO:
// 级联配置 wire carry_out; counter_74160 first_counter( .clk(step_pulse), .clr(reset), .load(1'b0), .ENT(1'b1), .ENP(1'b1), .RCO(carry_out) ); counter_74160 second_counter( .clk(step_pulse), .clr(reset), .load(1'b0), .ENT(carry_out), // 这里必须用前级的RCO .ENP(1'b1), .RCO() );仿真时发现计数器偶尔会吞脉冲,查了三天才发现是7447译码器的消隐脚没处理好。硬件设计真是失之毫厘谬以千里,某个接地脚虚焊都能让数码管显示鬼符。
最终在Quartus里跑时序仿真时,看到各相位信号像阅兵式一样整齐划一地切换,那种满足感堪比打通关魂系游戏。虽然烧了三片CPLD才调通,但看着电机丝滑地转起来,感觉值回票价了。