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
串口通信实验
实验简单介绍: