久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 22166|回復(fù): 15
打印 上一主題 下一主題
收起左側(cè)

分享兩種STC15定時器模擬PWM的方法

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:146949 發(fā)表于 2017-3-12 17:06 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
剛剛搜了一下,發(fā)現(xiàn)壇里還沒有這樣分析PWM的帖子,然后發(fā)了一個。
手電LED控制或馬達(dá)轉(zhuǎn)速控制都離不開PWM,下面有兩種方法可以模擬PWM的。如果不正確希望各位指教。



//用定時器裝載方式模擬PWM,這種方法PWM周期短,分辯率高,1毫秒內(nèi)可以做到11000格分辯率,
//缺點:高低電平會的百分之一格不受控制
#include "reg51.h"
#include<intrins.h>
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr AUXR      = 0x8e;//輔助寄存器
sbit P20   = P2^0; //PWM輸出腳   
sbit P17   = P1^7; //按鍵增量
sbit P16   = P1^6; //按鍵減少   
unsigned int HIGHDUTY,LOWDUTY;//高低時間存放寄存器
unsigned char num;//記錄分辯個數(shù)
bit flag;
void Delayms(unsigned int ms)//1mS@11.0592MHz
{unsigned char i, j;
        while(ms--)
        {        _nop_();
        _nop_();
        _nop_();
                i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);}
}
void main()
{  
        P0M0 = 0x00;
        P0M1 = 0x00;
        P1M0 = 0x00;
        P1M1 = 0x00;
        P2M0 = 0x00;
        P2M1 = 0x00;
        P3M0 = 0x00;
        P3M1 = 0x00;
        AUXR = 0x80;        //定時器0為1T模式
        TMOD &= 0xf0;       //設(shè)置定時器0為模式0(16位自動重裝載)
        TR0 = 1;            //定時器0開始計時
        ET0 = 1;            //使能定時器0中斷
        EA = 1;
        HIGHDUTY=54477+(11058/255)*num;
        LOWDUTY=54477+(11058/255)*(256-num);
    while (1)
        {
       if(!P17)
        {
        Delayms(90);         
         if(!P17)
        {
        //while(!P17);
        num++;             //按制分辯率,uchar字符型范圍0~255格
        HIGHDUTY=54477+(11058/255)*num;/*求占空比高位,0xD4CD = 54477;
        程序裝載初始值54477一直跑到65535共花時間1000微秒,
        65535-54477=11058,11058就是1000微秒。
        (11058再除以分辯率255)等于一格所需的時間,要點空比高位多少就剩多少 */
        LOWDUTY=54477+(11058/255)*(255-num);//求占空比高位低位
         }
       }
         if(!P16)
        {
        Delayms(90);         
         if(!P16)
        {
        //while(!P16);
        num--;                        
        HIGHDUTY=54477+(11058/255)*num;
        LOWDUTY=54477+(11058/255)*(255-num);//
         }
       }
    }
}
void tm0() interrupt 1//定時器0中斷服務(wù)程序
{
   flag = !flag;
    if (flag)//反轉(zhuǎn)標(biāo)志去執(zhí)行高低電平的時間   
    {
        TL0 = HIGHDUTY;                //設(shè)置定時初值
        TH0 = HIGHDUTY>>8;//設(shè)置定時初值
        P20=1;//輸出高電位
    }
    else
    {
        TL0 = LOWDUTY;                //設(shè)置定時初值
        TH0 = LOWDUTY>>8;        //設(shè)置定時初值
        P20=0;//輸出低電位
    }
}

---------------------------------------------------------------------------------------------------------------------------


//用定時器計算方式模擬PWM,高低電平容易控制
//缺點:這種方法周期能做到1KHz以內(nèi),大多數(shù)馬達(dá)或調(diào)光設(shè)置會閃爍
#include "reg51.h"
#include<intrins.h>
sfr P0M1 = 0x93;
sfr P0M0 = 0x94;
sfr P1M1 = 0x91;
sfr P1M0 = 0x92;
sfr P2M1 = 0x95;
sfr P2M0 = 0x96;
sfr P3M1 = 0xb1;
sfr P3M0 = 0xb2;
sfr P4M1 = 0xb3;
sfr P4M0 = 0xb4;
sfr P5M1 = 0xC9;
sfr P5M0 = 0xCA;
sfr P6M1 = 0xCB;
sfr P6M0 = 0xCC;
sfr P7M1 = 0xE1;
sfr P7M0 = 0xE2;
sfr AUXR      = 0x8e;//輔助寄存器
sbit P20   = P2^0; //PWM輸出腳   
sbit P17   = P1^7; //按鍵增量
sbit P16   = P1^6; //按鍵減少   
unsigned char num;//記錄分辯個數(shù)
void Delayms(unsigned int ms)                //1mS@11.0592MHz
{unsigned char i, j;
        while(ms--)
        {        _nop_();
        _nop_();
        _nop_();
                i = 11;
        j = 190;
        do
        {
                while (--j);
        } while (--i);}
}
void main()
{   P0M0 = 0x00;
    P0M1 = 0x00;
    P1M0 = 0x00;
    P1M1 = 0x00;
    P2M0 = 0x00;
    P2M1 = 0x00;
    P3M0 = 0x00;
    P3M1 = 0x00;
    AUXR = 0x80;            //定時器0為1T模式
    TMOD &= 0xf0;           //設(shè)置定時器0為模式0(16位自動重裝載)
    TR0 = 1;                //定時器0開始計時
    ET0 = 1;                //使能定時器0中斷
    EA = 1;
    num=10;  //給初始值
    while (1)
        {
       if(!P17)
        {
        Delayms(10);         
         if(!P17)
        {        
                num++;
         }
       }
        if(!P16)
         {
        Delayms(10);         
         if(!P16)
        {
                num--;
         }
       }
    }
}
void tm0() interrupt 1//定時器0中斷服務(wù)程序
{ static unsigned char k;
        TL0 = 0xF5;        //設(shè)置定時初值 按1T時鐘計算,1uS一次
        TH0 = 0xFF;        //設(shè)置定時初值 按1T時鐘計算,1uS一次
        k++;
        if(k>num)P20=1;//輸出高電位
        else P20=0;//輸出低電位
}

評分

參與人數(shù) 2黑幣 +112 收起 理由
catlu + 12
admin + 100 回帖助人的獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏12 分享淘帖 頂1 踩

相關(guān)帖子

回復(fù)

使用道具 舉報

沙發(fā)
ID:146949 發(fā)表于 2017-3-12 23:01 | 只看該作者
終于知道第一種PWM為什么會不受控了。因為定時器內(nèi)指令執(zhí)行時間過長超出定時器設(shè)定的時間時會導(dǎo)致系統(tǒng)崩潰。
當(dāng)定時器賦值為TH0=0xFF,TL0=0xFF時,那怕是在定時器內(nèi)運行很少的指令也很可能會導(dǎo)致指令未執(zhí)行完就溢出了。
所以如果有人用第一種PWM時,切記賦值不要過大"TH0=0xFF,TL0=0xFF"否則會有問題。。!
回復(fù)

使用道具 舉報

板凳
ID:167357 發(fā)表于 2017-3-13 07:04 | 只看該作者
學(xué)習(xí)了@@
回復(fù)

使用道具 舉報

地板
ID:170318 發(fā)表于 2017-3-13 14:20 | 只看該作者
謝謝樓主啦!!分享很好
回復(fù)

使用道具 舉報

5#
ID:175439 發(fā)表于 2017-3-28 19:11 | 只看該作者
樓主,你這個我怎么弄不成PWM波呢,反應(yīng)都沒有
回復(fù)

使用道具 舉報

6#
ID:146949 發(fā)表于 2017-3-28 20:16 | 只看該作者
jgp886585 發(fā)表于 2017-3-28 19:11
樓主,你這個我怎么弄不成PWM波呢,反應(yīng)都沒有

你用的是什么單片機?我是在STC15W4kK58S4的平臺上試的,有兩個按鍵可以調(diào)加大的減小占空比。我都在示波器上試過的。你用其他型號的單片機注意有些IO初始化和AUXR寄存器等要設(shè)置。
回復(fù)

使用道具 舉報

7#
ID:175439 發(fā)表于 2017-3-29 11:20 | 只看該作者
wosiyabo 發(fā)表于 2017-3-28 20:16
你用的是什么單片機?我是在STC15W4kK58S4的平臺上試的,有兩個按鍵可以調(diào)加大的減小占空比。我都在示波 ...

我是STC15W1K16S,我按照你的第一種方式來弄的,弄了之后燈能點亮,但是怎么弄亮度都不變,謝謝!
回復(fù)

使用道具 舉報

8#
ID:175439 發(fā)表于 2017-3-29 11:44 | 只看該作者
還有樓主,輸出腳不需要設(shè)置成推挽么?謝謝
回復(fù)

使用道具 舉報

9#
ID:65956 發(fā)表于 2018-11-19 11:51 | 只看該作者
謝謝您的分享,謝謝你的經(jīng)驗分享!
回復(fù)

使用道具 舉報

10#
ID:499701 發(fā)表于 2019-7-5 13:08 | 只看該作者
第二種方法用過,的確頻率跑不高,我做的最高才300hz
回復(fù)

使用道具 舉報

11#
ID:94449 發(fā)表于 2020-2-29 10:31 | 只看該作者
wosiyabo 發(fā)表于 2017-3-12 23:01
終于知道第一種PWM為什么會不受控了。因為定時器內(nèi)指令執(zhí)行時間過長超出定時器設(shè)定的時間時會導(dǎo)致系統(tǒng)崩潰 ...

是說第一種方式不好,要用第二種?
回復(fù)

使用道具 舉報

12#
ID:94449 發(fā)表于 2020-2-29 10:37 | 只看該作者
//缺點:高低電平會的百分之一格不受控制

這句怎么理解呢?
回復(fù)

使用道具 舉報

13#
ID:833307 發(fā)表于 2020-11-3 14:06 | 只看該作者
是不是再搞一臺示波器,哎 ,小白很迷茫啊
回復(fù)

使用道具 舉報

14#
ID:833307 發(fā)表于 2020-11-3 14:08 | 只看該作者
wosiyabo 發(fā)表于 2017-3-12 23:01
終于知道第一種PWM為什么會不受控了。因為定時器內(nèi)指令執(zhí)行時間過長超出定時器設(shè)定的時間時會導(dǎo)致系統(tǒng)崩潰 ...

回復(fù)

使用道具 舉報

15#
ID:298713 發(fā)表于 2022-8-17 09:12 | 只看該作者
本帖最后由 wjw7680 于 2022-8-17 15:49 編輯

第二個程序根本實現(xiàn)不了PWM,只要中斷11次,k值就會超過num,P20=1一直輸出高電平。第一個也有問題,定時器初值在TR0=0時對TL0,TH0賦初值才有效。中斷內(nèi)沒有TR0=0,沒法改變定時器內(nèi)的TL0,TH0。這個程序估計是直接抄來的,沒驗證過
回復(fù)

使用道具 舉報

16#
ID:447334 發(fā)表于 2025-3-16 16:02 | 只看該作者
這種最高頻率也超不過去2k吧?
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

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

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

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 91精品导航| 国产福利资源在线 | 欧美黄色网 | 天堂网中文字幕在线观看 | 在线观看 亚洲 | 中文字字幕一区二区三区四区五区 | 亚洲国产精品一区 | 欧美日韩在线免费观看 | 国产成人jvid在线播放 | 日本成人中文字幕 | 岛国一区 | 亚洲黄色一级 | 久久一区二区三区四区五区 | 毛片视频观看 | 色伊人久久 | 国产精品久久久久久久7电影 | 中日字幕大片在线播放 | 日韩在线看片 | 欧美一区二区网站 | 国产精品美女久久久久久免费 | 在线毛片网 | 日韩精品一区二区三区 | 午夜视频免费在线观看 | 中文字幕久久精品 | 欧洲一区二区在线 | 深爱激情综合 | 欧美激情欧美激情在线五月 | a级性视频 | 午夜精品在线观看 | 久草新在线 | 国产在线观看一区二区 | 欧美a区 | 久久精品亚洲 | 美女操网站 | 久久91精品 | 国产欧美精品一区二区 | 免费在线看黄视频 | 亚洲一区二区三区在线播放 | 国产精品99久久久久久久久 | 国产精品视频网 | 日韩精品视频在线 |