关于高速PWM与串口定时器设置的问题
本帖最后由 AN1198 于 2023-4-19 11:43 编辑芯片是STC12C5608AD。PWM用定时器0作时钟,定时器0工作在1T、8位自动重载模式。串口用定时器1,定时器1也是自动装载模式,串口模式为1。测试发现串口或PWM可以单独工作,但不能同时工作。如果把定时器0改为16位模式,PWM和串口可以同时工作。代码如下:
void T0_init()
{
AUXR |= 0x80; //timer0 work in 1T mode
TMOD |= 0x02; //set timer0 as counter mode2 (8-bit auto-reload)
TL0 = TH0 = 0xff; //fill with 0xff to count one time
TR0 = 1; //timer0 start run
ET0 = 1; //enable T0 interrupt
EA = 1; //open global interrupt switch
}
void PCA_init()
{
CCON = 0; //PCA timer stop running
//Clear CF flag
//Clear all module interrupt flag
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x04; //Set PCA timer clock source as ----t0
//Disable PCA timer overflow interrupt
CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave
CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
CCAP1H = CCAP1L = 0x0f; //PWM1 port output 0% duty cycle square wave
CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt
CR = 1; //PCA timer start run
EA = 1; //open global interrupt switch
}
void uart_init()
{
SCON = 0x50; //8-bit variable UART
TMOD |= 0x20; //Set Timer1 as 8-bit auto reload mode
TH1 = TL1 = -(FOSC/12/32/BAUD); //Set auto-reload vaule
TR1 = 1; //Timer1 start run
ES = 1; //Enable UART interrupt
EA = 1; //Open master interrupt switch
SendString("Uart Test ok!\r\n"); //
}
void main()
{
uart_init();
// T0_init();
PCA_init();
while (1)
{ SendString("OK...!\r\n");
if(rec)
{
rec=0;
LED = !LED; //work LED flash
}
}
}
问题解决了。把定时器0关闭中断就可以了。就是不知道关闭定时器0中断后对PWM输出的影响是怎么样的?不过用示波器观看,发现不管关闭或不关闭定时器0中断,输出的PWM占空比都会有0点几的波动 楼主贴的是完整的源码吗?中断函数是不是都没贴出来? AN1198 发表于 2023-4-19 16:42
问题解决了。把定时器0关闭中断就可以了。就是不知道关闭定时器0中断后对PWM输出的影响是怎么样的?不过用 ...
原因很简单,用定时器0做PWM时钟,还开中断,往往速度比较快,中断响应不过来,耗掉CPU所有时间了,别的程序就没机会运行了。
所以,定时器0做PWM时钟,高于50KHz(小于20us),最好不要开中断。
页:
[1]