wuzhengmin 发表于 2026-3-5 12:24:08


我们可以用PCA代替PWM功能

PCA模块有3组,都可以产生PWM



wuzhengmin 发表于 2026-3-5 12:45:43


PCA产生的PWM的频率=sysclk/256是固定的


PCA是蛮复杂的,我们用AiCube 来配置:

1.2 实验目的
通过PCA配置PWM功能,使D1指示灯逐渐变亮后逐渐变暗。

先查看P20有没有PCA功能?

2.硬件设计
本实验使用到硬件资源如下:
(1)PCA
(2)GPIO
(3)LED模块



wuzhengmin 发表于 2026-3-5 12:55:12

重点看配置:

wuzhengmin 发表于 2026-3-5 13:01:08

具体看:

选择PCA的管脚切换:PCA ECI(P2.3),CCP0(P2.0),CCP1(P2.1),CCP2(P2.2)



wuzhengmin 发表于 2026-3-5 13:18:37

这样选了之后,P2.1 P2.2 P2.3 依然可以当做普通IO口用

8位PWM重载值是0-255 ,它决定占空比的大小,0就是高电平时间是0

我们用PCA模块0,关注模块0 的重载值就OK

wuzhengmin 发表于 2026-3-5 13:22:33

PWM边沿中断先不管它


使能PCA的中断也先不管

wuzhengmin 发表于 2026-3-5 13:28:08

设置完直接生产代码:

wuzhengmin 发表于 2026-3-5 13:47:26

接着进入主函数:

先设置几个变量:

u8 dir =0 ; //方向变量
u8 cnt =0 ;//计数变量
u8 i =0 ;   //P2.1普通IO口用

我们在ai8051u_def.h 里定义了:
#define PCA_SetC0Reload(v)            PCA_SetCnReload(0, (v))
#define PCA_SetC1Reload(v)            PCA_SetCnReload(1, (v))
#define PCA_SetC2Reload(v)            PCA_SetCnReload(2, (v))

#define PCA_SetC0Match(v)               PCA_SetCnMatch(0, (v))
#define PCA_SetC1Match(v)               PCA_SetCnMatch(1, (v))
#define PCA_SetC2Match(v)               PCA_SetCnMatch(2, (v))

wuzhengmin 发表于 2026-3-5 13:50:54

PCA_SetC0Reload(v) 是用来设置占空比的

////////////////////////////////////////
// 项目主函数
// 入口参数: 无
// 函数返回: 无
////////////////////////////////////////
void main(void)
{
    //<<AICUBE_USER_MAIN_INITIAL_BEGIN>>
    // 在此添加用户主函数初始化代码
                u8 dir =0 ; //方向变量
                u8 cnt =0 ;//计数变量
                u8 i =0 ;   //P2.1普通IO口用

    //<<AICUBE_USER_MAIN_INITIAL_END>>

    SYS_Init();

    //<<AICUBE_USER_MAIN_CODE_BEGIN>>
    // 在此添加主函数中运行一次的用户代码
    //<<AICUBE_USER_MAIN_CODE_END>>

    while (1)
    {
      USBLIB_OUT_Done();            //查询方式处理USB接收的数据

      //<<AICUBE_USER_MAIN_LOOP_BEGIN>>
      // 在此添加主函数中用户主循环代码
                if(dir==0)
                {
                        cnt++;
                        if(cnt>=255) dir=1; //dir切换方向
                       
                }
                else
                {
                        cnt--;
                        if(cnt<==0) dir=0;//dir切换方向
                }
               
               //PCA_SetC0Reload(v) 是用来设置占空比的
                PCA_SetC0Reload(cnt);
               
      //<<AICUBE_USER_MAIN_LOOP_END>>
    }
}

wuzhengmin 发表于 2026-3-6 09:40:40

串口通信实验
实验简单介绍:
页: 10 11 12 13 14 15 16 17 18 19 [20] 21 22 23 24 25 26 27 28
查看完整版本: 学习休眠唤醒遇到的问题:1无法开启休眠 2舍弃一下功能后能进入休眠但无法唤醒