找回密码
 立即注册
查看: 337|回复: 3

关于高速PWM与串口定时器设置的问题

[复制链接]

该用户从未签到

1

主题

1

回帖

9

积分

新手上路

积分
9
发表于 2023-4-19 11:04:20 | 显示全部楼层 |阅读模式
本帖最后由 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
                }
        }
}

本帖被以下淘专辑推荐:

回复 送花

使用道具 举报

该用户从未签到

1

主题

1

回帖

9

积分

新手上路

积分
9
 楼主| 发表于 2023-4-19 16:42:27 | 显示全部楼层
问题解决了。把定时器0关闭中断就可以了。就是不知道关闭定时器0中断后对PWM输出的影响是怎么样的?不过用示波器观看,发现不管关闭或不关闭定时器0中断,输出的PWM占空比都会有0点几的波动

点评

原因很简单,用定时器0做PWM时钟,还开中断,往往速度比较快,中断响应不过来,耗掉CPU所有时间了,别的程序就没机会运行了。 所以,定时器0做PWM时钟,高于50KHz(小于20us),最好不要开中断。  详情 回复 发表于 2023-4-21 10:38
回复 支持 反对 送花

使用道具 举报

  • TA的每日心情
    奋斗
    昨天 09:00
  • 签到天数: 144 天

    [LV.7]常住居民III

    27

    主题

    1356

    回帖

    4217

    积分

    论坛元老

    积分
    4217
    发表于 2023-4-20 18:15:05 | 显示全部楼层
    楼主贴的是完整的源码吗?中断函数是不是都没贴出来?
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3053

    回帖

    6883

    积分

    超级版主

    积分
    6883
    发表于 2023-4-21 10:38:23 | 显示全部楼层
    AN1198 发表于 2023-4-19 16:42
    问题解决了。把定时器0关闭中断就可以了。就是不知道关闭定时器0中断后对PWM输出的影响是怎么样的?不过用 ...

    原因很简单,用定时器0做PWM时钟,还开中断,往往速度比较快,中断响应不过来,耗掉CPU所有时间了,别的程序就没机会运行了。
    所以,定时器0做PWM时钟,高于50KHz(小于20us),最好不要开中断。
    回复 支持 反对 送花

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-21 02:11 , Processed in 0.057880 second(s), 44 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

    快速回复 返回顶部 返回列表