本帖最后由 188610329 于 2022-5-26 22:01 編輯
既然,你只需要4路PWM, 既然你單片機本來就有 3路PWM, 那么你定時器只需要 模擬一路PWM即可,那么完全不用那么頻繁的中斷定時器,直接利用定時器的自動重載功能,可以做到 模擬出MHz級別的 PWM,占用資源還少……。
#include <STC15F2K60S2.H>
//============ 手動設置部分 ===============
#define Mainforse 33177600L //晶振頻率(Hz)
#define Pulse_frequency 420 //脈沖頻率(Hz) 即一秒鐘發生多少個脈沖。
#define Pulse_High 1 //高電平占比 占空比為(Pulse_High/(Pulse_High + Pulse_Low))
#define Pulse_Low 4 //低電平占比
sbit PWMIO = P2^0;
//============ 手動設置部分 ===============
//============ 自動設置部分 ===============
#define Pulse_Count_High (Mainforse * Pulse_High / Pulse_frequency /(Pulse_High + Pulse_Low))
#define Pulse_Count_Low (Mainforse * Pulse_Low / Pulse_frequency /(Pulse_High + Pulse_Low))
#if ((Pulse_Count_High < 65536) && (Pulse_Count_Low < 65536))
#define SET_T0_CLK() AUXR |= 0x80
#define Reload_High (65536 - Pulse_Count_High)
#define Reload_Low (65536 - Pulse_Count_Low)
#else
#define SET_T0_CLK() AUXR &= 0x7f
#define Reload_High (65536 - (Pulse_Count_High / 12))
#define Reload_Low (65536 - (Pulse_Count_Low / 12))
#endif
//============ 自動設置部分 ===============
void Main()
{
SET_T0_CLK();
TMOD = 0x00; //16位自動重載模式
TH0 = Reload_High / 256; //給高電平計數值
TL0 = Reload_High % 256;
TR0 = 1;
PT0 = 1;
ET0 = 1;
EA = 1;
PWMIO = 1; //IO給高電平
TH0 = Reload_Low / 256; //給低電平計數值
TL0 = Reload_Low % 256;
while(1);
}
void T0_INT() interrupt 1
{
if(PWMIO)
{
PWMIO = 0;
TH0 = Reload_High / 256;
TL0 = Reload_High % 256;
}
else
{
PWMIO = 1;
TH0 = Reload_Low / 256;
TL0 = Reload_Low % 256;
}
}
|