AI8051内部集成了高级PWM新增硬件移相功能:
内容:主要是通过其高级PWM定时器(PWMA)的主从模式实现的,这种机制可以将某个PWM通道作为“主”,它的特定时间(比如更新溢出)去触发另外一个作为“从”的PWM通道,从而在他们之间建立精确的硬件相位关系。
今天先和大家分享不对称PWM模式:
在不对称模式下,生成的两个中心对齐PWM信号间允许存在可编程相移。频率由PWMA ARR寄存器的值确定,而占空比和相移则由一对PWMACCRx寄存器确定。两个寄存器分别控制递增计数和递减计数期间的PWM,这样每半个PWM周期便会调节一次PWM:
OCIREFC (或 OC2REFC) 由 PWMA CCR1和 PWMA CCR2 控制
OC3REFC (或 OC4REFC)由 PWMA_CCR3和 PWMA CCR4 控制
两个通道可以独立选择不对称PWM模式(每对CCR寄存器控制一个OCx输出),只需向PWMA CCMRx寄存器的OCxM 位写入“1110”(不对称PWM模式1)或“1111"(不对称PWM模式2)给定通道用作不对称PWM通道时,也可使用其互补通道。例如,如果通道1上产生OCIREFC信号(不对称PWM模式1),则由于不对称PWM模式1的原因,通道2上可输出 OC2REF信号或OC2REFC信号。
(注:出于兼容性原因,0CxM[3:0]位域分为两部分,最高有效位与最低有效的3位不相邻。)
下图显示了不对称PWM模式下可以产生的信号示例(通道1到通道4在不对称PWM模式1下配置)。
与死区发生器配合使用时,这可控制相移全桥直流到直流转换器。

二:软件代码如下:
2.1 PWM的初始化过程
PWM1_Duty = 15000; PWM2_Duty = 5000; PWM3_Duty = 5000+3000; PWM4_Duty = 5000+7000; PWMA_CCER1 = 0x00; //写 CCMRx 前必须先清零 CCxE 关闭通道 PWMA_CCER2 = 0x00; PWMA_CCMR1X = 0x00;//通道1:PWM2模式 PWMA_CCMR1 = 0x70; PWMA_CCMR2X = 0x01;//通道2:不对称PWM2模式 PWMA_CCMR2 = 0x70; PWMA_CCMR3X = 0x00;//通道3:PWM2模式 PWMA_CCMR3 = 0x70; PWMA_CCMR4X = 0x01;//通道4:不对称PWM2模式 PWMA_CCMR4 = 0x70; PWMA_CCER1 = 0x55; //配置通道输出使能和极性 PWMA_CCER2 = 0x55; PWMA_ARRH = (u8)(PWM_PERIOD >> 8); //设置周期时间 PWMA_ARRL = (u8)PWM_PERIOD; PWMA_ENO = 0x00; PWMA_ENO |= ENO1P; //使能输出 PWMA_ENO |= ENO1N; //使能输出 PWMA_ENO |= ENO2P; //使能输出 PWMA_ENO |= ENO2N; //使能输出 PWMA_ENO |= ENO3P; //使能输出 PWMA_ENO |= ENO3N; //使能输出 PWMA_ENO |= ENO4P; //使能输出 PWMA_ENO |= ENO4N; //使能输出 PWMA_PS = 0x00; //高级 PWM 通道输出脚选择位 PWMA_PS |= PWM1_1; //选择 PWM1_0 通道 PWMA_PS |= PWM2_0; //选择 PWM2_0 通道 PWMA_PS |= PWM3_0; //选择 PWM3_0 通道 PWMA_PS |= PWM4_0; //选择 PWM4_0 通道
2.2 更新PWM的脉宽
void UpdatePwm(void)
{
PWMA_CCR1H = (u8)(PWM1_Duty >> 8); //设置占空比时间
PWMA_CCR1L = (u8)(PWM1_Duty);
PWMA_CCR2H = (u8)(PWM2_Duty >> 8); //设置占空比时间
PWMA_CCR2L = (u8)(PWM2_Duty);
PWMA_CCR3H = (u8)(PWM3_Duty >> 8); //设置占空比时间
PWMA_CCR3L = (u8)(PWM3_Duty);
PWMA_CCR4H = (u8)(PWM4_Duty >> 8); //设置占空比时间
PWMA_CCR4L = (u8)(PWM4_Duty);
}三:实物测试
这里我使用的是P2.0 和P2.1:

我要赚赏金
