單片機驅(qū)動CPLD的PWM正弦信號發(fā)生器設計
下面用硬件描述語言來設計CPLD 的內(nèi)部電路,這里給出VerilogHDL 版本的參考代碼。
module Mini51b_PWM(P0,ALE,P27,WR,PWM);// 模塊電路命名和端口說明。
input [7:0]P0;// 數(shù)據(jù)輸入接MCU 數(shù)據(jù)P0 口
input ALE,P27,WR;// 幾個MCU 讀寫控制引腳
output PWM;//PWM 信號輸出
wire [7:0]addr;// 內(nèi)部地址線
reg [7:0]daPWMc,daPWMs;// 定義計數(shù)器和占空比設定寄存器
reg [3:0]divPWM,divPWMc;// 分頻控制變量
reg PWM;// 輸出鎖存器
assign addr = ALE?P0 : addr; // 低八位地址鎖存
always @(negedge WR)// 在MCU 寫信號有效時執(zhí)行寄存器設定
begin
case({P27,addr[4:0]}) // 根據(jù)地址選擇寄存器
6'b10_1000: daPWMs = P0;// 寫帶地址的寄存器
6'b10_1001: divPWM = P0[3:0];// 寫帶地址的寄存器
default:begin// 其它地址則讓寄存器保持不變
daPWMs = daPWMs;
divPWM = divPWM;
end
endcase
end
always @(posedge ALE) begin// 這里利用MCU 的ALE 做時鐘信號
if(divPWMc == divPWM) begin // 與分頻系數(shù)比較
divPWMc=0;
if(daPWMc100) daPWMc = daPWMc+1; //PWM 調(diào)整精度1%
else daPWMc = 0;
if(daPWMs daPWMc) PWM = 0;//PWM 發(fā)生器
else PWM = 1;
end
else divPWMc = divPWMc+1;// 時鐘分頻
end
endmodule
關于單片機與CPLD 之間的接口請讀者參考本刊前幾期筆者撰寫的文章。
與之對應的MCU 測試程序為:
#include reg51.h>
#include absacc.h>
#define PWM XBYTE[0xffe8]
#define DIV XBYTE[0xffe9]
void main()
{
DIV = 15; //PWM 信號頻率計算晶振22.1184M/6/100/
(DIV+1)=2.30K(實測2.281K)
PWM=50; // 設定占空比50%,前面計數(shù)器范圍為0~99
while(1) ;
}
pwm相關文章:pwm原理
負離子發(fā)生器相關文章:負離子發(fā)生器原理 分頻器相關文章:分頻器原理 塵埃粒子計數(shù)器相關文章:塵埃粒子計數(shù)器原理 脈寬調(diào)制相關文章:脈寬調(diào)制原理 離子色譜儀相關文章:離子色譜儀原理
評論