spwm控制算法c语言实现,采用Verilog HDL语言与DDS技术实现SPWM控制算法的FPGA设计
其部分程序代碼如下:
case(state1)
A: //初始化狀態
begin
ADDRES1《=addr1; //時分復用第一路地址
READ_EN《=1′b1; //讀使能開
NEXT《=1′b1; //開啟預讀模式
if(addr1==18‘d767) //生成地址
addr1《=18’d0;
else if (!BUSY) //如不忙狀態開始讀
begin
addr1《=addr1+18′d1;//地址自增
out0《=DATAOUT; //數據暫存
state1《=B; //取第二路數據地址
end
end
B: //取第二路數據
begin
ADDRES1《=addr2; //時分復用第二路地址
READ_EN《=1′b1;
NEXT《=1′b1;
if(addr2==18′d767)
addr2《=18′d0;
else if (!BUSY)
begin
addr2《=addr2+18′d1;
out1《=DATAOUT;
state1《=C;
end
end
C: //取第三路數據
begin
ADDRES1《=addr3; //時分復用第三路地址
READ_EN《=1′b1;
NEXT《=1′b1;
if(addr3==18′d767)
addr3《=18′d0;
else if (!BUSY)
begin
addr3《=addr3+18′d1;
out2《=DATAOUT;
state1《=D;
end
end
D: //空操作狀態
begin
state1《=E;
end
E: //數據存儲,同時取出三路數據
begin
outdata0《=out0;
outdata1《=out1;
outdata2《=out2;
state1《=A;
end
endcase
3.5 三角波與正弦波比較控制模塊
該模塊用于輸出三相六路SPWM脈沖序列。用模塊1中輸出的三角波分別與模塊4輸出的三相正弦波相比較,從而先得到三路SPWM脈沖序列。當正弦波數據大于三角波數據時,輸出高電平;反之,輸出低電平。每相輸出又分為互補的兩路輸出,利用一個逆變器對輸入波形取反,就可以得到與SPWM脈沖序列互補的波形。
其部分程序代碼如下:
always@(outdata0 or outdata1 or outdata2 or out2)//比較器
begin
if(outdata0》out2)
outdata4=1;
else outdata4=0;
if(outdata1》out2)
outdata5=1;
else outdata5=0;
if(outdata2》out2)
outdata6=1;
else outdata6=0;
end
3.6 時延控制死區輸出模塊
對于SPWM三相橋式逆變器,由于開關管固有開關時間Ts的影響,開通時間Ton往往小于關斷時間Tof,因此容易發生同臂兩只開關管同時導通的短路故障。為了避免這種故障的發生,通常要設置開關死區ΔT,以保證同橋臂上的一只開關管可靠關斷后,另一只開關管才能開通。死區的設置方式有兩種:一種是提前關斷、延時開通的雙邊對稱設置;另一種是按時關斷、延滯Δt開通的單邊不對稱設置。根據FPGA的編程特點,選擇了按時關斷、延滯Δt開通的單邊不對稱設置,并且時延死區的調節與控制與時延控制死區模塊的輸入時鐘clk有關。
根據延時模塊中延時信息:Δt=2×Tclk
clk是鎖相環輸出時鐘CLK 1 MHz(本文采用的是1 MHz)的2次分頻得到的時鐘,只要改變頂層模塊中對CLK 1 MHz的分頻系數,就可以精確控制延滯Δt的大小,本文計算值Δt=4μs。
另外,死區調節單元還能消除由于FPGA器件本身時延造成的毛刺。其部分死區控制程序代碼如下:
always@(posedge clk or posedge rst)
begin
if(rst) //異步復位
begin //初始化寄存器
q《=0;
q0《=0;
end
else
begin //延時輸出的D觸發器
if(d)
begin
q0《=1′b1;
q《=q0;
end
else
begin //立即清零
q《=0;
q0《=0;
end
end
end
有關clk生成與調節的程序代碼如下:
always@(posedge CLK1M or posedge rst) //分頻產生時延控制時鐘
begin
if(rst) //異步復位
begin
clk《=0; //時鐘初始狀態清零
couter《=0; //計數初值設置零
end
else
begin
if(couter==2′b01)
begin
clk《=~clk;
couter《=0;
end
else
couter《=couter+1′b1; //計數器加1
end
end
3.7 時鐘輸出控制模塊
FushionAFS600器件的系統時鐘是48 MHz,因本設計正弦波的掃描頻率和三角波的掃描頻率預設為1 MHz,為減少時鐘輸出模塊的數量以及能方便更改系統輸出SPWM波形的占空比和頻率,本設計充分利用Fushion器件的時鐘調整電路,用SmartGen生成一個靜態PLL宏模塊,把系統時鐘分頻成1 MHz的時鐘分別是CLK 1 M和CLK 2 M,并連接到全局網絡上。當需要一定頻率和不同占空比的SPWM脈沖時,只需計算出載波和調制波形的掃描頻率,而后直接在SmartGen宏模塊中修改靜態PLL輸出時鐘,就可實現輸出SPWM波形密度的控制與調節,從而滿足各種工作頻率的需求。
4 基于FPGA的SPWM實現及系統測試
4.1 SPWM控制技術的FPGA實現
根據頂層功能圖(如圖1),分別用Verilog HDL語言和SmartGen輸入描述了各個功能單元模塊,并分別在Libero 8.1集成開發環境下通過編譯和仿真驗證。最后用Verilog HDL語言編寫一個頂層模塊實現各個功能模塊的有機組合,以實現總體功能,再在Libero 8.1集成開發環境下進行編譯、邏輯綜合、布局布線后下載到目標器件Fushion AFS600器件FPGA上,實現了三相六路可控SPWM全數字算法的片上系統。
4.2 系統測試結果
圖5是從邏輯分析儀上對系統測試的結果。從圖中可以看出所設計電路完全符合功能要求,且觀測到的時延死區時間均為4 μs,與理論計算值一致。下載后觀測與功能仿真,布局布線后仿真圖形也都完全一樣,達到了設計的預期要求。
總結
以上是生活随笔為你收集整理的spwm控制算法c语言实现,采用Verilog HDL语言与DDS技术实现SPWM控制算法的FPGA设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 气传导蓝牙耳机品牌推荐,精选几款性价比超
- 下一篇: UML建模 步骤