找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3948|回复: 7
收起左侧

stc15w4k32单片机pwm程序求教

[复制链接]
ID:461428 发表于 2019-1-12 20:08 来自手机 | 显示全部楼层 |阅读模式
单片机stc15w4k32.有自带pwm模块。看数据手册写下如下渐亮灯程序。。下载后木有反应。。把知道哪错了。。拜托大神指教。。。谢谢
mmexport1547294737523.jpg
回复

使用道具 举报

ID:213173 发表于 2019-1-13 08:13 | 显示全部楼层
本帖最后由 wulin 于 2019-1-13 10:21 编辑

特殊功能寄存器的配置通常用字节设置,多数不支持位操作。
给你一个PWM呼吸灯示例参考,MCU型号15W404AS,按默认CCP0输出端P1.1。注意特殊功能寄存器的配置与STC15W4K32有所区别。
#include <STC15F2K60S2.H>//15系列头文件
#define uint unsigned int
#define uchar unsigned char
//sbit key1=P4^2;        
//sbit key2=P4^4;        
sbit LED=P1^0;
uchar num=0x00;
bit a=0;
uint b;
void PWM_Init()
{
        CCON = 0;                        //初始化PCA控制寄存器
                                                                                                //PCA定时器停止
                                                                                                //清除CF标志
                                                                                                //清除模块中断标志
        CL = 0;                          //复位PCA寄存器
        CH = 0;
        CMOD = 0x02;                     //设置PCA时钟源,PWM频率=12MHZ/2/256=23.4375KHZ
                                                                                                //PWM频率=11.0592MHZ/2/256=21.600KHZ
        PCA_PWM0 = 0x00;                 //PCA模块0工作于8位PWM
        CCAP0H = CCAP0L = 0xff;          //PWM0的初始占空比为100%
        CCAPM0 = 0x42;                   //PCA模块0为8位PWM模式
        CR = 1;                          //PCA定时器开始工作
}
void scan()
{
        static uint count1=0,count2=0;        
        if(a==0)
        {
                count1++;
                if(count1>=2000)
                {                        
                        count1=0;
                        if(num<0xff)
                        {
                                num++;
                                if(num==0xff)
                                {
                                        a=1;
                                        b=5000;
                                        while(b--);
                                }
                        }
                }
        }
        else
        {
                count2++;
                if(count2>=2000)
                {                        
                        count2=0;
                        if(num>0)
                        {
                                num--;
                                if(num==0)
                                {
                                        a=0;
                                        b=5000;
                                        while(b--);
                                }
                        }
                }
        }
}

void main()
{
        P1M0 = 0x02;                        //P1.1推挽输出
        P1M1 = 0x00;                        //P1.1推挽输出
        PWM_Init();
        while(1)
        {
                scan();
                CCAP0H=num;
        }
}
回复

使用道具 举报

ID:461428 发表于 2019-1-13 17:04 来自手机 | 显示全部楼层
wulin 发表于 2019-1-13 08:13
特殊功能寄存器的配置通常用字节设置,多数不支持位操作。
给你一个PWM呼吸灯示例参考,MCU型号15W404AS, ...

谢谢你。。。如果有单片机自带的pwm模块输出pwm波的程序。。希望能拜读。。。
回复

使用道具 举报

ID:213173 发表于 2019-1-13 20:10 | 显示全部楼层
kissme 发表于 2019-1-13 17:04
谢谢你。。。如果有单片机自带的pwm模块输出pwm波的程序。。希望能拜读。。。

上面的程序就是用STC15W404AS自带PWM模块的示例程序
回复

使用道具 举报

ID:461428 发表于 2019-1-14 07:04 来自手机 | 显示全部楼层
wulin 发表于 2019-1-13 20:10
上面的程序就是用STC15W404AS自带PWM模块的示例程序

哦哦。。我的意思是连pca计数器都不用。。。直接用pwm模块的计数器。。。。。。谢谢耐心回答。。。。
回复

使用道具 举报

ID:461428 发表于 2019-1-16 11:04 来自手机 | 显示全部楼层
wulin 发表于 2019-1-13 20:10
上面的程序就是用STC15W404AS自带PWM模块的示例程序

上面的程序好像有点问题,循环语句。。。while(b--)位置应该不对。。
回复

使用道具 举报

ID:210959 发表于 2019-4-27 02:13 | 显示全部楼层
本帖最后由 51heizlxz 于 2019-4-27 17:24 编辑

最近也在学PWM,以下程序使用PWM通道,可以实现呼吸灯效果。楼主少设置东西了,比如 PWM2CR 是扩展的XSFR,需要先设置P_SW2|=0x80;才能读写,否则读取的是XRAM存储器。
而且在循环中改变PWM2T2的值,如果PWM波的周期没到就改变了呢?
我在中断里改PWM2T2的值,一个PWM周期变一次。
还有楼主好像也没有设置PWM周期 PWMC=3000;

#include "STC15W4K.H"

#define uchar unsigned char
#define uint  unsigned int

void PWM_CBIF() interrupt 22
{
  static uint idata a=1;
  static uint idata b=0;

  if(a==1)
  {
   b++;
   if(b==3000)
     a=0;
  }
  if(a==0)
  {
   b--;
   if(b==0)
   { a=1; b++; }
  }

  P_SW2|=0x80;
  PWM2T2=b;
  P_SW2&=0x0F;

  PWMIF=0;
}

void main()
{

P2M0=0;
P2M1=0;  //设置P2端口为准双向弱上拉
          //因系统上电后,与PWM有关的端口均为高阻态
          //所以,这里要设置为弱上拉状态
P_SW2|=0x80;

PWMCFG=0x00;    //配置PWM初始输出为低电平
PWMCKS=0x03;    //PWM使用系统时钟
PWMCR=0x01;     //PWM通道2输出使能
PWM2CR=0x08;    //PWM输出为P2.7

PWMC=3000;   

PWM2T1=0;   //第一次翻转的PWM计数值
PWM2T2=1;   //第二次翻转的PWM计数值

P_SW2&=0x0F;

PWMCR=0xC1;        //PWM计数器开始
EA=1;                   //开总中断

while(1)
{
  ;
}


}
回复

使用道具 举报

ID:210959 发表于 2019-4-27 02:26 | 显示全部楼层
楼主少设置东西了,PWM周期没有设置PWMC=3000;
PWM2CR和PWM2T2 等寄存器是扩展XSFR不能直接读写,
需要先设置 P_SW2|=0x80;否则读取的是XRAM存储器。
而且,如果在循环中改变PWM2T2的值好像不行,应该每个PWM周期改变一次PWM2T2的值。


回复

使用道具 举报

ID:210959 发表于 2019-4-27 08:57
呼吸灯效果:

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

本版积分规则

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

Powered by 单片机教程网

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