1

我正在尝试将 的值传递DCCCPR1LDC1B1DC1B0,现在我正在手动进行,但是有没有办法DC直接使用 的值?

void SetDCPWM1(unsigned int DC){
    CCPR1L = 0b01011010;
    DC1B1 = 0;
    DC1B0 = 0;
}

现在我没有使用DC,因为我不知道如何正确地将值传递给寄存器。DC是一个 10 位的值,DC1B1必须DC1B0有 1 位和 2 位,并且CCPR1L必须有 3 - 10 位。

4

2 回答 2

2

假设 PWM 占空比的 10 位是函数参数的低 10 位,那么这应该可以满足您的要求。

void SetDCPWM1(unsigned int DC){
    CCPR1L = (DC >> 2);
    DC1B1 = 0;
    DC1B0 = 0;
    if (DC & 2) DC1B1 = 1;
    if (DC & 1) DC1B0 = 1;
}

此代码应解决 Mike 的评论:

void SetDCPWM1(unsigned int DC){
    CCP1CONbits.DC1B = (unsigned char)(DC) & 0x03;
    CCPR1L = (unsigned char)(DC>>2);
}

此外,PWM 占空比的两个 LSB 现在在同一指令周期中更新。

于 2018-10-21T23:59:32.267 回答
2

试试这个:

void SetDCPWM1(unsigned int DC){
    CCPR1L = (DC >> 2);
    DC1B1  = (DC & 0x0002) ? 1: 0;
    DC1B0  = (DC & 0x0001) ? 1: 0;
}
于 2018-10-22T06:07:29.253 回答