按照表2中的逻辑输出电平即可设计逻辑发生器。其VerilogHDL代码如下:
always @(negedge clk or negedge reset)
begin
if(!reset) q = 4’b0000;
else if(!hold || !run_en) q = 4’b0000;
//输出0可以使功率芯片输出开路状态,
//防止电机发热
else begin//电机请求有效
if(!direc_i)//反方向
case (q) //表2中的逻辑输出
4'b0111 : q = 4'b1111;
4'b1111 : q = 4'b1101;
4'b1101 : q = 4'b0101;
4'b0101 : q = 4'b0111;
default : q = 4'b0101;
endcase
else if(direc_i)//正方向
case (q)
4'b0111 : q = 4'b0101;
4'b0101 : q = 4'b1101;
4'b1101 : q = 4'b1111;
4'b1111 : q = 4'b0111;
default : q = 4'b0101;
endcase
end
end
3 仿真与实验
为了验证所设计的步进电机控制器是否能正常工作,使用EDA工具和Nios II嵌入式系统对控制器进行功能仿真和实验验证。
3.1 功能仿真
使用测试台(testbench)程序在Modelsim中对步进电机控制器进行功能仿真。仿真时钟周期为100 ns,仿真结果如图4所示。测试台程序在预定的时间点自动修改输入端口寄存器的值,并监视逻辑发生器的输出。在评价功能仿真输出结果时,主要查看自动、手动和复位3个模块的仿真输出逻辑是否按测试台程序要求转换了预定的次数,同时检查限位和停止功能是否有效。
图4中,测试台首先设置爬山复位(reset_tri)为有效,逻辑发生器开始输出驱动逻辑,直到限位信号(limit)下降沿到来,A/B/C/D恢复为0;接着置手动触发信号(manual)有效,逻辑发生器在输出手动控制模块预置的7次驱动逻辑转换后,A/B/C/D恢复为0;然后向自动步数(data)写入数据’00001001’,逻辑发生器输出了9次逻辑转换;在手动和自动控制过程中,测试台在逻辑输出过程中插入了有效的限位信号。由图4可以看出,在1600 ns和3 μs 处,驱动逻辑的转换方向发生了变化;最后,向data写入数据’00000100’,驱动逻辑重新开始输出,输出过程中遇到停止信号(hold)有效,强制输出A/B/C/D为0。仿真结果表明所设计的步进电机控制器的功能正确。
3.2 实验验证
步进电机控制器的实验验证电路如图5所示。嵌入Nios II处理器的片上可编程系统(SoPC)在ALTERA DE2开发板的FPGA中建立,同时设计了位置感应电路和功率驱动电路,用来验证复位和限位功能以及驱动步进电机。
关键词: