使用可编程计数器例程阵列(PCA)输出PWM,涉及到以下几个寄存器:
CCAPMn(n = 0,1,2)
PCA_PWMn(n = 0,1,2)
CCAPnL(n = 0,1,2)
CCAPnH(n = 0,1,2)
测试代码如下:
// 测试工作频率为 12MHz
#include "Ai8051U.H"
#include "intrins.h"
void main(void) {
EAXFR = 1; // 允许访问扩展的特殊寄存器, XFR
//(32 位模式请使用这句,注释下一句 )
// P_SW2 |= 0x80; // 允许访问扩展的特殊寄存器, XFR
//(8 位模式请使用这句,注释上一句 )
WTST = 0; // 设置取程序代码等待时间,
// 赋值为 0 表示不等待,程序以最快速度运行
CKCON = 0; // 设置访问片内的 xdata 速度,
// 赋值为 0 表示用最快速度访问,不增加额外的等待时间
P0M0 = 0x00;
P0M1 = 0x00;
P1M0 = 0x00;
P1M1 = 0x00;
P2M0 = 0x00;
P2M1 = 0x00;
P3M0 = 0x00;
P3M1 = 0x00;
P4M0 = 0x00;
P4M1 = 0x00;
P5M0 = 0x00;
P5M1 = 0x00;
CCON = 0x00;
// B7 = 0 :空闲模式下 PCA 继续计数
// B6 - B5(CCP_S) = 00 :ECI-P1.2 、 CCP0 - P1.3、 CCP1 - P1.4、CCP2 - P1.1
// B4 - B1(CPS) = 0000 :系统主频/12,即PCA主频为1MHz
// B= 0 :禁止 PCA 计数器溢出中断
CMOD = 0x00;
// 计数器清零
CL = 0x00;
CH = 0x00;
// -- 6 位 PWM --
// B6(ECOM0) = 1 :允许PCA0的比较功能
// B5(CCAPP0) = 0:禁止PCA0上升沿捕捉
// B4(CCAPN0) = 0:禁止PCA0下降沿捕捉
// B3(MAT0) = 0 :禁止PCA0匹配
// B2(TOG0) = 0 :禁止PCA0高速脉冲输出
// B1(PWM0) = 1 :允许PCA0输出PWM
// B0(EXXF0) = 0 :禁止PCA0匹配/捕获中断
CCAPM0 = 0x42; //模式控制 : PCA 模块 0 为 PWM 工作模式
// B7-B6(EBS0) = 10 :6 位 PWM模式
PCA_PWM0 = 0x80; //PCA 模块 0 输出 6 位 PWM
// 模式捕获值/器 比较值
// 6 位模式下,最大值0x3F,溢出值=0x40
CCAP0L = 0x20; //PWM 占空比为 50%[(40H-20H)/40H]
CCAP0H = 0x20;
// -- 7 位 PWM --
CCAPM1 = 0x42; //PCA 模块 1 为 PWM 工作模式
PCA_PWM1 = 0x40; //PCA 模块 1 输出 7 位 PWM
// 7 位模式下,最大值0x7F,溢出值=0x80
CCAP1L = 0x20; //PWM 占空比为 75%[(80H-20H)/80H]
CCAP1H = 0x20;
// -- 10 位 PWM --
CCAPM2 = 0x42; //PCA 模块 2 为 PWM 工作模式
PCA_PWM2 = 0xc0; //PCA 模块 2 输出 10 位 PWM
// 10位模式下,最大值0x3FF,溢出值=0x400
CCAP2L = 0x20; //PWM 占空比为 96.875%[(400H-20H)/400H]
CCAP2H = 0x20;
CCON |= 0x40; // 启动 PCA 计时器
while (1);
}烧录芯片时,确定要使用12MHz主频。
CMOD = 0x00;,所以PWM输出使用的是P1.1、P1.3、P1.4

P1.1输出


987.862 / 1020 ≈96.85%,与预想的96.875%差不多
P1.3的输出:


31.703 / 63.406 = 50%,符合预期
P1.4的输出:


95.743/127.446≈75.12%,与预想的75%差不多
我要赚赏金
