PWM 两通道同时用有冲突
STC12C5A60S2void PCA_Init(void)
{ CL = 0;
CH = 0;
CCON = 0; //Initial PCA control register
CL = 0; //Reset PCA base timer
CH = 0;
CMOD = 0x02; //Set PCA timer clock source as Fosc/2
// CCAP0H = CCAP0L = 0x3F; //PWM0 port output 50% duty cycle square wave
// CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
// PCA_PWM1 = 0x03;
CCAP1H = CCAP1L = 0x80; //PWM0 port output 50% duty cycle square wave
CCAPM1 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt
PCA_PWM0 = 0x03;
//// AUXR1=
CR = 1; //PCA计数器启动CCON.6
// CMOD|=1<<0; //PCA溢出中断使能
}
这两个PWM通道不能同时使用。只能用一个,如两个同时都用就没有输出
这是怎么回事。资料上也没有说两PWM不能同时用。
可以同时用,只是共享 【CH,CL】 计数器而已 PCA有3个通道,共用计数器,作为PWM输出,频率相同,占空比可以不同
3通道10位PWM程序供参考:
void Init(void)
{
P_SW2|=EAXFR;
CCON=0x00; //设置PCA控制寄存器
CMOD=0x80; //设置空闲模式下PCA停止计数,禁止PCA计数器溢出中断,设置PCA时钟为系统时钟/12(900Hz)
CL=0x00; //设置PCA计数器
CH=0x00; //设置PCA计数器
CCAPM0=PWM0; //使能PCA模块0PWM功能
PCA_PWM0=0xc0; //设置PCA模块0输出10位PWM
CCAPM1=PWM1; //使能PCA模块1PWM功能
PCA_PWM1=0xc0; //设置PCA模块1输出10位PWM
CCAPM2=PWM2; //使能PCA模块2PWM功能
PCA_PWM2=0xc0; //设置PCA模块2输出10位PWM
CR=1; //启动PCA
EA=1; //使能总中断
}
void PWM_Out(unsigned int pwm_0,pwm_1,pwm_2)
{
unsigned char temp_l,temp_h,temp;
temp_l=pwm_0&0x00ff; //读pwm_0低8位赋值给temp_l
temp_h=(pwm_0&0x0300)>>4; //读pwm_0高2位,移动到XCCAP0H(PCA_PWM0)位置,赋值给temp_h
temp=PCA_PWM0&0xcd; //读PCA_PWM0,XCCAP2H(PCA_PWM0)、EPC0H(PCA_PWM0)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_0==0x03ff) //如果pwm_0最大
temp_h|=0x02; //设置EPC0H(PCA_PWM0)为1
PCA_PWM0=temp_h; //写PCA_PWM0(先写高2位)
CCAP0H=temp_l; //写CCAP0H(再写低8位)
temp_l=pwm_1&0x00ff; //读pwm_1低8位赋值给temp_l
temp_h=(pwm_1&0x0300)>>4; //读pwm_1高2位,移动到XCCAP1H(PCA_PWM1)位置,赋值给temp_h
temp=PCA_PWM1&0xcd; //读PCA_PWM1,XCCAP1H(PCA_PWM2)、EPC1H(PCA_PWM1)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_1==0x03ff) //如果pwm_1最大
temp_h|=0x02; //设置EPC1H(PCA_PWM1)为1
PCA_PWM1=temp_h; //写PCA_PWM1(先写高2位)
CCAP1H=temp_l; //写CCAP1H(再写低8位)
temp_l=pwm_2&0x00ff; //读pwm_2低8位赋值给temp_l
temp_h=(pwm_2&0x0300)>>4; //读pwm_2高2位,移动到XCCAP2H(PCA_PWM2)位置,赋值给temp_h
temp=PCA_PWM2&0xcd; //读PCA_PWM2,XCCAP2H(PCA_PWM2)、EPC2H(PCA_PWM2)清零后赋值给temp
temp_h|=temp; //写其他位到temph
if(pwm_2==0x03ff) //如果pwm_2最大
temp_h|=0x02; //设置EPC2H(PCA_PWM2)为1
PCA_PWM2=temp_h; //写PCA_PWM2(先写高2位)
CCAP2H=temp_l; //写CCAP2H(再写低8位)
}
DebugLab 发表于 2026-2-17 20:50
PCA有3个通道,共用计数器,作为PWM输出,频率相同,占空比可以不同
3通道10位PWM程序供参考:
芯片型号? gjbdthga 发表于 2026-2-17 21:50
芯片型号?
支持任意具有PCA功能的型号 DebugLab 发表于 2026-2-18 12:35
支持任意具有PCA功能的型号
STC12C5A60S2只有两个通道 9位的
别的不清楚
你这个作为个模块没有通用性 共用计数器CH、CL,占空比是各自独立设置的。
页:
[1]