当我在PIC18F46K22中同时在CCP1和CCP2上产生PWM时,PWM的频率会发生变化

时间:2018-04-11 15:29:44

标签: microcontroller pic pwm pic18

当我仅在CCP1上产生PWM时,我能够以10kHz的开关频率获得50HZ的SPWM。当我在CCP2上为另一个SPWM启用PWM时,两个SPWM的频率都会改变。但是如果我在其中一个输出上生成它,它就可以正常工作。我试图在50Hz和10kHz开关频率下产生2个SPWM,相位为90度,对于sin和cos。

   void main(void)
{
    ANSELD=0X00;
    ANSELC=0X00;
    PORTD = 0;
    TRISD = 0;
    TMR2 = 0;

    PR2 = 199;   // PWM period = (PR2+1) * prescaler * Tcy
    CCPR1L = 0;
    CCPR2L = 0;
    TRISC = 0; //0b11111011;     // Make pin 17 (RC1/CCP2) an output
    T2CON = 0b00000100;     // Enable TMR2 with prescaler = 1
    CCP1CON = 0b00001100;   // Enable PWM on CCP1
    CCP2CON = 0b00001100;
    PIR1.TMR2IF = 0;
    T2CON.TMR2ON = 1;
    j = i+50;

    while(1)
    {
            PIR1.TMR2IF = 0;

            while( PIR1.TMR2IF ==0);

            CCPR1L = 0.99*sin_table[i];
            CCPR2L = 0.99*sin_table[j];

             i = i+2;
             j = j+2;

             if(i==100)
             {
              i=0;
             }

             if(j==100)
             {
              j=0;
             }

    }
}

1 个答案:

答案 0 :(得分:2)

问题是定时器2的共用。从手册第181页开始,一旦定时器等于PRx寄存器,就会发生三个动作。他们是:

  1. TMRx已清除
  2. CCPx引脚已设置。
  3. PWM占空比从CCPRxL锁存到CCPRxH。
  4. 由于TMRx(在您的情况下为TMR2)被清除,因此会重置两个输出的周期。 还有其他一些小问题,例如你没有专门写信给" CCPTMRSx"寄存器指定使用什么定时器,&我假设您删除了写入PR1以仅测试第二个输出,但您需要同时写入PR1和PR2来设置周期。

    如果你想要真正的独立PWM,解决方案应该是将TMR2分配给CCP1,将TMR4分配给CCP2