|
基于Verilog的無刷直流電動(dòng)機(jī)控制芯片設(shè)計(jì)
1、時(shí)鐘:主時(shí)鐘48MHz可分頻,pwm時(shí)鐘為6MHz
2、異步串行模塊:芯片和PC之間通信,接收和發(fā)送電機(jī)參數(shù)和指令;解碼指令,把參數(shù)和指令變?yōu)橄鄳?yīng)寄存器的操作,從而更新寄存器值;
3、SPI模塊:spi模塊完成控制AD芯片工作,把霍爾反饋回的信號(hào)進(jìn)行AD轉(zhuǎn)換經(jīng)過SPI總線送到FPGA芯片處理,修改參數(shù)值,實(shí)現(xiàn)閉環(huán)控制好;
4、無刷直流電機(jī)控制模塊:三相相位相差120°電角度的驅(qū)動(dòng)波形,一般為方波,或者通過編程輸出包含電機(jī)運(yùn)動(dòng)參數(shù)信息為正弦波的pwm波形,把生成的控制波形與一個(gè)標(biāo)準(zhǔn)正弦表相乘得到正弦波包絡(luò)圖;
①這里采用了DDS技術(shù)。DDs(直接數(shù)字頻率合成器)是從相位觀念出發(fā)直接合成所需波形的一種頻率合成技術(shù)。在Verilog可實(shí)現(xiàn):① ROM存放標(biāo)準(zhǔn)正弦波。把一個(gè)標(biāo)準(zhǔn)的正弦波幅值存于ROM模塊中,通過相位的變化來取得該正弦波的離散的幅值;刂芳拇嫫魑粩(shù)N決定了存放波形離散值的個(gè)數(shù)2的N次方。根據(jù)電機(jī)受控精度的要求,可以通過修改從地址寄存器的位數(shù)或很小的改動(dòng)就可以做到更為細(xì)致的劃分。這也是通過Verilog語言來描述電機(jī)驅(qū)動(dòng)細(xì)分功能的一個(gè)優(yōu)勢(shì)。這里基地址采用的是 7 位,即代表存儲(chǔ)了128 個(gè)離散正弦波幅值。用一個(gè)同位寬的寄存器變最作為相位計(jì)數(shù)器實(shí)現(xiàn)相位的偏移,從而遍歷所有的幅值。為節(jié)約芯片資源,三相正弦波可以分時(shí)共用一個(gè)正弦表,只要輸入的三相地址數(shù)據(jù)在時(shí)間上形成連續(xù),實(shí)現(xiàn)三相地址數(shù)據(jù)的合成。實(shí)現(xiàn)正弦復(fù)用的狀態(tài)機(jī)描述:
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相數(shù)據(jù)
phase_addr_d = phase_addr + 9'd43; //C相地址
phase_shift_fsm_d = 4'h3;
end
4'h3:begin
dacreg_c_d = rom_data; //C相數(shù)據(jù)
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相數(shù)據(jù)
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
②控制信息產(chǎn)生,為無刷電機(jī)劃分64X16bit寄存器快,存放電機(jī)參數(shù),參數(shù)由PC給出,經(jīng)過串行通信模塊中的解碼狀態(tài)機(jī)的解碼,吧PC機(jī)傳過來的參數(shù)轉(zhuǎn)換成相應(yīng)寄存器操作。寄存器包括運(yùn)行電平、起始電平、電平增減、步間延遲、其實(shí)延遲、延遲增減、運(yùn)行步速。PC只要改變這些數(shù)據(jù)就可以改變電機(jī)運(yùn)行,運(yùn)行電平、起始電平、和電平增減與電機(jī)的運(yùn)行轉(zhuǎn)矩有關(guān),步間延遲、其實(shí)延遲、延遲增減和電機(jī)運(yùn)行速度有關(guān),步間延遲決定電機(jī)的運(yùn)行快慢,延遲的增減決定電機(jī)是加速還是減速,運(yùn)行步數(shù)決定電機(jī)的位置。由狀態(tài)機(jī)實(shí)現(xiàn):
③含控制信息的正弦包絡(luò),把讀出的寄存器值(電機(jī)設(shè)置的參數(shù))和正弦表中的幅值相乘來實(shí)現(xiàn)控制信息的正弦包絡(luò)。如圖三,ROM的地址線為7bit,可尋址大小為128,乘法單元采用IP核,控制信號(hào)為②重的控制信號(hào),通過乘法器后在經(jīng)過①中的方法,得到三相輸出信號(hào)dac_a~dac_c作為計(jì)數(shù)值,從而產(chǎn)生最終的控制信號(hào)。關(guān)鍵代碼:
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
系統(tǒng)工作時(shí)鐘48MHz,正弦表讀取時(shí)鐘為6MHz。
|
|