一区二区三区三上|欧美在线视频五区|国产午夜无码在线观看视频|亚洲国产裸体网站|无码成年人影视|亚洲AV亚洲AV|成人开心激情五月|欧美性爱内射视频|超碰人人干人人上|一区二区无码三区亚洲人区久久精品

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

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

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

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

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

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

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

圖片

首先,我們來了解幾個(gè)概念:

1、PWM頻率、PWM周期

圖片

這是一個(gè)約為50Hz的PWM輸出波形

圖片

這個(gè)PWM的周期約為20ms

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

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

2、占空比

圖片

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

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

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

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

圖片

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

不嚴(yán)謹(jǐn)?shù)卣f,這樣使用PWM確實(shí)能達(dá)到“模擬輸出”的效果,但如果真的需要模擬輸出,單單這樣是不夠的(所以前面標(biāo)了引號(hào)),在此不進(jìn)行細(xì)說。

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

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

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

2、過了n個(gè)t完成一個(gè)PWM周期;

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

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

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

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

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

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

因?yàn)?a target="_blank">51單片機(jī)的運(yùn)行頻率不高,PWM的頻率也不能設(shè)計(jì)得太高,過于頻繁地進(jìn)入中斷也會(huì)影響程序的正常運(yùn)行。

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

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

圖片

三、寫個(gè)程序試試看!

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

#include < reg52.h >


#define PWM_T 200                      //產(chǎn)生中斷的時(shí)間,因?yàn)槭?4MHz,200即100微秒(0.1毫秒)
#define LED P1


int PWM_count0 = 0;                    //進(jìn)入中斷的次數(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ù),打開了定時(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開始運(yùn)行


  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)                //完成了一個(gè)PWM周期,計(jì)數(shù)變量清零
  {
    PWM_count0 = 0;
  }
}

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

圖片

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

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

圖片

黃框里的為一個(gè)PWM周期

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

1、記得加while循環(huán),因?yàn)镻WM輸出是持續(xù)的,沒有循環(huán)就只會(huì)進(jìn)行一個(gè)周期;

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

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

#include < reg52.h >


#define PWM_T 200                      //產(chǎn)生中斷的時(shí)間,因?yàn)槭?4MHz,200即100微秒(0.1毫秒)
#define LED P1


int PWM_count0 = 0;                    //進(jìn)入中斷的次數(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ù),打開了定時(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開始運(yùn)行


  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)                //完成了一個(gè)PWM周期,計(jì)數(shù)變量清零
  {
    PWM_count0 = 0;
  }
}

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

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

    關(guān)注

    277

    文章

    5707

    瀏覽量

    126041
  • 定時(shí)器
    +關(guān)注

    關(guān)注

    23

    文章

    3273

    瀏覽量

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

    關(guān)注

    7

    文章

    81

    瀏覽量

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

    關(guān)注

    3

    文章

    216

    瀏覽量

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

    關(guān)注

    1

    文章

    66

    瀏覽量

    5412
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    PWM應(yīng)用

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

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

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

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

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

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

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

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

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

    斬波器什么用

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

    vivoNEX雙屏版玩游戲怎么樣

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

    Tivoo像素音箱評(píng)測(cè) 音箱上也能玩出新花樣

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

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

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

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

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

    藍(lán)牙信標(biāo)定位什么用

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

    小米機(jī)器狗什么用

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

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

    STM32F103輸出一路PWM波形,完整源碼。示波器觀察輸出波形 序 言 1) 什么是PWM信號(hào) 2) 如何實(shí)現(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時(shí)代 還能玩出什么花?

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

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

    pcb仿真技術(shù)什么用
    的頭像 發(fā)表于 11-28 15:22 ?1435次閱讀