本帖最后由 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;
}
}
|