凯泽 发表于 2025-10-30 17:14:18

ai8051u的PCA输出10位PWM 如何写高2位

我在使用ai8051u的PCA模块输出PWM时发现10位PWM的高2位 在手册中叫做XCCAPnL
但在实际使用过程中未找到这个寄存器的名字 求助:我该如何写这两位寄存器







_奶咖君_ 发表于 2025-10-30 17:57:53

要不换一个?直接看看PWM?

_奶咖君_ 发表于 2025-10-30 17:58:16

我记得是16位的,还带16位的预分频

凯泽 发表于 2025-10-30 18:26:26

_奶咖君_ 发表于 2025-10-30 17:58
我记得是16位的,还带16位的预分频

PWMA和PWMB吗 这两个我用作编码器功能了 输出PWM好像会有问题

DebugLab 发表于 2025-10-30 21:10:07

XCCAPnH是寄存器PCA_PWMn中的两个位

程序如下:
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{
      unsigned char temp_l,temp_h,temp;
      
      temp_l=pwm_0&0x00ff;                //读pwm_0低8位赋值给temp_l
      temp_h=(pwm_0&0x0300)>>4;      //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
      temp=PCA_PWM0&0xcd;                        //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
      temp_h|=temp;                              //写其他位到temph
      if(pwm_0==0x03ff)                        //如果pwm_0最大
                temp_h|=0x02;                        //设置EPC0H(PCA_PWM0)为1
      PCA_PWM0=temp_h;                        //写PCA_PWM0(先写高2位)
      CCAP0H=temp_l;                              //写CCAP0H(再写低8位)
      
      temp_l=pwm_1&0x00ff;                //读pwm_1低8位赋值给temp_l
      temp_h=(pwm_1&0x0300)>>4;      //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1)位置,赋值给temp_h
      temp=PCA_PWM1&0xcd;                        //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
      temp_h|=temp;                              //写其他位到temph
      if(pwm_1==0x03ff)                        //如果pwm_1最大
                temp_h|=0x02;                        //设置EPC1H(PCA_PWM1)为1
      PCA_PWM1=temp_h;                        //写PCA_PWM1(先写高2位)
      CCAP1H=temp_l;                              //写CCAP1H(再写低8位)
      
      temp_l=pwm_2&0x00ff;                //读pwm_2低8位赋值给temp_l
      temp_h=(pwm_2&0x0300)>>4;      //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2)位置,赋值给temp_h
      temp=PCA_PWM2&0xcd;                        //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
      temp_h|=temp;                              //写其他位到temph
      if(pwm_2==0x03ff)                        //如果pwm_2最大
                temp_h|=0x02;                        //设置EPC2H(PCA_PWM2)为1
      PCA_PWM2=temp_h;                        //写PCA_PWM2(先写高2位)
      CCAP2H=temp_l;                              //写CCAP2H(再写低8位)
}

凯泽 发表于 7 天前

DebugLab 发表于 2025-10-30 21:10
XCCAPnH是寄存器PCA_PWMn中的两个位

程序如下:

感谢大佬{:ciya:}{:4_201:}

梁工 发表于 4 天前

我是这样装载的:
//========================================================================
// 函数: void UpdatePwm(u8 id, u16 pwm_value)
// 描述: 更新PWM值.
// 参数: id: PCA序号, 0~2对应 PCA0 ~ PCA2
//         pwm_value: pwm值, 这个值是输出低电平的时间.
// 返回: none.
// 版本: V1.0, 2024-12-17
//========================================================================
void      UpdatePwm(u8 id, u16 pwm_value)
{
      if(id == 0)
      {
                PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP0H = (u8)pwm_value;
      }
      else if(id == 1)
      {
                PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP1H = (u8)pwm_value;
      }
      else if(id == 2)
      {
                PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value >> 4) & 0x30);
                CCAP2H = (u8)pwm_value;
      }
}
页: [1]
查看完整版本: ai8051u的PCA输出10位PWM 如何写高2位