动态 PWM 占空比

Dynamic PWM duty cycle

我无法动态更改 PWM 的占空比。我在数据表中发现我可能误解了这一点:

CCPR1L 和 CCP1CON<5:4> 可随时写入,但占空比值不会复制到 CCPR1H,直到 PR2 和 TMR2 之间发生匹配(即,周期完成).在PWM模式下,CCPR1H为只读寄存器。

使用 PIC18F1220、XC8 v1.34、MPLAB v5.30

PR2=99; //calculation
CCPR1L = 50; //calculation*duty cycle

T2CONbits.TMR2ON = 1; //start timer

        while(1)
    {
        ADC_Result[0] = ADC_Read(0);
        ADC_Result[1] = ADC_Read(1);

        if(ADC_Result[0] > 900) 
        {
            T2CONbits.TMR2ON = 0;
            CCPR1L = 0;
            T2CONbits.TMR2ON = 1;
        }
        else
        {
            T2CONbits.TMR2ON = 0;
            CCPR1L = 50;
            T2CONbits.TMR2ON = 1;
        }

        PIR1bits.CCP1IF=0;
        while(PIR1bits.CCP1IF==0);
    }

关闭和重新启动计时器不应该重新开始时间吗?

旁注:我知道 PWM 工作正常。在模拟器上我可以让这两种情况发生,只需要重新启动。我也尝试过不关闭和打开计时器但没有成功。

问题以及为什么需要重置是最后一个 while 循环。在第 75 页的数据表中,显示 CCP1F 位未在 PWM 操作中使用。如果您想等待周期到期到 运行 ADC,请改用 tmr2if 位。