找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4637|回复: 9
打印 上一主题 下一主题
收起左侧

STC8单片机10位PWM不稳定

[复制链接]
跳转到指定楼层
楼主
ID:33998 发表于 2020-2-9 13:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
最近闲的无聊想试试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;               
}

在示波器上测试发现不稳定 那位有经验的大神能不能指点一下
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:548519 发表于 2020-3-13 20:11 | 只看该作者
我也测了10位的不稳定,
回复

使用道具 举报

板凳
ID:401564 发表于 2020-3-13 20:49 | 只看该作者
我看了那几十个寄存器,又这又那的,如果程序简单,还不如用定时器呢
回复

使用道具 举报

地板
ID:230975 发表于 2020-3-13 20:53 | 只看该作者
有没有试过STC8的自带的PWM
回复

使用道具 举报

5#
ID:230975 发表于 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);
}

回复

使用道具 举报

6#
ID:316880 发表于 2020-3-13 21:38 | 只看该作者
本帖最后由 余生不负 于 2020-3-13 22:17 编辑

这个10位的PWM,我也弄了好久也有问题,你要是解决了得话一定要分享一下。
回复

使用道具 举报

7#
ID:316880 发表于 2020-3-13 21:59 | 只看该作者
应该不是电源不稳点的问题,我刚才也试了一下,没有用示波器,只是用万用表看了一下电压的变化,一会快,一会慢
回复

使用道具 举报

8#
ID:316880 发表于 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的,不会用
回复

使用道具 举报

9#
ID:836598 发表于 2021-3-18 06:05 | 只看该作者
程序下载了,但是怎么测量呢,看不出是哪个端口输出呀,谢谢解答。我是STC8G1K的。
回复

使用道具 举报

10#
ID:25310 发表于 2021-3-18 08:03 | 只看该作者
估计是同15W的有些差别,懒得去研究,搞了一个板子测试发现不稳定放弃了,
有人搞清楚的话来个详解
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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