Ai8051U 系列单片机内部集成了3组可编程计数器阵列(PCA/CCP/PWM)模块,可用于软件定时器、外部脉冲捕获、高速脉冲输出和 PWM 脉宽调制输出。
特别提示:如果使能 Ai8051U 系列的 PCA 中断时,PCA 的中断优先级固定为最高优先级,软件不能设置 PPCA(IP.7)和 PPCAH(IPH.7)来调整 PCA 的中断优先级,否则会导致无法产生 PCA 中断。
PCA 内部含有一个特殊的 16 位计数器,3 组 PCA 模块均与之相连接。PCA 计数器的结构图如下:
:
二:引脚的切换:

CMOD = (CMOD & 0x9f) | (1<<5);
PCA控制寄存器:

CCON |= 0x40; //启动 PCA 计时器
三:PWM输出卖出那个输出模式:
当 PCA 计数器的计数值与模块捕获寄存器的值相匹配时,PCA 模块的 CCPn 输出将发生翻转转。要激活高速脉冲输出模式,CCAPMn 寄存器的 TOGn、MATn 和 ECOMn 位必须都置 1。
PCA 模块工作于高速脉冲输出模式的结构图如下图所示:

PWM输出脉宽调制模式:
脉宽调制是使用程序来控制波形的占空比、周期、相位波形的一种技术,在三相电机驱动、D/A 转换等场合有广泛的应用。AI8 系列单片机的 PCA 模块可以通过设定各自的PCA PWMn 寄存器使其工作于8位 PWM或7位PWM或6位PWM或10位PWM模式。要使能PCA模块的PWM功能,模块寄存器CCAPMn的PwMn和ECOMn 位必须置1。
PCA PWMn寄存器中的EBSn[1:0]设置为00时,PCA模块n工作于8位PWM模式,此时将{0.CL[7:0])与捕获寄存器{EPCnL,CCAPnL[7:0]}进行比较。当 PCA 模块工作于8位 PWM 模式时,由于所有模块共用一个PCA计数器,所有它们的输出频率相同。各个模块的输出占空比使用寄存器{EPCnL,CCAPnL[7:0]}进行设置。当(0.CL[7:0]}的值小于{EPCnL,CCAPnL[7:0]}时,输出为低电平;当{0.CL[7:0]}的值等于或大于{EPCnL,CCAPnL[7:0]}时,输出为高电平。当CL[7:0]的值由FF 变为00 溢出时,{EPCnH,CCAPnH[7:0]}的内容重新装载到{EPCnL,CCAPnL[7:0]}中。这样就可实现无干扰地更新 PWM。

四:软件代码:
4.1 代码初始化:
void PWM_config(void)
{
//bit[6:5]=0: ECI/P1.2, CCP0/P1.3, CCP1/P1.4, CCP2/P1.1
//bit[6:5]=1: ECI/P4.1, CCP0/P4.2, CCP1/P4.3, CCP2/-
//bit[6:5]=2: ECI/P2.3, CCP0/P2.0, CCP1/P2.1, CCP2/P2.2
CMOD = (CMOD & 0x9f) | (1<<5);
CCON = 0x00;
CMOD |= 0x0e; //PCA 时钟为系统时钟/8
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA 模块 0 为 PWM 工作模式
PCA_PWM0 = 0x00;//PCA 模块 0 输出 8 位 PWM
CCAP0L = 0x80;
CCAP0H = 0x80; //设置 PWM 初始占空比
CCAPM1 = 0x42; //PCA 模块 1 为 PWM 工作模式
PCA_PWM1 = 0xc0;//PCA 模块 1 输出 10 位 PWM
CCAP1L = 0x40;
CCAP1H = 0x40; //设置 PWM 初始占空比
CCAPM2 = 0x42; //PCA 模块 2 为 PWM 工作模式
PCA_PWM2 = 0x80;//PCA 模块 2 输出 6 位 PWM
CCAP2L = 0x20;
CCAP2H = 0x20; //设置 PWM 初始占空比
CCON |= 0x40; //启动 PCA 计时器
}4.2 修改脉冲宽度底层函数
void UpdatePwm(u8 PCA_id, u16 pwm_value)
{
if(PCA_id == PCA0)
{
PCA_PWM0 = (PCA_PWM0 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
CCAP0H = (u8)pwm_value;
}
else if(PCA_id == PCA1)
{
PCA_PWM1 = (PCA_PWM1 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
CCAP1H = (u8)pwm_value;
}
else if(PCA_id == PCA2)
{
PCA_PWM2 = (PCA_PWM2 & ~0x32) | (u8)((pwm_value & 0x0300) >> 4) | (u8)((pwm_value & 0x0400) >> 9);
CCAP2H = (u8)pwm_value;
}
}4.3 修改脉冲函数:
if(B_PWM0_Dir)
{
if(--pwm0 <= 1) B_PWM0_Dir = 0;
}
else if(++pwm0 >= 255) B_PWM0_Dir = 1;
UpdatePwm(PCA0,pwm0); //调节 PCA0 占空比五:测试图片如下所示:

我要赚赏金
