女人自慰AV免费观看内涵网,日韩国产剧情在线观看网址,神马电影网特片网,最新一级电影欧美,在线观看亚洲欧美日韩,黄色视频在线播放免费观看,ABO涨奶期羡澄,第一导航fulione,美女主播操b

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

詳解單片機PMW控制基本原理

GReq_mcu168 ? 來源:玩轉單片機 ? 2020-08-04 17:17 ? 次閱讀

PWM是Pulse Width Modulation的縮寫,它的中文名字是脈沖寬度調制,一種說法是它利用微處理器的數字輸出來對模擬電路進行控制的一種有效的技術,其實就是使用數字信號達到一個模擬信號的效果。這是個什么概念呢?我們一步步來介紹。 首先從它的名字來看,脈沖寬度調制,就是改變脈沖寬度來實現不同的效果。我們先來看三組不同的脈沖信號,如圖所示。

圖 PWM 波形 這是一個周期是 10ms,即頻率是 100Hz 的波形,但是每個周期內,高低電平脈沖寬度各不相同,這就是 PWM 的本質。在這里大家要記住一個概念,叫做“占空比”。占空比是指高電平的時間占整個周期的比例。比如第一部分波形的占空比是 40%,第二部分波形占空比是 60%,第三部分波形占空比是 80%,這就是 PWM 的解釋。 那為何它能對模擬電路進行控制呢?大家想一想,我們數字電路里,只有 0 和 1 兩種狀態,比如我們第 2 章學會的點亮 LED 小燈那個程序,當我們寫一個 LED = 0;小燈就會長亮,當我們寫一個 LED = 1;小燈就會滅掉。當我們讓小燈亮和滅間隔運行的時候,小燈是閃爍。 如果我們把這個間隔不斷的減小,減小到我們的肉眼分辨不出來,也就是 100Hz 以上的頻率,這個時候小燈表現出來的現象就是既保持亮的狀態,但亮度又沒有 LED = 0;時的亮度高。那我們不斷改變時間參數,讓 LED = 0;的時間大于或者小于 LED = 1;的時間,會發現亮度都不一樣,這就是模擬電路的感覺了,不再是純粹的 0 和 1,還有亮度不斷變化。大家會發現,如果我們用 100Hz 的信號,如圖 10-1 所示,假如高電平熄滅小燈,低電平點亮小燈的話,第一部分波形熄滅 4ms,點亮 6ms,亮度最高,第二部分熄滅 6ms,點亮 4ms,亮度次之,第三部分熄滅 8ms,點亮 2ms,亮度最低。那么用程序驗證一下我們的理論,我們用定時器T0 定時改變 P0.0 的輸出來實現 PWM,與純定時不同的是,這里我們每周期內都要重載兩次定時器初值,即用兩個不同的初值來控制高低電平的不同持續時間。為了使亮度的變化更加明顯,程序中使用的占空比差距更大。

#includesbit PWMOUT = P0^0;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned char HighRH = 0; //高電平重載值的高字節unsigned char HighRL = 0; //高電平重載值的低字節unsigned char LowRH = 0; //低電平重載值的高字節unsigned char LowRL = 0; //低電平重載值的低字節void ConfigPWM(unsigned int fr, unsigned char dc);void ClosePWM();void main(){unsigned int i;EA = 1; //開總中斷ENLED = 0; //使能獨立 LEDADDR3 = 1;ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;while (1){ConfigPWM(100, 10); //頻率 100Hz,占空比 10%for (i=0; i40000; i++);ClosePWM();ConfigPWM(100, 40); //頻率 100Hz,占空比 40%for (i=0; i40000; i++);ClosePWM();ConfigPWM(100, 90); //頻率 100Hz,占空比 90%for (i=0; i40000; i++);ClosePWM(); //關閉 PWM,相當于占空比 100%for (i=0; i40000; i++);}}/* 配置并啟動 PWM,fr-頻率,dc-占空比 */void ConfigPWM(unsigned int fr, unsigned char dc){unsigned int high, low;unsigned long tmp;tmp = (11059200/12) / fr; //計算一個周期所需的計數值high = (tmp*dc) / 100; //計算高電平所需的計數值low = tmp - high; //計算低電平所需的計數值high = 65536 - high + 12; //計算高電平的重載值并補償中斷延時low = 65536 - low + 12;//計算低電平的重載值并補償中斷延時HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節HighRL = (unsigned char)high;LowRH = (unsigned char)(low>>8); //低電平重載值拆分為高低字節LowRL = (unsigned char)low;TMOD &= 0xF0; //清零 T0 的控制位TMOD |= 0x01; //配置 T0 為模式 1TH0 = HighRH; //加載 T0 重載值TL0 = HighRL;ET0 = 1; //使能 T0 中斷TR0 = 1; //啟動 T0PWMOUT = 1; //輸出高電平}/* 關閉 PWM */void ClosePWM(){TR0 = 0; //停止定時器ET0 = 0; //禁止中斷PWMOUT = 1; //輸出高電平}/* T0 中斷服務函數,產生 PWM 輸出 */void InterruptTimer0() interrupt 1{if (PWMOUT == 1){ //當前輸出為高電平時,裝載低電平值并輸出低電平TH0 = LowRH;TL0 = LowRL;PWMOUT = 0;}else{ //當前輸出為低電平時,裝載高電平值并輸出高電平TH0 = HighRH;TL0 = HighRL;PWMOUT = 1;}}

需要提醒大家的是,由于標準 51 單片機中沒有專門的 PWM 模塊,所以我們用定時器加中斷的方式來產生 PWM,而現在有很多的單片機都會集成硬件的 PWM 模塊,這種情況下需要我們做的就僅僅是計算一下周期計數值和占空比計數值然后配置到相關的 SFR 中即可,既使程序得到了簡化又確保了 PWM 的輸出品質(因為消除了中斷延時的影響)。 大家編譯下載程序后,會發現小燈從最亮到滅一共 4 個亮度等級。如果我們讓亮度等級更多,并且讓亮度等級連續起來,會產生一個小燈漸變的效果,與呼吸有點類似,所以我們習慣上稱之為呼吸燈,程序代碼如下,這個程序用了 2 個定時器 2 個中斷,這是我們第一次這樣用,大家可以學習一下。我們來試試這個程序,試完了大家一定要能自己把程序寫出來,切記。

#includesbit PWMOUT = P0^0;sbit ADDR0 = P1^0;sbit ADDR1 = P1^1;sbit ADDR2 = P1^2;sbit ADDR3 = P1^3;sbit ENLED = P1^4;unsigned long PeriodCnt = 0; //PWM 周期計數值unsigned char HighRH = 0; //高電平重載值的高字節unsigned char HighRL = 0; //高電平重載值的低字節unsigned char LowRH = 0; //低電平重載值的高字節unsigned char LowRL = 0; //低電平重載值的低字節unsigned char T1RH = 0; //T1 重載值的高字節unsigned char T1RL = 0; //T1 重載值的低字節void ConfigTimer1(unsigned int ms);void ConfigPWM(unsigned int fr, unsigned char dc);void main(){EA = 1; //開總中斷ENLED = 0; //使能獨立 LEDADDR3 = 1;ADDR2 = 1;ADDR1 = 1;ADDR0 = 0;ConfigPWM(100, 10); //配置并啟動 PWMConfigTimer1(50); //用 T1 定時調整占空比while (1);}/* 配置并啟動 T1,ms-定時時間 */void ConfigTimer1(unsigned int ms){unsigned long tmp; //臨時變量tmp = 11059200 / 12; //定時器計數頻率tmp = (tmp * ms) / 1000; //計算所需的計數值tmp = 65536 - tmp; //計算定時器重載值tmp = tmp + 12; //補償中斷響應延時造成的誤差T1RH = (unsigned char)(tmp>>8); //定時器重載值拆分為高低字節T1RL = (unsigned char)tmp;TMOD &= 0x0F; //清零 T1 的控制位TMOD |= 0x10; //配置 T1 為模式 1TH1 = T1RH; //加載 T1 重載值TL1 = T1RL;ET1 = 1; //使能 T1 中斷TR1 = 1; //啟動 T1}/* 配置并啟動 PWM,fr-頻率,dc-占空比 */void ConfigPWM(unsigned int fr, unsigned char dc){unsigned int high, low;PeriodCnt = (11059200/12) / fr; //計算一個周期所需的計數值high = (PeriodCnt*dc) / 100; //計算高電平所需的計數值low = PeriodCnt - high; //計算低電平所需的計數值high = 65536 - high + 12; //計算高電平的定時器重載值并補償中斷延時low = 65536 - low + 12; //計算低電平的定時器重載值并補償中斷延時HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節HighRL = (unsigned char)high;LowRH = (unsigned char)(low>>8); //低電平重載值拆分為高低字節LowRL = (unsigned char)low;TMOD &= 0xF0; //清零 T0 的控制位TMOD |= 0x01; //配置 T0 為模式 1TH0 = HighRH; //加載 T0 重載值TL0 = HighRL;ET0 = 1; //使能 T0 中斷TR0 = 1; //啟動 T0PWMOUT = 1; //輸出高電平}/* 占空比調整函數,頻率不變只調整占空比 */void AdjustDutyCycle(unsigned char dc){unsigned int high, low;high = (PeriodCnt*dc) / 100; //計算高電平所需的計數值low = PeriodCnt - high; //計算低電平所需的計數值high = 65536 - high + 12; //計算高電平的定時器重載值并補償中斷延時low = 65536 - low + 12; //計算低電平的定時器重載值并補償中斷延時HighRH = (unsigned char)(high>>8); //高電平重載值拆分為高低字節HighRL = (unsigned char)high;LowRH = (unsigned char)(low>>8); //低電平重載值拆分為高低字節LowRL = (unsigned char)low;}/* T0 中斷服務函數,產生 PWM 輸出 */void InterruptTimer0() interrupt 1{if (PWMOUT == 1){ //當前輸出為高電平時,裝載低電平值并輸出低電平TH0 = LowRH;TL0 = LowRL;PWMOUT = 0;}else{ //當前輸出為低電平時,裝載高電平值并輸出高電平TH0 = HighRH;TL0 = HighRL;PWMOUT = 1;}}/* T1 中斷服務函數,定時動態調整占空比 */void InterruptTimer1() interrupt 3{static bit dir = 0;static unsigned char index = 0;unsigned char code table[13] = { //占空比調整表5, 18, 30, 41, 51, 60, 68, 75, 81, 86, 90, 93, 95};TH1 = T1RH; //重新加載 T1 重載值TL1 = T1RL;AdjustDutyCycle(table[index]); //調整 PWM 的占空比if (dir == 0){ //逐步增大占空比index++;if (index >= 12){dir = 1;}}else{ //逐步減小占空比index--;if (index == 0){dir = 0;}}}

呼吸燈效果做出來后,利用這個基本原理,其它各種效果的燈光閃爍都應該可以做出來,大家看到的 KTV 里邊那絢麗的燈光閃爍,其實就是采用的 PWM 技術控制的。

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 模擬電路
    +關注

    關注

    125

    文章

    1590

    瀏覽量

    103691
  • PWM
    PWM
    +關注

    關注

    116

    文章

    5384

    瀏覽量

    218137
  • 脈沖信號
    +關注

    關注

    6

    文章

    402

    瀏覽量

    37489

原文標題:詳解單片機 PMW 控制基本原理

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦
    熱點推薦

    無刷電機電調的基本原理

    有關本文所談論的無刷電機內容, 只涉及低速飛行類航模電調的小功率無傳感器應用,講解的理論比較淺顯易懂 ,旨在讓初學者能夠對無刷電機有一個比較快的認 識,掌握基本原理控制方法,可以在短時間內達到
    發表于 03-17 19:57

    單片機中斷技術詳解

    在現代電子設備中,單片機作為控制核心發揮著舉足輕重的作用。而在其高效運作的背后,中斷機制是推動單片機實現實時響應與高效執行的關鍵因素。本文將深入探討單片機中的中斷概念、中斷系統的結構、
    的頭像 發表于 02-02 15:57 ?806次閱讀

    RNN的基本原理與實現

    RNN,即循環神經網絡(Recurrent Neural Network),是一種特殊類型的人工神經網絡,專門設計用于處理序列數據,如文本、語音、視頻等。以下是對RNN基本原理與實現的介紹: 一
    的頭像 發表于 11-15 09:49 ?1281次閱讀

    單片機出現故障怎么維修

    單片機出現故障時,維修過程需要系統地檢查和診斷,以確定故障的根本原因,并采取相應的修復措施。以下是一個詳細的單片機維修指南,旨在幫助技術人員或愛好者有效地解決單片機故障問題。
    的頭像 發表于 10-17 17:57 ?3420次閱讀

    三菱pmw程序轉單片機HEX工具

    這是一款將三菱PMW程序轉換成可直接下載至單片機的HEX文件的工具軟件
    發表于 10-09 11:02 ?5次下載

    單片機io口怎么配置成輸出口

    單片機IO口配置成輸出口的過程通常涉及對單片機內部寄存器的操作。不同型號的單片機在寄存器配置和編程方式上可能有所不同,但基本原理是相似的。以下是一個通用的步驟,用于將
    的頭像 發表于 09-14 14:33 ?1452次閱讀

    單片機SPI通信實現

    在深入探討單片機(如基于STM32、AVR、PIC等)如何通過SPI(Serial Peripheral Interface)進行通信之前,我們先概述SPI通信的基本原理,隨后以STM32微控制器為例,詳細解釋如何配置SPI接口
    的頭像 發表于 09-09 17:00 ?1444次閱讀

    單片機boot0和boot1怎么設置

    單片機Boot0和Boot1簡介 Boot0和Boot1是單片機啟動模式選擇引腳,用于選擇單片機的啟動模式。 Boot0和Boot1的設置方式因單片機型號而異,但
    的頭像 發表于 08-22 09:50 ?5237次閱讀

    限流保護電路的基本原理

    限流保護電路的基本原理是一個復雜但至關重要的概念,它涉及到電子電路中電流控制的多個方面。這種電路的主要目的是在電流超過預設的安全閾值時,通過一系列機制來限制或切斷電流,從而保護電路中的元件和設備免受損壞。以下是對限流保護電路基本原理
    的頭像 發表于 08-19 17:55 ?4000次閱讀

    SPWM控制技術的基本原理和應用領域

    脈寬調制,從而實現對電機轉速和轉矩的精確控制。以下是對SPWM控制技術的詳細闡述,包括其基本原理、關鍵技術、應用領域及優勢等方面。
    的頭像 發表于 08-14 17:58 ?4917次閱讀

    單片機復位電路電阻電容如何取值

    對復位電路的性能有著直接的影響。本文將介紹單片機復位電路電阻電容的取值方法。 1. 復位電路的基本原理 單片機復位電路的基本原理是在系統上電或異常情況下,通過外部信號或內部邏輯觸發,使
    的頭像 發表于 08-06 10:28 ?2072次閱讀

    無線充電技術的基本原理和應用領域

    無線充電技術作為近年來快速發展的電力傳輸方式,其基本原理和應用范圍廣泛,為人們的生活帶來了極大的便利。以下將詳細闡述無線充電技術的基本原理、主要類型、技術優勢以及在不同領域的應用。
    的頭像 發表于 07-26 17:56 ?5053次閱讀

    神經網絡的基本原理

    神經網絡,作為人工智能領域的一個重要分支,其基本原理和運作機制一直是人們研究的熱點。神經網絡的基本原理基于對人類大腦神經元結構和功能的模擬,通過大量的神經元相互連接、協同工作,實現對信息的處理、分析
    的頭像 發表于 07-01 11:47 ?2206次閱讀

    基于STM32單片機的智能冰箱控制系統設計

    基于單片機設計的一款智能冰箱控制系統,可以控制冰箱的制冷裝置,可以采集冰箱的異味濃度,超過閩值之后控制紫外燈進行消毒工作單片機采用
    的頭像 發表于 06-25 09:21 ?2124次閱讀
    基于STM32<b class='flag-5'>單片機</b>的智能冰箱<b class='flag-5'>控制</b>系統設計

    PWM控制技術的基本原理和特點

      在現代電子技術中,PWM(Pulse Width Modulation)控制技術扮演著至關重要的角色。它是一種通過對脈沖寬度的調制來模擬所需波形的技術,廣泛應用于測量、通信、功率控制與變換等眾多領域。本文將詳細闡述PWM控制
    的頭像 發表于 06-19 11:48 ?3153次閱讀