衡阳派盒市场营销有限公司

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

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

3天內(nèi)不再提示

PWM是什么?有什么用?PWM能玩出什么花樣?

冬至子 ? 來源:ZYuanBlogs ? 作者:激沄RagingWaves ? 2023-10-31 17:35 ? 次閱讀

一、PWM是什么?有什么用?

PWM指的是脈沖寬度調(diào)制技術(shù),通過對脈沖寬度的調(diào)節(jié)可以達到通信(如控制舵機)、模擬“模擬輸出”(如調(diào)節(jié)燈的亮度),前者在以后再結(jié)合舵機來講,本文側(cè)重講后者。

圖片

首先,我們來了解幾個概念:

1、PWM頻率、PWM周期

圖片

這是一個約為50Hz的PWM輸出波形

圖片

這個PWM的周期約為20ms

PWM頻率指1秒的時間里PWM運行的次數(shù);

PWM周期指一次完整的PWM輸出所使用的時間。

2、占空比

圖片

從上往下,占空比分別為25%、50%、75%

占空比指在一個周期內(nèi)接通的時間占這一周期的比例。

明白這些后,恭喜你已經(jīng)基本掌握PWM的原理了!

我們知道單片機的IO口只有0和1兩種輸出狀態(tài),只能控制LED的亮與滅,如果我們想要得到下面這樣的輸出效果,思考一下,結(jié)合PWM我們可以怎么做?

圖片

你可能已經(jīng)想到了,IO口保持高電平(1)時LED最亮,此時電壓為5V(以5V電壓工作的單片機為例),如果在里面插入低電平,輸出10101010...不就相當于輸出2.5V了嗎?

不嚴謹?shù)卣f,這樣使用PWM確實能達到“模擬輸出”的效果,但如果真的需要模擬輸出,單單這樣是不夠的(所以前面標了引號),在此不進行細說。

二、怎樣設(shè)計PWM程序?

我們先來構(gòu)造這么一個框架:

1、確定一個單位時間t,每個t內(nèi)固定地輸出0或1;

2、過了n個t完成一個PWM周期;

3、使用程序控制一個周期內(nèi)輸出1的數(shù)量為m,輸出0的數(shù)量為(n-m)。

有了上面的框架,設(shè)計程序就不難了:

我們可以使用定時器,每隔一定的時間進入一次中斷,并記錄進入中斷的次數(shù)x,直到完成一次PWM周期,將x歸零;

設(shè)我們所需要的PWM輸出占空比為y,當x<=y時輸出高電平,x>y時輸出低電平。

這樣,我們的程序基本就設(shè)計出來了,是不是很簡單?(〃'▽'〃)

在正式編寫程序前,我們還需要考慮一些小問題:

因為51單片機的運行頻率不高,PWM的頻率也不能設(shè)計得太高,過于頻繁地進入中斷也會影響程序的正常運行。

在下面的例程中,我所設(shè)置的定時器中斷的間隔為0.1ms,每20ms完成一次PWM周期。

在這一小節(jié)的最后,我們整理一下思路,可以得到下面的流程圖:

圖片

三、寫個程序試試看!

按上面的流程圖,我們就可以寫一個控制LED亮度的程序了:

#include < reg52.h >


#define PWM_T 200                      //產(chǎn)生中斷的時間,因為是24MHz,200即100微秒(0.1毫秒)
#define LED P1


int PWM_count0 = 0;                    //進入中斷的次數(shù)
int PWM0 = 100;                        //控制PWM的占空比,下同
int PWM1 = 170;
int PWM2 = 188;
int PWM3 = 198;


sbit LED0 = P1^0;                      //LED引腳定義,下同
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;


void PWM_Start()                      //PWM初始化函數(shù),打開了定時器0
{
  EA = 1;
  ET0 = 1;
  TMOD = 0x09;
  TR0 = 1;


  TH0 = (65536-PWM_T)/256;
  TL0 = (65536-PWM_T)%256;
}


void main()
{
  PWM_Start();                        //PWM開始運行


  while(1)
  {
    if(PWM_count0 <= PWM0)            //調(diào)節(jié)LED0的亮度
    {
      LED0 = 1;
    }
    else
    {
      LED0 = 0;
    }


    if(PWM_count0 <= PWM1)            //調(diào)節(jié)LED1的亮度
    {
      LED1 = 1;
    }
    else
    {
      LED1 = 0;
    }


    if(PWM_count0 <= PWM2)            //調(diào)節(jié)LED2的亮度
    {
      LED2 = 1;
    }
    else
    {
      LED2 = 0;
    }


    if(PWM_count0 <= PWM3)            //調(diào)節(jié)LED3的亮度
    {
      LED3 = 1;
    }
    else
    {
      LED3 = 0;
    }
  }
}


void Timer0() interrupt 1
{
  TH0 = (65536-PWM_T)/256;
  TL0 = (65536-PWM_T)%256;


  PWM_count0++;
  if(PWM_count0 == 200)                //完成了一個PWM周期,計數(shù)變量清零
  {
    PWM_count0 = 0;
  }
}

把上面的程序編譯后下載到開發(fā)板上:

圖片

小提示:人眼對亮度的感覺不是線性變化的,因此LED0與LED1雖然占空比相差較大,但肉眼感覺亮度不相上下,感興趣的可以去研究一下。

用邏輯分析儀收集一下IO口的輸出信息

圖片

黃框里的為一個PWM周期

上面的程序還有一些需要注意的地方:

1、記得加while循環(huán),因為PWM輸出是持續(xù)的,沒有循環(huán)就只會進行一個周期;

2、晶振頻率建議設(shè)置為24MHz,12MHz也可以,相應地定時器中斷時間也要更改。

我們可以將上面的程序進一步優(yōu)化,如果我們把if語句寫成子函數(shù),通過參數(shù)控制占空比,返回值控制0和1的輸出,程序會簡化很多:

#include < reg52.h >


#define PWM_T 200                      //產(chǎn)生中斷的時間,因為是24MHz,200即100微秒(0.1毫秒)
#define LED P1


int PWM_count0 = 0;                    //進入中斷的次數(shù)
int PWM0 = 100; //去掉7~10行                       //控制PWM的占空比,下同
int PWM1 = 170;
int PWM2 = 188;
int PWM3 = 198;


sbit LED0 = P1^0;                      //LED引腳定義,下同
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit LED3 = P1^3;


void PWM_Start()                      //PWM初始化函數(shù),打開了定時器0
{
  EA = 1;
  ET0 = 1;
  TMOD = 0x09;
  TR0 = 1;


  TH0 = (65536-PWM_T)/256;
  TL0 = (65536-PWM_T)%256;
}


int PWM(int PWM_value)                //控制PWM輸出的子函數(shù)
{
  if(PWM_count0 <= PWM_value)
  {
    return 1;
  }
  else
  {
    return 0;
  }
}


void main()
{
  PWM_Start();                        //PWM開始運行


  while(1)
  {
    LED0 = PWM(100);                  //調(diào)節(jié)LED0的亮度
    LED1 = PWM(170);                  //調(diào)節(jié)LED1的亮度
    LED2 = PWM(188);                  //調(diào)節(jié)LED2的亮度
    LED3 = PWM(198);                  //調(diào)節(jié)LED3的亮度
  }
}


void Timer0() interrupt 1
{
  TH0 = (65536-PWM_T)/256;
  TL0 = (65536-PWM_T)%256;


  PWM_count0++;
  if(PWM_count0 == 200)                //完成了一個PWM周期,計數(shù)變量清零
  {
    PWM_count0 = 0;
  }
}

可以看到,寫成子函數(shù)后調(diào)用PWM輸出方便了不少。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 51單片機
    +關(guān)注

    關(guān)注

    274

    文章

    5705

    瀏覽量

    124296
  • 定時器
    +關(guān)注

    關(guān)注

    23

    文章

    3255

    瀏覽量

    115371
  • 脈沖寬度調(diào)制
    +關(guān)注

    關(guān)注

    7

    文章

    81

    瀏覽量

    13789
  • 邏輯分析儀
    +關(guān)注

    關(guān)注

    3

    文章

    214

    瀏覽量

    23269
  • PWM輸出
    +關(guān)注

    關(guān)注

    1

    文章

    66

    瀏覽量

    5219
收藏 人收藏

    評論

    相關(guān)推薦

    PWM應用

    PWM
    橙群微電子
    發(fā)布于 :2023年03月09日 09:11:48

    【FPGA設(shè)計實例】JTAG讓你的FPGA玩出新花樣

    本帖最后由 eehome 于 2013-1-5 09:46 編輯 JTAG讓你的FPGA玩出新花樣第1部分:JTAG是什么?第2部分:JTAG如何的工作第3部分:查詢JTAG鏈第4部分:運行
    發(fā)表于 03-20 15:03

    stc單片機輸出pwm,旁邊再連上enc28j60模塊什么用

    芯片的stc12c5410ad,這芯片輸出pwm,然后再連上enc28j60網(wǎng)絡(luò)模塊,這網(wǎng)絡(luò)模塊什么用
    發(fā)表于 05-11 21:25

    請問PWM轉(zhuǎn)為線性電壓什么用

    單片機輸出PWM信號,經(jīng)過RC變換再經(jīng)過跟隨器輸出線性電壓,這樣
    發(fā)表于 04-16 06:48

    如何把手中的這顆LED燈玩出新花樣

    學會了如何點亮LED燈,那么接下來的就是如何把手中的這顆LED燈玩出新花樣,在上一篇文章的基礎(chǔ)上這次我加入了按鍵去抖和LED呼吸燈的程序。根據(jù)電路原理圖可知,按鍵一端分別連接PA0和PA1,另一端連接GND。也就是說當PA0或PA1按下的時候,按鍵與GND導通,使得IO端口短接到...
    發(fā)表于 01-24 07:35

    斬波器什么用

    斬波器什么用找來一個東西象電子管的樣子,全金屬封裝,7腳,常州繼電器廠出的。ZB-2-6.3    6.3v/50HZ。不知干什么用的,請教大家。  lszsw回復
    發(fā)表于 11-10 10:28 ?1866次閱讀

    vivoNEX雙屏版玩游戲怎么樣

    雙屏版獨特的設(shè)計在拍照方面玩出花樣,而作為一名游戲玩家,我發(fā)現(xiàn)它還能玩出更多花樣
    的頭像 發(fā)表于 01-07 10:07 ?1.3w次閱讀

    Tivoo像素音箱評測 音箱上也能玩出新花樣

    藍牙音箱品牌很多,但是能玩出花的不多。
    的頭像 發(fā)表于 03-12 10:33 ?2642次閱讀

    PWM的占空比是什么東西PWM什么優(yōu)點

    pwm也即脈寬調(diào)制,在現(xiàn)實中,pwm在諸多器件中均有所應用。在往期文章中,小編對pwm的原理、調(diào)制方法有所介紹。為增進大家對pwm的了解程度,本文將對
    的頭像 發(fā)表于 12-12 09:55 ?5.5w次閱讀
    <b class='flag-5'>PWM</b>的占空比是什么東西<b class='flag-5'>PWM</b><b class='flag-5'>有</b>什么優(yōu)點

    PWM的詳細介紹和PWM頻率與PWM值的區(qū)別說明

    對于pwm,想必很多朋友都有所耳聞。但是,大家對于pwm真的了解嗎?譬如,pwm頻率是如何被確定下來的?pwm頻率和pwm值是同一個東西嗎?
    的頭像 發(fā)表于 12-12 09:55 ?4.4w次閱讀
    <b class='flag-5'>PWM</b>的詳細介紹和<b class='flag-5'>PWM</b>頻率與<b class='flag-5'>PWM</b>值的區(qū)別說明

    藍牙信標定位什么用

    藍牙信標定位什么用
    的頭像 發(fā)表于 07-28 14:11 ?1w次閱讀

    小米機器狗什么用

    小米機器狗什么用
    的頭像 發(fā)表于 08-12 09:33 ?1.4w次閱讀

    STM32F103輸出一路PWM波形,完整源碼。示波器觀察輸出波形

    STM32F103輸出一路PWM波形,完整源碼。示波器觀察輸出波形 序 言 1) 什么是PWM信號 2) 如何實現(xiàn)
    發(fā)表于 01-14 16:06 ?25次下載
    <b class='flag-5'>用</b>STM32F103輸出一路<b class='flag-5'>PWM</b>波形,<b class='flag-5'>有</b>完整源碼。<b class='flag-5'>用</b>示波器觀察輸出波形

    MWCS 2023丨5G時代 還能玩出什么花?

    原文標題:MWCS 2023丨5G時代 還能玩出什么花? 文章出處:【微信公眾號:中興通訊】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
    的頭像 發(fā)表于 06-26 15:55 ?351次閱讀

    pcb仿真技術(shù)什么用

    pcb仿真技術(shù)什么用
    的頭像 發(fā)表于 11-28 15:22 ?1192次閱讀
    百家乐规则技法| 德州扑克偷鸡| 广东百家乐官网扫描分析仪| 赌博百家乐赢钱方法| 蒙特卡罗娱乐场| 香港六合彩的开奖结果| 百家乐官网赌博破解| 威尼斯人娱乐城 老品牌值得信赖| 澳门百家乐官网娱乐开户| 百家乐永利娱乐网| 百家乐官网有什么打法| 百家乐java| 摩纳哥百家乐官网娱乐城 | 西乌珠穆沁旗| 百家乐赌场怎么玩| 百家乐官网免费试玩游戏| 百家乐正式版| 澳门百家乐官网真人版| 老k百家乐的玩法技巧和规则| 百家乐官网2棋牌作弊软件| 全讯网3| 机器百家乐官网心得| 德州扑克论坛| 百家乐赌场作弊| 大发在线德州扑克| 广州百家乐酒店用品制造有限公司 | 亚洲百家乐的玩法技巧和规则| 赌博百家乐官网游戏| 大发888网站是多少| 百家乐官网专打方法| 大发扑克官方网站| 百家乐汝河路| 金百亿百家乐官网娱乐城| 威尼斯人娱乐城真人游戏| 百家乐官网德州扑克发牌盒| 嘉义市| 悍马百家乐的玩法技巧和规则 | 大发888截图| 百家乐赢钱密籍| 网上百家乐官网的技巧| 威尼斯人娱乐城百家乐赌博|