STC15W1K08PWM的PCA模块做PWM,求助如何输出0%(持续低电平)?
芯片使用的是STC15W1K08PWMSOP28封装,PCA做两路PWM,剩余的6路PWM,合起来就是8路PWM。在0%的时候,6路PWM可以输出持续的低电平,但是CCP0和CCP1还是有一个脉冲。请做过的人告知一下,程序问题出在哪里?数据手册部分和单片机实际输出的波形,请看图片。我的代码,这是初始化部分:
void Init_PCA(void)
{
P1M1 = 0x00;
P1M0 = 0x00;
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1);
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
CCON = 0;
CL = 0;
CH = 0;
// CMOD = 0x02; // 1/2
// CMOD = 0x08; // 1/1
// CMOD = 0x0A; // 1/4
// CMOD = 0x0C; // 1/6
CMOD = 0x0E; // 1/8
// CMOD = 0x00; // 1/12
PCA_PWM0 = 0x01;
CCAP0H = CCAP0L = 0xff;
CCAPM0 = 0x42;
PCA_PWM1 = 0x01;
CCAP1H = CCAP1L = 0xff;
CCAPM1 = 0x42;
CR = 1;
}
这是PWM的占空比调节部分的程序:
void PWM_Set(unsigned charCH,unsigned char Wide)
{
if(CH==0)
{
if(Wide==0)
{
PCA_PWM0 = 0x01; //EPC0H =0;EPC0L =1;
CCAP0H =CCAP0L = 0xff;
CCAPM0 = 0x42;
}
else
{
PCA_PWM0 = 0x00; //EPC0H =0;EPC0L =0;
CCAP0H = CCAP0L =255-Wide;
}
}
else if(CH==1)
{
if(Wide==0)
{
PCA_PWM1 = 0x01; //EPC0H =0;EPC0L =1;
CCAP1H =CCAP1L = 0xff;
CCAPM1 = 0x42;
}
else
{
PCA_PWM1 = 0x00; //EPC0H =0;EPC0L =0;
CCAP1H = CCAP1L =255-Wide;
}
}
} 都没有人回复,估计很少人,想我一样用PCA来做PWM输出了。 为了让PWM引脚输出为0,可以采用把PWM引脚改回GPIO功能,且把引脚拉低的办法。例如:
CCAP0H=255;//占空比为0
CR=0;//关PWM定时器
CCAPM0=0x00;//把引脚改回GPIO
PWM=0; //引脚输出低电平
除了上述改引脚功能的办法,STC的手册上还提到了一种解决方法,就是再加个EPC0H=1即可。例如:
CCAP0H=255;//占空比为0
PCA_PWM0=0X02;
EPC0H位于PCA_PWM0寄存器的bit1. linghu886 发表于 2018-4-12 10:51
都没有人回复,估计很少人,想我一样用PCA来做PWM输出了。
刚刚看到,你心太急了。{:biggrin:} su33691 发表于 2018-4-12 11:19
刚刚看到,你心太急了。
感谢你的回复?第一种方法是最终妥协的办法,我们讨论第二种方法。数据手册写的是EPC0L 来操作输出恒高还是恒低,没有说EPC0H呀?而且我也操作了EPC0L。我再看一下数据手册。确定一下。 linghu886 发表于 2018-4-12 11:46
感谢你的回复?第一种方法是最终妥协的办法,我们讨论第二种方法。数据手册写的是EPC0L 来操作输出恒高还 ...
我想请教一下,陈述句用问号结尾的人我见过很多,一直不明白是什么意思,能给说说吗? No.5 发表于 2018-4-12 13:33
我想请教一下,陈述句用问号结尾的人我见过很多,一直不明白是什么意思,能给说说吗? ...
用问号「❓」,的确不对。当时打字的时候没有留意符号。刚刚试了一下,用pad也编辑不成功。在这补充重申一下,那个问号应该用「句号」。 因为EPC0H的值是要装入到EPC0L中。所以给EPC0H赋值为1就会使EPC0L==1。这样才会输出0%。 su33691 发表于 2018-4-12 16:46
因为EPC0H的值是要装入到EPC0L中。所以给EPC0H赋值为1就会使EPC0L==1。这样才会输出0%。 ...
void Init_PCA(void)
{
P1M1 = 0x00;
P1M0 = 0x00;
ACC = P_SW1;
ACC &= ~(CCP_S0 | CCP_S1);
P_SW1 = ACC; //(P1.2/ECI, P1.1/CCP0, P1.0/CCP1, P3.7/CCP2)
CCON = 0;
CL = 0;
CH = 0;
// CMOD = 0x02; // 1/2
// CMOD = 0x08; // 1/1
// CMOD = 0x0A; // 1/4
// CMOD = 0x0C; // 1/6
CMOD = 0x0E; // 1/8
// CMOD = 0x00; // 1/12
PCA_PWM0 = 0x02;
CCAP0H = CCAP0L = 0xff;
CCAPM0 = 0x42;
PCA_PWM1 = 0x02;
CCAP1H = CCAP1L = 0xff;
CCAPM1 = 0x42;
CR = 1;
}
这是PWM的占空比调节部分的程序:
void PWM_Set(unsigned charCH,unsigned char Wide)
{
if(CH==0)
{
if(Wide==0)
{
PCA_PWM0 = 0x02; //EPC0H =0;EPC0L =1;
CCAP0H =CCAP0L = 0xff;
}
else
{
PCA_PWM0 = 0x00; //EPC0H =0;EPC0L =0;
CCAP0H = CCAP0L =255-Wide;
}
}
else if(CH==1)
{
if(Wide==0)
{
PCA_PWM1 = 0x02; //EPC0H =0;EPC0L =1;
CCAP1H =CCAP1L = 0xff;
}
else
{
PCA_PWM1 = 0x00; //EPC0H =0;EPC0L =0;
CCAP1H = CCAP1L =255-Wide;
}
}
}
这样就好使了。感谢不耐其烦的技术支持。
我晕。我怎么成了技术支持?我与STC没有半毛钱关系。
以前我也受到这个问题的困扰,并把解决方法分享出来。仅此而已。 要设置EPC0H=1,每个PWM周期开始会自动拷贝到EPC0L。我要连续输出0,设置EPC0H=1即可。 设置初始电平为高,跳变计数值T1 T2大于周期计数值就不会发生跳变了,就一直输出的是高电平! 也遇到这个问题了,看了帖子很快解决。感谢各位! 记下,遇到相同问题时可参考, 小李非刀 发表于 2018-4-13 14:24
要设置EPC0H=1,每个PWM周期开始会自动拷贝到EPC0L。我要连续输出0,设置EPC0H=1即可。 ...
请教 其他PWM2~PWM7 怎么设置出PWM信号,STC-ISP上面 没例程,将15W4K的例程运行,也没PWM信号出来。
我用的是STC15W1K16PWM zeroXone 发表于 2020-7-5 23:05
请教 其他PWM2~PWM7 怎么设置出PWM信号,STC-ISP上面 没例程,将15W4K的例程运行,也没PWM信号出来。
我 ...
OK了,6路PWM。
居然是IO口的模式没设置好。
先用这个代码 调到能输出PWM,再细看各个寄存器的作用来进行调试,调出自己需要的波形。
void PWMinit2(void)
{
P_SW2 |= 0x80;
PWMCFG = 0x00; //配置PWM的输出初始电平为低电平
PWMCKS = 0x0f; //选择PWM的时钟为Fosc/(0+1)
PWMC = CYCLE; //设置PWM周期,定义PWM周期(最大值为32767)
PWMCFG |= 0x0F;
PWM2CR = 0x00; //选择PWM2输出到P3.7,不使能PWM2中断
PWM3CR = 0x00;
PWM4CR = 0x00;
PWM2T1 = 0x000F;
PWM2T2 = 0;
PWM3T1 = 0x000F;
PWM3T2 = 0;
PWM4T1 = 0x000F;
PWM4T2 = 0;
PWMCR |= 0x3F;
P_SW2 &=~0x80;
PWMCR |= 0x80; //使能PWM模块
}
zeroXone 发表于 2020-7-5 23:05
请教 其他PWM2~PWM7 怎么设置出PWM信号,STC-ISP上面 没例程,将15W4K的例程运行,也没PWM信号出来。
我 ...
STC官网的实验箱4的例程里有6路PWM同时输出的例程,还有输出互补的SPWM例程。
页:
[1]