找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開始

搜索

stc15w4k32單片機(jī)pwm程序求教

查看數(shù): 4881 | 評(píng)論數(shù): 8 | 收藏 1
關(guān)燈 | 提示:支持鍵盤翻頁<-左 右->
    組圖打開中,請(qǐng)稍候......
發(fā)布時(shí)間: 2019-1-12 20:08

正文摘要:

單片機(jī)stc15w4k32.有自帶pwm模塊。看數(shù)據(jù)手冊(cè)寫下如下漸亮燈程序。。下載后木有反應(yīng)。。把知道哪錯(cuò)了。。拜托大神指教。。。謝謝

回復(fù)

ID:210959 發(fā)表于 2019-4-27 08:57
呼吸燈效果:
ID:210959 發(fā)表于 2019-4-27 02:26
樓主少設(shè)置東西了,PWM周期沒有設(shè)置PWMC=3000;
PWM2CR和PWM2T2 等寄存器是擴(kuò)展XSFR不能直接讀寫,
需要先設(shè)置 P_SW2|=0x80;否則讀取的是XRAM存儲(chǔ)器。
而且,如果在循環(huán)中改變PWM2T2的值好像不行,應(yīng)該每個(gè)PWM周期改變一次PWM2T2的值。


ID:210959 發(fā)表于 2019-4-27 02:13
本帖最后由 51heizlxz 于 2019-4-27 17:24 編輯

最近也在學(xué)PWM,以下程序使用PWM通道,可以實(shí)現(xiàn)呼吸燈效果。樓主少設(shè)置東西了,比如 PWM2CR 是擴(kuò)展的XSFR,需要先設(shè)置P_SW2|=0x80;才能讀寫,否則讀取的是XRAM存儲(chǔ)器。
而且在循環(huán)中改變PWM2T2的值,如果PWM波的周期沒到就改變了呢?
我在中斷里改PWM2T2的值,一個(gè)PWM周期變一次。
還有樓主好像也沒有設(shè)置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;  //設(shè)置P2端口為準(zhǔn)雙向弱上拉
          //因系統(tǒng)上電后,與PWM有關(guān)的端口均為高阻態(tài)
          //所以,這里要設(shè)置為弱上拉狀態(tài)
P_SW2|=0x80;

PWMCFG=0x00;    //配置PWM初始輸出為低電平
PWMCKS=0x03;    //PWM使用系統(tǒng)時(shí)鐘
PWMCR=0x01;     //PWM通道2輸出使能
PWM2CR=0x08;    //PWM輸出為P2.7

PWMC=3000;   

PWM2T1=0;   //第一次翻轉(zhuǎn)的PWM計(jì)數(shù)值
PWM2T2=1;   //第二次翻轉(zhuǎn)的PWM計(jì)數(shù)值

P_SW2&=0x0F;

PWMCR=0xC1;        //PWM計(jì)數(shù)器開始
EA=1;                   //開總中斷

while(1)
{
  ;
}


}
ID:461428 發(fā)表于 2019-1-16 11:04
wulin 發(fā)表于 2019-1-13 20:10
上面的程序就是用STC15W404AS自帶PWM模塊的示例程序

上面的程序好像有點(diǎn)問題,循環(huán)語句。。。while(b--)位置應(yīng)該不對(duì)。。
ID:461428 發(fā)表于 2019-1-14 07:04
wulin 發(fā)表于 2019-1-13 20:10
上面的程序就是用STC15W404AS自帶PWM模塊的示例程序

哦哦。。我的意思是連pca計(jì)數(shù)器都不用。。。直接用pwm模塊的計(jì)數(shù)器。。。。。。謝謝耐心回答。。。。
ID:213173 發(fā)表于 2019-1-13 20:10
kissme 發(fā)表于 2019-1-13 17:04
謝謝你。。。如果有單片機(jī)自帶的pwm模塊輸出pwm波的程序。。希望能拜讀。。。

上面的程序就是用STC15W404AS自帶PWM模塊的示例程序
ID:461428 發(fā)表于 2019-1-13 17:04
wulin 發(fā)表于 2019-1-13 08:13
特殊功能寄存器的配置通常用字節(jié)設(shè)置,多數(shù)不支持位操作。
給你一個(gè)PWM呼吸燈示例參考,MCU型號(hào)15W404AS, ...

謝謝你。。。如果有單片機(jī)自帶的pwm模塊輸出pwm波的程序。。希望能拜讀。。。
ID:213173 發(fā)表于 2019-1-13 08:13
本帖最后由 wulin 于 2019-1-13 10:21 編輯

特殊功能寄存器的配置通常用字節(jié)設(shè)置,多數(shù)不支持位操作。
給你一個(gè)PWM呼吸燈示例參考,MCU型號(hào)15W404AS,按默認(rèn)CCP0輸出端P1.1。注意特殊功能寄存器的配置與STC15W4K32有所區(qū)別。
#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定時(shí)器停止
                                                                                                //清除CF標(biāo)志
                                                                                                //清除模塊中斷標(biāo)志
        CL = 0;                          //復(fù)位PCA寄存器
        CH = 0;
        CMOD = 0x02;                     //設(shè)置PCA時(shí)鐘源,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定時(shí)器開始工作
}
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;
        }
}

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表