STC的PCA工作于PWM时,设置的占空比值是输出低电平的时间值。要高电平的,取反一下。 PCA-PWM连续输出0或1的方法,以PCA0(PWM0-CCP0)为例: PCA_PWM0 &= ~0x02; // PWM0正常输出 PCA_PWM0 |= 0x3f, CCAP0H = 0xff, CCAP0L = 0xff; // PWM0一直输出0 PCA_PWM0 &= 0xc0, CCAP0H = 0, CCAP0L = 0; // PWM0一直输出1 |
15031773670 发表于 2023-4-9 07:59 谢谢,尝试过了,加下拉电阻没有效果,还是会存在大概200ns的高电平。 |
Qibaobao 发表于 2023-4-6 21:25 需要默认低电平需要加下接电路。加10K电阴到GND |
Qibaobao 发表于 2023-4-8 21:32 这个问题在PWM占空比大于0%时反映不出来,当需要占空比绝对等于0%时,虽然这个脉冲很窄,处理起来很麻烦。宏晶的产品手册没有相关介绍,官方例程也没有见到处理方法。以往做的一个工程就是遇到这种情况,摸索了好长时间。最终选择:STC15W408AS单片机的PWM默认输出口设置0或1不会影响PWM正常输出,并可以在3个IO口之间切换。利用这个特点,PWM默认输出口置0,正常工作。当需要占空比绝对等于0%时,将PWM默认输出口转到其他空闲脚或根本没有外部引脚的端口。当事脚就能保持纯低电平。当时这个工程使用STC15W408AS-16,只用了一路PWM0,默认输出口P1.1,使用特殊功能寄存器AUXR1|=0x10;转到CCP_2。需要恢复时AUXR1&=0xcf;再切换回来。虽然这个问题成功解决,但有没有更好的解决方法不得而知。 |
Qibaobao 发表于 2023-4-6 21:25 void PWM_Init(void) { CCON = 0; //初始化PCA控制寄存器 CL = 0; //复位PCA寄存器 CH = 0; //复位PCA寄存器 // CMOD = 0x00; //设置PCA时钟源,PWM频率=11.0592MHZ/12/256=3.600KHZ 278us // CMOD = 0x02; //设置PCA时钟源,PWM频率=11.0592MHZ/2/256=21.600KHZ 46us // CMOD = 0x04; //设置PCA时钟源,PWM频率= 定时器溢出11.0592MHZ/1~65536/256=43.200KHZ~0.659HZ // CMOD = 0x06; //设置PCA时钟源,PWM频率= 外部时钟/1/256 // CMOD = 0x08; //设置PCA时钟源,PWM频率=11.0592MHZ/1/256=43.200KHZ 23us // CMOD = 0x0A; //设置PCA时钟源,PWM频率=11.0592MHZ/4/256=10.800KHZ 93us // CMOD = 0x0C; //设置PCA时钟源,PWM频率=11.0592MHZ/6/256=7.200KHZ 139us CMOD = 0x0E; //设置PCA时钟源,PWM频率=11.0592MHZ/8/256=5.400KHZ 185us PCA_PWM0 = 0x00; //PCA模块0工作于8位PWM PCA_PWM1 = 0x00; //PCA模块1工作于8位PWM CCAP0H = CCAP0L = 0xFF; //PWM0的占空比为0%,0x00占空比为100% CCAP1H = CCAP1L = 0xFF; //PWM1的占空比为0%,0x00占空比为100% CCAP2H = CCAP2L = 0xFF; //PWM1的占空比为0%,0x00占空比为100% CCAPM0 = 0x42; //允许CCP0脚用作脉宽调节输出 CCAPM1 = 0x42; //允许CCP1脚用作脉宽调节输出 CCAPM2 = 0x42; //允许CCP1脚用作脉宽调节输出 CR = 1; //PCA定时器开始工作 } |
PCA_PWM0,PCA_PWM1,PCA_PWM2想用这三路控制上桥,有没有办法默认输出低电平 |