利用PWM原理,實現呼吸燈功能

2021-02-23 程式設計師小哈
實驗目標

利用STM32定時器產生PWM信號;

利用PWM信號實現呼吸燈。

什麼是PWM信號呢?

PWM,英文名Pulse Width Modulation。 

PWM信號是一種脈寬調製信號,廣範用於LED和電機控制等場合。

PWM信號其實類似於方波,只有0和1兩種狀態。

PWM信號可以調節佔空比。

不同佔空比可以使LED產生不同的亮度。

佔空比就是指在一個周期內, 信號處於高電平的時間佔據整個信號周期的百分比, 例如上圖中所示脈衝的佔空比就是25%。

PWM波可以由GPIO口產生,通過GPIO口輸出高電平,延時,輸出低電平,延時來產生PWM波。

還可以使用定時器,利用比較寄存器形成PWM。

本實驗就是利用PWM信號這一特性控制LED產生不同亮度,從而實現呼吸燈的效果。

PWM信號應用場景

我們經常見到的就是交流調光電路,高電平佔多一點,也就是佔空比大一點亮度就亮一點,佔空比小一點亮度就沒有那麼亮,前提是PWM的頻率要大於我們人眼識別頻率,要不然會出現閃爍現象。

除了在調光電路應用,還有在直流斬波電路、蜂鳴器驅動、電機驅動、逆變電路、加溼機霧化量等都會有應用。

PWM信號如何輸出呢?

1)可以直接通過晶片內部模塊輸出PWM信號,前提是這個I/O口要有PWM集成模塊,自帶PWM功能的晶片只需要簡單幾步操作即可實現PWM功能。這種自帶有PWM輸出的功能模塊在程序設計更簡便,同時數據更精確。如下圖,一般的IO口都會標明這個GPIO是否是PWM口; 

STM32單片機就是標識如下形式:TIMx_CHy這樣的形式,下圖中所示的PWM引腳即佔用TIM1的通道1。


2)但是如果IC內部沒有PWM功能模塊,或者要求不是很高的話可以利用I/O口結合定時器輸出PWM信號,因為PWM信號其實就是一高一低的一系列電平組合在一起。具體方法是給I/O加一個定時器,輸出的PWM信號頻率與你的定時器一致,用定時器中斷來計數,但是這種方法一般不採用,除非對於精度、頻率等要求不是很高可以這樣實現。


LED使用的引腳:

原理圖

由上面的原理圖可知,當LED1和LED2引腳為高電平的時候,LED滅;當引腳為低電平的時候,LED亮。

一個周期內低電平佔比越來越少,高電平佔空比越來越高,LED越來越暗。

具體實現

1.  LED引腳PB8、PB9初始化

注意 GPIO_Mode 要設置為:GPIO_Mode_AF_PP

void LED_Init(void)
{
 
 GPIO_InitTypeDef  GPIO_InitStructure;
  
 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
 
 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8|GPIO_Pin_9;
 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; 
 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
 GPIO_Init(GPIOB, &GPIO_InitStructure);
}

2. TIM4_CH3和TIM4_CH4初始化

void Led_PWM_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
    TIM_OCInitTypeDef       TIM_OCInitStructure;
    NVIC_InitTypeDef        NVIC_InitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);   

    LED_Init();

    TIM_DeInit(TIM4);

    /* Time Base configuration */
    TIM_TimeBaseStructure.TIM_Period            = arr;
    TIM_TimeBaseStructure.TIM_Prescaler         = psc;
    TIM_TimeBaseStructure.TIM_CounterMode       = TIM_CounterMode_Up;
    TIM_TimeBaseStructure.TIM_ClockDivision     = 0;
    TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;

    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);

    TIM_OCInitStructure.TIM_OCMode             = TIM_OCMode_PWM2;
    TIM_OCInitStructure.TIM_OutputState        = TIM_OutputState_Enable;  
    TIM_OCInitStructure.TIM_Pulse                   = 0;  
    TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
    TIM_OC3Init(TIM4, &TIM_OCInitStructure);
    TIM_OC4Init(TIM4, &TIM_OCInitStructure);

    TIM_CtrlPWMOutputs(TIM4, ENABLE);
 
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);
 
    TIM_ARRPreloadConfig(TIM4, ENABLE);
    
    TIM_Cmd(TIM4, ENABLE);
}

其中參數arr為重載值,psc為TIMx時鐘頻率的預分頻係數。

設置定時器的周期:

PWM的周期一般要設置到50Hz以上,否則,我們會看到明顯的視覺閃爍。

設置定時器的周期需要改變ARR和PSC兩個寄存器的值來控制輸出PWM的周期。

在STM32的庫函數中, 

TIM_TimeBaseStructure.TIM_Period即設置的ARR寄存器,溢出計數值,(如有中斷)達到這個值就中斷,對應參數arr;

TIM_TimeBaseStructure.TIM_Prescaler即設置的PSC寄存器,對應預分頻係數參數psc。

TIM_TimeBaseStructure.TIM_Period = arr;
TIM_TimeBaseStructure.TIM_Prescaler =psc;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  

Led_PWM_Init(899, 0);

psc為0,表示初始化PWM對應的定時器不分頻,仍舊為72MHz,arr為899,代表PWM的頻率為:72000/(899+1)=80KHz。周期等於頻率的倒數,即1/80KHz=12.5us。

while(1) 
{  
    //呼吸燈
    if(dir)
        led0pwmval++;   
    else 
        led0pwmval--;      

    if(led0pwmval>900)
        dir=0;   
    if(led0pwmval==0)
        dir=1;             

    TIM_SetCompare3(TIM4,led0pwmval);   //CH3 綠色
    TIM_SetCompare4(TIM4,led0pwmval);   //CH4 紅色  

    delay_ms(1); 
}

其中代碼:

TIM_SetCompare3(TIM4,led0pwmval);   //CH3 綠色
TIM_SetCompare4(TIM4,led0pwmval);   //CH4 紅色

就是調節定時器TIM4的通道3和通道4的佔空比,當計數時間達到led0pwmval時電平翻轉,比如默認0-arr都為高電平,如TIM_SetCompare的值為arr/2,就是0-arr/2 為低電平,arr/2-arr為高電平,佔空比 50%。


TIM_SetCompare設置的值就是設置的CCRx。由上面的圖可知,CCRx/ARR就是佔空比,由於佔空比不能大於1,CCRx的值肯定不能大於ARR了。

比如我們執行如下代碼:

TIM_SetCompare3(TIM4,450);   //CH3 綠色
TIM_SetCompare4(TIM4,450);   //CH4 紅色

示波器中可以看到如下效果:


從上我們可以看到: 

脈衝頻率是:80KHz

周期是:12.50us

佔空比:50% (450/(899+1)) 

跟上面的我們設置的值是一致的。

實現的效果

視頻中的板子就是2020.06每月活動智能風扇使用的板子。

由核心板+底板的形式組成,待月底全部功能實現並驗證沒有問題之後,開源原理圖和PCB圖給大家下載自行搭建測試。

本文的PWM控制LED實現呼吸燈的原理,其實就是我們控制風扇轉速的原理,有了本節課的知識,我們就可以控制風扇的轉速了。



相關焦點

  • 呼吸燈原理(非PWM實現方式)
    1.呼吸燈原理分析:模擬人體呼吸,吸氣和呼氣各佔1.5S,人眼的圖像滯留時間0.04s(1/24幀畫面),按最快0.04s算,就是40ms。亮0.02S,滅0.02s,人眼看到的應該是一直亮(可以實驗)。2.呼吸燈程序設計:就是改變這40ms中,亮和滅所佔的百分比(40ms相對不柔和,20ms效果柔和)。
  • PWM(脈寬調製)——LED特效呼吸燈設計
    限時乾貨下載:回復「教程」獲取單片機電子書,回復「仿真」獲取Proteus仿真資料,百度盤群組分享連結更新時間:2016-03-06,失效請在文末留言,不要在後臺留言  簡述PWM  PWM——脈寬調製信號(Pulse Width Modulation),它利用微處理器的數字輸出來實現
  • 脈寬調製原理- -PWM原理
    導讀:脈寬調製技術,顧名思義,可通過對脈衝寬度的調整來完成某種功能的技術,那麼其究竟是如何來完成對脈衝寬度的調整?其又可實現什麼功能呢?
  • PWM原理
    因此本文主要介紹PWM原理,對電力電子感興趣的同學關注一下吧。。。本文引用地址:http://www.eepw.com.cn/article/275890.htm  脈寬調製(PWM,Pulse Width Modulation)是一種模擬控制方脈衝寬度調製,利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。
  • pwm呼吸燈原理及程序分享
    51單片機的Timer 用的單片機是STC89C52,其內部有3個16位Timer,分別為T/C0,T/C1,T/C2,通過配置相關寄存器即可實現Timer的功能控制。 運用PWM完成呼吸燈硬體電路
  • arduino從零開始(4)PWM與呼吸燈
    你將了解脈衝寬度調試(PWM)的原理你將使用PWM製作一個呼吸燈的效果脈衝寬度調試PWM,也就是脈衝寬度調製,用於將一段信號編碼為脈衝信號(方波信號)。是在數字電路中 達到 模擬輸出效果的一種手段。即:使用數字控制產生佔空比不同的方波(一個不停在開與關之間切換的信號)來控制模擬輸出。我們要在數字電路中輸出模擬信號,就可以使用PWM技術實現。
  • 你足夠了解pwm嗎?搞清楚pwm控制技術
    pwm是現代重要技術之一,在各種電子設備中,均存在pwm的身影。在往期文章中,小編對pwm原理、pwm佔空比、pwm頻率均有所介紹。為增進大家對pwm的認識,本文將對pwm控制技術予以闡述。如果你對pwm抑或本文即將介紹的內容具有興趣,不妨繼續往下閱讀哦。
  • PWM在ARM Linux中的原理和蜂鳴器驅動實例開發
    位);4)開啟定時器0的自動重載(設置TCON的第3位);5)關閉定時器0的反相器(設置TCON的第2位);6)開啟定時器0的手動更新TCNTB0&TCMPB0功能(設置TCON的第1位);7)啟動定時器0(設置TCON的第0位);8)清除定時器0的手動更新TCNTB0&TCMPB0功能(設置TCON的第1位)。
  • 基於ATmega8的直流電機PWM調速控制系統設計與實現
    ATmega8具有32個通用工作寄存器及豐富的指令集,帶有硬體乘法器以及8K的FLASH和1K的SRAM,還帶有8路10位ADC以及三通道的PWM輸出,支持ISP功能,可以很方便地對器件進行在線編程及修改。2.ATmega8實現PWM控制ATmega8的16位T/C可以實現精確的程序定時、波形產生和信號測量。
  • 高壓變頻器中功率驅動PWM信號的遠距離傳送實現
    圖1-高壓變頻框圖  單元串聯多電平PWM電壓源型變頻器,採用若干個低壓PWM變頻功率單元串聯的方式實現將相鄰功率單元的輸出端串接起來,形成Y聯結構,實現變壓變頻的高壓直接輸出,供給高壓電動機。  圖2-6kV變頻器的電路拓撲結構圖    圖3-功率單元原理圖
  • 用51單片機實現pwm專題及常見問題 - CSDN
    單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目一、前言1、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目包括用Keil軟體編寫單片機C語言程序和用Proteus軟體仿真單片機外圍電路2、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目構思(1)、實現什麼功能
  • 基於STC89C52RC的PWM呼吸燈
    設計思路(1)使用兩個定時器,T0用於PWM波翻轉,T1用於調整佔空比,均採用16位計時模式,因為51單片機在此模式下不能自動重裝初值,因此需要在每一次觸發中斷後手動重裝初值,為了不造成太大誤差,重裝初值程序需要寫在中斷最前面,PWM波佔空比在5s內先由0%增加到100%,再逐漸減少到0%,為了保證呼吸燈呼吸均勻
  • Elmos 單/雙通道PWM恆流模式LED驅動解決方案
    這個系列晶片的開關頻率有兩種設定方式,一種是通過外部電阻來設定,另外,也可以通過主-從配置模式,與外部設備實現頻率同步。晶片的開關頻率最高可達600kHz。該家族產品全部都是管腳兼容的,他們的一些主要功能區別如下:  通過這個晶片,可以對負載的LED實現數字脈寬調光以及模擬調光功能。
  • 脈寬調製原理
    ,縮寫為PWM,是脈衝寬度調製的簡稱,它主要是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。3.脈寬調製原理  脈寬調製(PWM)基本原理:控制方式就是對逆變電路開關器件的通斷進行控制,使輸出端得到一系列幅值相等的脈衝,用這些脈衝來代替正弦波或所需要的波形。
  • 基於雙PWM控制永磁直驅風電變流器的研究
    永磁直驅風電機組併網變流器在國內的研究還時間不長,本文對永磁直驅風電機組雙pwm控制併網變流器的原理、拓撲結構、控制策略進行了研究,並進行搭建試驗平臺進行了相應的試驗,達到了預定的效果。2 雙pwm變流器系統拓撲原理  本文採用的永磁直驅雙pwm風電變流器的拓撲結構如下:  如圖1所示,電機側變流器採用三相igbt橋,通過pwm控制實現整流,電網側變流器也採用三相igbt橋,通過pwm控制實現逆變,兩個變流器中間直流母線加電容器作為直流支撐,這一拓撲結構解決了採用二極體整流橋具有的非線性特性、導致整流器輸入側電流波形畸變的缺點
  • 大佬帶你深入pwm殿堂,搞明白pwm頻率是咋回事
    對於pwm,想必很多朋友都有所耳聞。但是,大家對於pwm真的了解嗎?譬如,pwm頻率是如何被確定下來的?pwm頻率和pwm值是同一個東西嗎?如果不是,pwm頻率和pwm值有什麼區別呢?如果你對這些問題存在疑惑,或者是對本文涉及的pwm相關知識具有興趣,不妨繼續往下閱讀哦。
  • PWM是什麼
    根據衝量相等效果相同的原理,PWM波形和正弦半波是等效的。對於正弦的負半周,也可以用同樣的方法得到PWM波形。  在PWM波形中,各脈衝的幅值是相等的,要改變等效輸出正弦波的幅值時,只要按同一比例係數改變各脈衝的寬度即可,因此在交-直-交變頻器中,PWM逆變電路輸出的脈衝電壓就是直流側電壓的幅值。
  • 淺析直流電機PWM控制原理及應用
    2、什麼是PWM  PWM(脈衝寬度調製)是一種模擬控制方式,其根據相應載荷的變化來調製電晶體柵極或基極的偏置,來實現開關穩壓電源輸出電晶體或電晶體導通時間的改變,這種方式能使電源的輸出電壓在工作條件變化時保持恆定,是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術。
  • 雙PWM變頻器及應用技術研究
    文中對四象限變頻器進行數學建模, 然後在其基礎上提出了有功功率和無功功率解耦控制的策略, 併網電壓定向使用了軟體鎖相環的方法, 提高了鎖相速度, 開關器件使用IGBT 雙向開關,四象限變流器除了可以工作在整流狀態也可工作在逆變狀態, 實現四象限運行。
  • 基於SHE-PWM控制的DC-AC電源
    Keyword:Selective Harmonic Eliminated-PWM control Bootstrap1 前言:以單片機和DSP為核心組成的控制電路的逆變電源,能實現電源的全數字控制,但系統較複雜,軟體工作量大,研製周期長。