myqiang1990 发表于 2011-5-18 11:49:49

用过STC的PWM的朋友来看看

我有一块STC的12LEA560S2好像是这个芯片(以前一直没用过),今天用了它的PWM一下,发现PWM的占空比不能改变!!无语!!固定的占空比倒是可以,但是我想在程序中用按键来改变PWM的占空比,程序如下:
#include"stc.h"

#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x)    (255-(128*x/50))//设定占空比
#define PDXBIT(x)       (0x01<<x)
#define REGBIT(x)       (0x01<<x)
sbit KEY1=P1^2;
unchar DUTYCYCLES;//占空比
void Delay(unint x)
{
   unint y;
   for(;x>0;x--)
    for(y=500;y>0;y--);
}
void MainInt()        //
{       
    //P4SW|==REGBIT(4);//将P4口设置为输出
    P1M1=0x00;
        P1M0|=REGBIT(4)|REGBIT(3);//设置P1.4,3口为强推挽输出
        //AUXR1|=REGBIT(6);//将PWM0和PWM1从P1.3/P1.4移到P4.2/P4.3
        CMOD|=REGBIT(1);//选择SYSCLK为PWM的时钟源//控制PWM波的频率
        CCAPM0|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM0
        CCAPM1|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM1
        CL=0x00;//计数器清零
        CH=0x00;
        CCAP0L=DUTYCYCLE(20);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
        CCAP0H=DUTYCYCLE(20);//占空比计算公式256-(80/x=50/128)=XX,
        CCAP1L=DUTYCYCLE(20);
        CCAP1H=DUTYCYCLE(20);
        CCON|=REGBIT(6);//启动PWM
}
void KeyScan(void)
{
   if(!KEY1)
    {
           Delay(100);
           while(!KEY1);
           CCON&=~REGBIT(6);
           DUTYCYCLES+=10;//占空比每次加10
           if(DUTYCYCLES>100)
          DUTYCYCLES=0;
           CL=0x00;//计数器清零
           CH=0x00;
           CCAP0L=DUTYCYCLE(DUTYCYCLES);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
           CCAP0H=DUTYCYCLE(DUTYCYCLES);//占空比计算公式256-(80/x=50/128)=XX,
           CCAP1L=DUTYCYCLE(DUTYCYCLES);
           CCAP1H=DUTYCYCLE(DUTYCYCLES);
           CCON|=REGBIT(6);//启动PWM
        }
}
void main(void)
{
   MainInt();
   while(1)
    {
           KeyScan();
           /*Delay(5000);
           MainInt(DUTYCYCLES+40);
           Delay(5000);
           MainInt(DUTYCYCLES+30);*/
        }
}

myqiang1990 发表于 2011-5-18 13:34:32

解决。。
/*******************************************************************
*工程名称: STC的PWM测试
*创建人:陈志强
*创建时间: 2011年5月18号
*隶属模块: STC.C
*产考资料:STC手册
*模块说明: STC8位PWM测试,通过按键改变占空比,0%-100%,PWM波在P1^3和
                   P1^4口输出,这两个端口要串联600欧姆左右的电阻,不串也可以
                   只不过会有尖峰脉冲,不严重,也不影响使用,只是方波不美观!

                   控制车速的时候,只要把上述两个IO口接到L298N的EN1和EN2两个
                   控制口即可!
********************************************************************/
#include"stc.h"
/*******************************************************************
*函数名称:
*入口参数:
*出口参数:
*函数说明: 全局变量和位定义
********************************************************************/
#define unchar unsigned char
#define unint unsigned int
#define DUTYCYCLE(x)   (256-(128*x/50))//占空比计算公式256-(80/x=50/128)=XX,
#define PDXBIT(x)           (0x01<<x)
#define REGBIT(x)           (0x01<<x)
sbit KEY1=P1^2;
unint CYCLE;
/*******************************************************************
*函数名称: void Delay(unint x)
*入口参数: x:延时长度
*出口参数:
*函数说明: 不精确的延时
********************************************************************/
void Delay(unint x)
{
   unint y;
   for(;x>0;x--)
    for(y=500;y>0;y--);
}
/*******************************************************************
*函数名称: void MainInt()       
*入口参数:
*出口参数:
*函数说明: 主函数初始化
********************************************************************/
void MainInt()        //
{       
    //P4SW|==REGBIT(4);//将P4口设置为输出
        //AUXR1|=REGBIT(6);//将PWM0和PWM1从P1.3/P1.4移到P4.2/P4.3
    P1M1=0x00;
        P1M0|=REGBIT(4)|REGBIT(3);//设置P1.4,3口为强推挽输出
        CMOD|=REGBIT(1);//选择SYSCLK为PWM的时钟源//控制PWM波的频率
        CCAPM0|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM0
        CCAPM1|=REGBIT(1)|REGBIT(6);//允许比较器功能,开启PWM1
        CL=0x00;//计数器清零
        CH=0x00;
    CCAP0L=0x00;//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
    CCAP0H=0x00;
        CCAP1L=0x00;
        CCAP1H=0x00;
        CCON|=REGBIT(6);//启动PWM
}
/*******************************************************************
*函数名称: void KeyScan(void)       
*入口参数:
*出口参数:
*函数说明: 按键检查函数,用来调节PWM的占空比0%-100%
********************************************************************/
void KeyScan(void)
{
   if(!KEY1)
    {
          Delay(500);
          while(!KEY1);
          CYCLE+=10;
          if(CYCLE>100)
           CYCLE=0;
          CCAP0L=DUTYCYCLE(CYCLE);//自动装入初始值,控制PWM占空比靠着两个,大于这个数输出1,反之。。
      CCAP0H=DUTYCYCLE(CYCLE);//占空比计算公式256-(80/x=50/128)=XX,
      CCAP1L=DUTYCYCLE(CYCLE);
      CCAP1H=DUTYCYCLE(CYCLE);
        }
}
/*******************************************************************
*函数名称: void main(void)
*入口参数:
*出口参数:
*函数说明: 主函数
********************************************************************/
void main(void)
{
   MainInt();
   while(1)
    {
           KeyScan();
        }
}

afeibfp 发表于 2011-5-18 14:09:58

我是没发现问题,只是代码更加规范了一点啊.

myqiang1990 发表于 2011-5-19 00:03:03

回复【2楼】afeibfp 阿飞bfp
-----------------------------------------------------------------------
呵呵、、其实我也不知道为什么。。我把 unchar DUTYCYCLES;//占空比 改成 unint DUTYCYCLES;//占空比 就可以了。。。

danceman_uk 发表于 2011-5-20 17:59:44

PWM 看一下PDF

pengknight 发表于 2011-5-20 22:09:42

MARK

ERDTxiduoduo 发表于 2011-5-21 10:03:56

mark

xiaolei0428 发表于 2011-5-21 11:39:45

mark

cuikai12345 发表于 2011-5-21 11:56:50

MARK

jrcsh 发表于 2011-5-21 12:21:38

2个不同组织的人~~~抄过来的

5616 发表于 2011-5-21 15:45:13

myqiang1990 小松鼠
你PWM的占空比可以改变了不??成功了不

myqiang1990 发表于 2011-5-22 01:37:11

成功了。。。上面就是成功的程序。。。。程序比较规范的个程序就是成功的了。。0%-100%步进为10%

shunda 发表于 2011-5-22 01:37:59

学习了

myqiang1990 发表于 2011-5-22 01:41:08

回复【9楼】jrcsh 邪恶的小会会
-----------------------------------------------------------------------

呵呵、、其实都是我写的,就是看STC手册自己写的,,我在帮师弟写一个PWM的控制程序。。第一个程序是我为了省时间才写不规范的。。最后成功了,我才按照我的习惯加了注释。方便师弟理解。我写的程序一直是比较规范的。。第一个程序只不过是我图省时间而已。。。呵呵。。。

allen6kid 发表于 2011-5-25 09:49:58

好东西啊,学习了啊

tonyone 发表于 2011-5-25 11:03:11

mark

yuanfenfff 发表于 2011-5-25 11:52:39

马克

gtr__11208 发表于 2011-10-14 10:58:52

mark

hpdell 发表于 2011-12-8 10:59:25

顶顶的

Pony279 发表于 2011-12-8 12:10:49

回复【3楼】myqiang1990 小松鼠
回复【2楼】afeibfp 阿飞bfp
-----------------------------------------------------------------------
呵呵、、其实我也不知道为什么。。我把 unchar dutycycles;//占空比 改成 unint dutycycles;//占空比 就可以了。。。

-----------------------------------------------------------------------

楼主,
STC的占空比不是用9位控制的吗?
还有, CCAP0L和CCAP1L是不需要你来管的,
你要设置的是
CCAPxH和PCA_PWMx寄存器中的EPCxH   (x = 0 或 1)
对你的占空比真的可以调到0 和100%表示怀疑
你没有认真看datasheet

greatwall2 发表于 2011-12-8 13:34:29

我也用过STC PWM控制L298N调速,没发现什么问题

haozi007 发表于 2011-12-8 16:30:39

mark

xuyapple 发表于 2011-12-8 21:24:36

改变CCAP0L、CCAP0H的值就能改变占空比的,楼主可以看看杜洋老师的模板~
页: [1]
查看完整版本: 用过STC的PWM的朋友来看看