当我仅在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;
}
}
}
答案 0 :(得分:2)
问题是定时器2的共用。从手册第181页开始,一旦定时器等于PRx寄存器,就会发生三个动作。他们是:
由于TMRx(在您的情况下为TMR2)被清除,因此会重置两个输出的周期。 还有其他一些小问题,例如你没有专门写信给" CCPTMRSx"寄存器指定使用什么定时器,&我假设您删除了写入PR1以仅测试第二个输出,但您需要同时写入PR1和PR2来设置周期。
如果你想要真正的独立PWM,解决方案应该是将TMR2分配给CCP1,将TMR4分配给CCP2