这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » 嵌入式开发 » 国产MCU » 学习AI8051开发板例程:15AI8051的PCA输出的脉冲宽度功能

共1条 1/1 1 跳转至

学习AI8051开发板例程:15AI8051的PCA输出的脉冲宽度功能

高工
2025-12-10 13:38:48     打赏

  Ai8051U 系列单片机内部集成了3组可编程计数器阵列(PCA/CCP/PWM)模块,可用于软件定时器、外部脉冲捕获、高速脉冲输出和 PWM 脉宽调制输出。

  特别提示:如果使能 Ai8051U 系列的 PCA 中断时,PCA 的中断优先级固定为最高优先级,软件不能设置 PPCA(IP.7)和 PPCAH(IPH.7)来调整 PCA 的中断优先级,否则会导致无法产生 PCA 中断。

 PCA 内部含有一个特殊的 16 位计数器,3 组 PCA 模块均与之相连接。PCA 计数器的结构图如下:

15-1.png

二:引脚的切换:

15-2.png

    CMOD = (CMOD & 0x9f) | (1<<5);

PCA控制寄存器:

15-3.png

CCON |= 0x40;   //启动 PCA 计时器

三:PWM输出卖出那个输出模式:

当 PCA 计数器的计数值与模块捕获寄存器的值相匹配时,PCA 模块的 CCPn 输出将发生翻转转。要激活高速脉冲输出模式,CCAPMn 寄存器的 TOGn、MATn 和 ECOMn 位必须都置 1。

PCA 模块工作于高速脉冲输出模式的结构图如下图所示:

15-4.png

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。

15-5.png

四:软件代码:

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 占空比

五:测试图片如下所示:

15-6.png




关键词: AI8051     PCA输出    

共1条 1/1 1 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]