AN1198 发表于 2023-4-19 11:04:20

关于高速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
                }
      }
}

AN1198 发表于 2023-4-19 16:42:27

问题解决了。把定时器0关闭中断就可以了。就是不知道关闭定时器0中断后对PWM输出的影响是怎么样的?不过用示波器观看,发现不管关闭或不关闭定时器0中断,输出的PWM占空比都会有0点几的波动

乘风飞扬 发表于 2023-4-20 18:15:05

楼主贴的是完整的源码吗?中断函数是不是都没贴出来?

梁工 发表于 2023-4-21 10:38:23

AN1198 发表于 2023-4-19 16:42
问题解决了。把定时器0关闭中断就可以了。就是不知道关闭定时器0中断后对PWM输出的影响是怎么样的?不过用 ...

原因很简单,用定时器0做PWM时钟,还开中断,往往速度比较快,中断响应不过来,耗掉CPU所有时间了,别的程序就没机会运行了。
所以,定时器0做PWM时钟,高于50KHz(小于20us),最好不要开中断。
页: [1]
查看完整版本: 关于高速PWM与串口定时器设置的问题