amobbs.com 阿莫电子论坛

 找回密码
 注册
搜索
bottom↓
回复: 16

STC15W1K08PWM的PCA模块做PWM,求助如何输出0%(持续低电平)?

[复制链接]
(70719202)

打赏出0元收入0元

发表于 2018-4-11 19:21:08 | 显示全部楼层 |阅读模式
芯片使用的是STC15W1K08PWM  SOP28封装,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 char  CH,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;                                 
      }
   }
}

STC15数据手册的943页

STC15数据手册的943页
STC2.jpg
(70663362)

打赏出0元收入0元

 楼主| 发表于 2018-4-12 10:51:48 | 显示全部楼层
都没有人回复,估计很少人,想我一样用PCA来做PWM输出了。
(70661801)

打赏出0元收入0元

发表于 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.
(70661684)

打赏出0元收入0元

发表于 2018-4-12 11:19:46 | 显示全部楼层
linghu886 发表于 2018-4-12 10:51
都没有人回复,估计很少人,想我一样用PCA来做PWM输出了。

刚刚看到,你心太急了。
(70660105)

打赏出0元收入0元

 楼主| 发表于 2018-4-12 11:46:05 | 显示全部楼层
su33691 发表于 2018-4-12 11:19
刚刚看到,你心太急了。

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

打赏出0元收入0元

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

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

打赏出0元收入0元

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

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

打赏出0元收入0元

发表于 2018-4-12 16:46:04 | 显示全部楼层
因为EPC0H的值是要装入到EPC0L中。所以给EPC0H赋值为1就会使EPC0L==1。这样才会输出0%。
(70632333)

打赏出0元收入0元

 楼主| 发表于 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 char  CH,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;                                 
      }
   }
}

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

打赏出0元收入0元

发表于 2018-4-13 08:32:31 | 显示全部楼层
我晕。我怎么成了技术支持?我与STC没有半毛钱关系。
以前我也受到这个问题的困扰,并把解决方法分享出来。仅此而已。
(70564228)

打赏出0元收入0元

发表于 2018-4-13 14:24:02 | 显示全部楼层
要设置EPC0H=1,每个PWM周期开始会自动拷贝到EPC0L。我要连续输出0,设置EPC0H=1即可。
(69184763)

打赏出0元收入0元

发表于 2018-4-29 13:35:07 | 显示全部楼层
设置初始电平为高,跳变计数值T1 T2大于周期计数值就不会发生跳变了,就一直输出的是高电平!
(5171628)

打赏出0元收入0元

发表于 2020-5-9 11:00:42 | 显示全部楼层
也遇到这个问题了,看了帖子很快解决。感谢各位!
(1613401)

打赏出0元收入0元

发表于 2020-6-19 15:24:29 来自手机 | 显示全部楼层
记下,遇到相同问题时可参考,
(203358)

打赏出0元收入0元

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

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

打赏出0元收入0元

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

OK了,6路PWM。
居然是IO口的模式没设置好。
先用这个代码 调到能输出PWM,再细看各个寄存器的作用来进行调试,调出自己需要的波形。
  1. void PWMinit2(void)
  2. {
  3.         P_SW2 |= 0x80;
  4.    PWMCFG = 0x00;                  //配置PWM的输出初始电平为低电平
  5.    PWMCKS = 0x0f;                  //选择PWM的时钟为Fosc/(0+1)
  6.    PWMC = CYCLE;                   //设置PWM周期,定义PWM周期(最大值为32767)
  7.    PWMCFG |= 0x0F;
  8.    PWM2CR = 0x00;                  //选择PWM2输出到P3.7,不使能PWM2中断   
  9.    PWM3CR = 0x00;
  10.    PWM4CR = 0x00;
  11.    PWM2T1 = 0x000F;               
  12.    PWM2T2 = 0;         
  13.    PWM3T1 = 0x000F;               
  14.    PWM3T2 = 0;         
  15.    PWM4T1 = 0x000F;               
  16.    PWM4T2 = 0;     
  17.    PWMCR |= 0x3F;
  18.    P_SW2 &=~0x80;
  19.    PWMCR |= 0x80;                  //使能PWM模块
  20.    
  21. }
复制代码
(136127)

打赏出0元收入0元

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

STC官网的实验箱4的例程里有6路PWM同时输出的例程,还有输出互补的SPWM例程。
回帖提示: 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号-1 )

GMT+8, 2020-7-8 07:34

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表