标题:
verilog实现电机控制
[打印本页]
作者:
张毛毛1
时间:
2020-5-10 20:14
标题:
verilog实现电机控制
基于Verilog的无刷直流电动机控制芯片设计
1、时钟:主时钟48MHz可分频,pwm时钟为6MHz
2、异步串行模块:芯片和PC之间通信,接收和发送电机参数和指令;解码指令,把参数和指令变为相应寄存器的操作,从而更新寄存器值;
3、SPI模块:spi模块完成控制AD芯片工作,把霍尔反馈回的信号进行AD转换经过SPI总线送到FPGA芯片处理,修改参数值,实现闭环控制好;
4、无刷直流电机控制模块:三相相位相差120°电角度的驱动波形,一般为方波,或者通过编程输出包含电机运动参数信息为正弦波的pwm波形,把生成的控制波形与一个标准正弦表相乘得到正弦波包络图;
①这里采用了DDS技术。DDs(直接数字频率合成器)是从相位观念出发直接合成所需波形的一种频率合成技术。在Verilog可实现:① ROM存放标准正弦波。把一个标准的正弦波幅值存于ROM模块中,通过相位的变化来取得该正弦波的离散的幅值。基地址寄存器位数N决定了存放波形离散值的个数2的N次方。根据电机受控精度的要求,可以通过修改从地址寄存器的位数或很小的改动就可以做到更为细致的划分。这也是通过Verilog语言来描述电机驱动细分功能的一个优势。这里基地址采用的是 7 位,即代表存储了128 个离散正弦波幅值。用一个同位宽的寄存器变最作为相位计数器实现相位的偏移,从而遍历所有的幅值。为节约芯片资源,三相正弦波可以分时共用一个正弦表,只要输入的三相地址数据在时间上形成连续,实现三相地址数据的合成。实现正弦复用的状态机描述:
always @(phase_shift_fsm or dacreg_a or dacreg_b or dacreg_c or base_addr or rom_data or phase_addr or ph_addr6_a or ph_addr6_b or ph_addr6_c )begin
phase_shift_fsm_d = 4'h0;
phase_addr_d = phase_addr;
dacreg_a_d = dacreg_a;
dacreg_b_d = dacreg_b;
dacreg_c_d = dacreg_c;
ph_addr6_a_d = ph_addr6_a;
ph_addr6_b_d = ph_addr6_b;
ph_addr6_c_d = ph_addr6_c;
case(phase_shift_fsm)begin
4'h0:begin
phase_addr_d = base_addr;
phase_shift_fsm_d = 4'h1;
end
4'h1:begin
phase_addr_d = base_addr; //A相地址
ph_addr6_a_d = base_addr[6];
phase_shift_fsm_d = 4'h2;
end
4'h2:begin
dacreg_a_d = rom_data; //A相数据
phase_addr_d = phase_addr + 9'd43; //C相地址
phase_shift_fsm_d = 4'h3;
end
4'h3:begin
dacreg_c_d = rom_data; //C相数据
phase_addr_d = phase_addr + 9'd42; //B相地址
ph_addr6_c_d = phase_addr[6];
phase_shift_fsm_d = 4'h4;
end
4'h4:begin
dacreg_b_d = rom_data; //B相数据
ph_addr6_c_d = phase_addr[6];
phase_shift_fsm_d = 4'h5;
end
4'h5:begin
phase_shift_fsm_d = 4'h1;
end
endcase
end
②控制信息产生,为无刷电机划分64X16bit寄存器快,存放电机参数,参数由PC给出,经过串行通信模块中的解码状态机的解码,吧PC机传过来的参数转换成相应寄存器操作。寄存器包括运行电平、起始电平、电平增减、步间延迟、其实延迟、延迟增减、运行步速。PC只要改变这些数据就可以改变电机运行,运行电平、起始电平、和电平增减与电机的运行转矩有关,步间延迟、其实延迟、延迟增减和电机运行速度有关,步间延迟决定电机的运行快慢,延迟的增减决定电机是加速还是减速,运行步数决定电机的位置。由状态机实现:
③含控制信息的正弦包络,把读出的寄存器值(电机设置的参数)和正弦表中的幅值相乘来实现控制信息的正弦包络。如图三,ROM的地址线为7bit,可寻址大小为128,乘法单元采用IP核,控制信号为②重的控制信号,通过乘法器后在经过①中的方法,得到三相输出信号dac_a~dac_c作为计数值,从而产生最终的控制信号。关键代码:
if(pwm_a_cntr>=dacreg_a)begin
pwm_a_out <= 1’b0;
pwm_a_cntr <= pwm_a_cntr;
end
else begin
pwm_a_cntr <= pwm_a_cntr +1 ;
end
系统工作时钟48MHz,正弦表读取时钟为6MHz。
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1