linghu886 发表于 2018-4-11 19:21:08

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;                               
      }
   }
}

linghu886 发表于 2018-4-12 10:51:48

都没有人回复,估计很少人,想我一样用PCA来做PWM输出了。

su33691 发表于 2018-4-12 11:17:49

为了让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.

su33691 发表于 2018-4-12 11:19:46

linghu886 发表于 2018-4-12 10:51
都没有人回复,估计很少人,想我一样用PCA来做PWM输出了。

刚刚看到,你心太急了。{:biggrin:}

linghu886 发表于 2018-4-12 11:46:05

su33691 发表于 2018-4-12 11:19
刚刚看到,你心太急了。

感谢你的回复?第一种方法是最终妥协的办法,我们讨论第二种方法。数据手册写的是EPC0L 来操作输出恒高还是恒低,没有说EPC0H呀?而且我也操作了EPC0L。我再看一下数据手册。确定一下。

No.5 发表于 2018-4-12 13:33:50

linghu886 发表于 2018-4-12 11:46
感谢你的回复?第一种方法是最终妥协的办法,我们讨论第二种方法。数据手册写的是EPC0L 来操作输出恒高还 ...

我想请教一下,陈述句用问号结尾的人我见过很多,一直不明白是什么意思,能给说说吗?

linghu886 发表于 2018-4-12 13:54:51

No.5 发表于 2018-4-12 13:33
我想请教一下,陈述句用问号结尾的人我见过很多,一直不明白是什么意思,能给说说吗? ...

用问号「❓」,的确不对。当时打字的时候没有留意符号。刚刚试了一下,用pad也编辑不成功。在这补充重申一下,那个问号应该用「句号」。

su33691 发表于 2018-4-12 16:46:04

因为EPC0H的值是要装入到EPC0L中。所以给EPC0H赋值为1就会使EPC0L==1。这样才会输出0%。

linghu886 发表于 2018-4-12 19:28:57

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;                                 
      }
   }
}

这样就好使了。感谢不耐其烦的技术支持。

su33691 发表于 2018-4-13 08:32:31

我晕。我怎么成了技术支持?我与STC没有半毛钱关系。
以前我也受到这个问题的困扰,并把解决方法分享出来。仅此而已。

小李非刀 发表于 2018-4-13 14:24:02

要设置EPC0H=1,每个PWM周期开始会自动拷贝到EPC0L。我要连续输出0,设置EPC0H=1即可。

tjx0512 发表于 2018-4-29 13:35:07

设置初始电平为高,跳变计数值T1 T2大于周期计数值就不会发生跳变了,就一直输出的是高电平!

mafeimafei 发表于 2020-5-9 11:00:42

也遇到这个问题了,看了帖子很快解决。感谢各位!

eddia2012 发表于 2020-6-19 15:24:29

记下,遇到相同问题时可参考,

zeroXone 发表于 2020-7-5 23:05:12

小李非刀 发表于 2018-4-13 14:24
要设置EPC0H=1,每个PWM周期开始会自动拷贝到EPC0L。我要连续输出0,设置EPC0H=1即可。 ...

请教 其他PWM2~PWM7 怎么设置出PWM信号,STC-ISP上面 没例程,将15W4K的例程运行,也没PWM信号出来。
我用的是STC15W1K16PWM

zeroXone 发表于 2020-7-6 07:22:26

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模块
   
}

小李非刀 发表于 2020-7-6 17:45:43

zeroXone 发表于 2020-7-5 23:05
请教 其他PWM2~PWM7 怎么设置出PWM信号,STC-ISP上面 没例程,将15W4K的例程运行,也没PWM信号出来。
我 ...

STC官网的实验箱4的例程里有6路PWM同时输出的例程,还有输出互补的SPWM例程。
页: [1]
查看完整版本: STC15W1K08PWM的PCA模块做PWM,求助如何输出0%(持续低电平)?