标题:
STC8单片机10位PWM不稳定
[打印本页]
作者:
jxrjamu
时间:
2020-2-9 13:33
标题:
STC8单片机10位PWM不稳定
最近闲的无聊想试试STC8 10位PWM 的效果折腾了一个下午没有搞出满意的程序
#include "STC8F.h"
#include "intrins.h"
unsigned char aa;
unsigned int aaa;
void main()
{
CCON = 0x00;
// CMOD=0x08; //sysclk
// CMOD=0x02; //sysclk/2
// CMOD=0x0a; //sysclk/4
// CMOD=0x0c; //sysclk/6
// CMOD=0x0e; //sysclk/8
CMOD=0x00; //sysclk/12
// CMOD=0x04; //定时器T0溢出作为时钟源 可以做出频率可变
CL = 0x00;
CH = 0x00;
CCAPM0 = 0x42; //PCA模块0为PWM工作模式
// PCA_PWM0 = 0xc0; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xc0; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xD4; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xE8; //PCA模块0输出10位PWM
// PCA_PWM0 = 0xFC; //PCA模块0输出10位PWM
CCAP0L = 0x20; //PWM占空比为96.875%[(400H-20H)/400H]
CCAP0H = 0x20;
CR = 1; //启动PCA计时器
TMOD|=0X00;//选择为定时器0模式,工作方式1,。
TL0 = 0x4C; //设置定时初值
TH0 = 0xFF; //设置定时初值
ET0=1;//打开定时器0中断允许
TR0=1;//打开定时器 //2毫秒@12.000MHz
EA=1;//打开总中断
while (1)
{
}
}
void time1() interrupt 1 //20毫秒@24.000MHz
{ //uint a1;
TL0 = 0xC0; //设置定时初值
TH0 = 0x63; //设置定时初值
aa++;
if(aa>5){aa=0;aaa++;}
if(aaa<256) PCA_PWM0 = 0xc0; //PCA模块0输出10位PWM
if(aaa>256&&aaa<512)PCA_PWM0 = 0xd4; //PCA模块0输出10位PWM
if(aaa>512&&aaa<768)PCA_PWM0 = 0xe8; //PCA模块0输出10位PWM
if(aaa>768) PCA_PWM0 = 0xfc; //PCA模块0输出10位PWM
CCAP0L = aaa;
CCAP0H = aaa;
if(aaa>1023)aaa=0;
}
在示波器上测试发现不稳定 那位有经验的大神能不能指点一下
作者:
qj0200
时间:
2020-3-13 20:11
我也测了10位的不稳定,
作者:
Y_G_G
时间:
2020-3-13 20:49
我看了那几十个寄存器,又这又那的,如果程序简单,还不如用定时器呢
作者:
hmgqljz111
时间:
2020-3-13 20:53
有没有试过STC8的自带的PWM
作者:
hmgqljz111
时间:
2020-3-13 20:58
有没有试过STC8的PWM,
#include "reg51.h"
#include "intrins.h"
//测试工作频率为11.0592MHz
sfr P_SW2 = 0xba;
sfr PWMCFG = 0xf1;
sfr PWMIF = 0xf6;
sfr PWMFDCR = 0xf7;
sfr PWMCR = 0xfe;
#define PWMC (*(unsigned int volatile xdata *)0xfff0)
#define PWMCKS (*(unsigned char volatile xdata *)0xfff2)
#define TADCP (*(unsigned int volatile xdata *)0xfff3)
#define PWM0T1 (*(unsigned int volatile xdata *)0xff00)
#define PWM0T2 (*(unsigned int volatile xdata *)0xff02)
#define PWM0CR (*(unsigned char volatile xdata *)0xff04)
#define PWM0HLD (*(unsigned char volatile xdata *)0xff05)
#define PWM1T1 (*(unsigned int volatile xdata *)0xff10)
#define PWM1T2 (*(unsigned int volatile xdata *)0xff12)
#define PWM1CR (*(unsigned char volatile xdata *)0xff14)
#define PWM1HLD (*(unsigned char volatile xdata *)0xff15)
#define PWM2T1 (*(unsigned int volatile xdata *)0xff20)
#define PWM2T2 (*(unsigned int volatile xdata *)0xff22)
#define PWM2CR (*(unsigned char volatile xdata *)0xff24)
#define PWM2HLD (*(unsigned char volatile xdata *)0xff25)
#define PWM3T1 (*(unsigned int volatile xdata *)0xff30)
#define PWM3T2 (*(unsigned int volatile xdata *)0xff32)
#define PWM3CR (*(unsigned char volatile xdata *)0xff34)
#define PWM3HLD (*(unsigned char volatile xdata *)0xff35)
#define PWM4T1 (*(unsigned int volatile xdata *)0xff40)
#define PWM4T2 (*(unsigned int volatile xdata *)0xff42)
#define PWM4CR (*(unsigned char volatile xdata *)0xff44)
#define PWM4HLD (*(unsigned char volatile xdata *)0xff45)
#define PWM5T1 (*(unsigned int volatile xdata *)0xff50)
#define PWM5T2 (*(unsigned int volatile xdata *)0xff52)
#define PWM5CR (*(unsigned char volatile xdata *)0xff54)
#define PWM5HLD (*(unsigned char volatile xdata *)0xff55)
#define PWM6T1 (*(unsigned int volatile xdata *)0xff60)
#define PWM6T2 (*(unsigned int volatile xdata *)0xff62)
#define PWM6CR (*(unsigned char volatile xdata *)0xff64)
#define PWM6HLD (*(unsigned char volatile xdata *)0xff65)
#define PWM7T1 (*(unsigned int volatile xdata *)0xff70)
#define PWM7T2 (*(unsigned int volatile xdata *)0xff72)
#define PWM7CR (*(unsigned char volatile xdata *)0xff74)
#define PWM7HLD (*(unsigned char volatile xdata *)0xff75)
void main()
{
P_SW2 = 0x80;
PWMCKS = 0x00; // PWM时钟为系统时钟
PWMC = 0x1000; //设置PWM周期为1000H个PWM时钟
PWM0T1= 0x0100; //在计数值为100H地方输出低电平
PWM0T2= 0x0500; //在计数值为500H地方输出高电平
PWM0CR= 0x80; //使能PWM0输出
P_SW2 = 0x00;
PWMCR = 0x80; //启动PWM模块
while (1);
}
作者:
余生不负
时间:
2020-3-13 21:38
本帖最后由 余生不负 于 2020-3-13 22:17 编辑
这个10位的PWM,我也弄了好久也有问题,你要是解决了得话一定要分享一下。
作者:
余生不负
时间:
2020-3-13 21:59
应该不是电源不稳点的问题,我刚才也试了一下,没有用示波器,只是用万用表看了一下电压的变化,一会快,一会慢
作者:
余生不负
时间:
2020-3-13 22:02
hmgqljz111 发表于 2020-3-13 20:58
有没有试过STC8的PWM,
#include "reg51.h"
#include "intrins.h"
PWM0T1= 0x0100; //在计数值为100H地方输出低电平
PWM0T2= 0x0500; //在计数值为500H地方输出高电平
有下载过这个程序,但是不知道这2个寄存器是怎么控制PWM的,不会用
作者:
hj50631
时间:
2021-3-18 06:05
程序下载了,但是怎么测量呢,看不出是哪个端口输出呀,谢谢解答。我是STC8G1K的。
作者:
pcbboy
时间:
2021-3-18 08:03
估计是同15W的有些差别,懒得去研究,搞了一个板子测试发现不稳定放弃了,
有人搞清楚的话来个详解
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1