用过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);*/
}
} 解决。。
/*******************************************************************
*工程名称: 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();
}
} 我是没发现问题,只是代码更加规范了一点啊. 回复【2楼】afeibfp 阿飞bfp
-----------------------------------------------------------------------
呵呵、、其实我也不知道为什么。。我把 unchar DUTYCYCLES;//占空比 改成 unint DUTYCYCLES;//占空比 就可以了。。。 PWM 看一下PDF MARK mark mark MARK 2个不同组织的人~~~抄过来的 myqiang1990 小松鼠
你PWM的占空比可以改变了不??成功了不 成功了。。。上面就是成功的程序。。。。程序比较规范的个程序就是成功的了。。0%-100%步进为10% 学习了 回复【9楼】jrcsh 邪恶的小会会
-----------------------------------------------------------------------
呵呵、、其实都是我写的,就是看STC手册自己写的,,我在帮师弟写一个PWM的控制程序。。第一个程序是我为了省时间才写不规范的。。最后成功了,我才按照我的习惯加了注释。方便师弟理解。我写的程序一直是比较规范的。。第一个程序只不过是我图省时间而已。。。呵呵。。。 好东西啊,学习了啊 mark 马克 mark 顶顶的 回复【3楼】myqiang1990 小松鼠
回复【2楼】afeibfp 阿飞bfp
-----------------------------------------------------------------------
呵呵、、其实我也不知道为什么。。我把 unchar dutycycles;//占空比 改成 unint dutycycles;//占空比 就可以了。。。
-----------------------------------------------------------------------
楼主,
STC的占空比不是用9位控制的吗?
还有, CCAP0L和CCAP1L是不需要你来管的,
你要设置的是
CCAPxH和PCA_PWMx寄存器中的EPCxH (x = 0 或 1)
对你的占空比真的可以调到0 和100%表示怀疑
你没有认真看datasheet 我也用过STC PWM控制L298N调速,没发现什么问题 mark 改变CCAP0L、CCAP0H的值就能改变占空比的,楼主可以看看杜洋老师的模板~
页:
[1]