世界聚焦:嵌入式:ARM定時器

2023-01-07 13:14:37 來源:51CTO博客

S3C2410A的PWM定時器

定時器概述

S3C2410有5個16位定時器,其中定時器0、1、2、3、有PWM功能,定時器4只是一個內部定時器而無輸出引腳。定時器0和定時器1具有死區發生器(dead-zone generator)。

PWM定時器有:

5個16位定時器2個8位預分頻器,2個4位除法器。波形可編程(PWM)自動重裝或短脈沖模式(One-shot Pulse Mode)死區發生器
定時器工作原理

每個定時器都有自己的16位減法計數器,該計數器由定時器時鐘(來自于時鐘除法器或外部時鐘)驅動,當定時器計數器值減到0時,定時器發出中斷請求,相應的定時器計數緩沖寄存器TCNTBn將自動載入計數器,繼續下一次操作。


(資料圖片僅供參考)

對于具有PWM功能的定時器,其控制邏輯中還有一個比較寄存器,當比較寄存器的值與定時器比較緩沖寄存器TCMPBn的值相等時,定時器控制邏輯改變輸出邏輯。這樣就能控制PWM輸出的高電平或低電平的時間。

TCNTBn和TCMPBn的雙緩沖特性,使得定時器在頻率和占空比改變時,也能產生穩定的輸出。

如果自動重裝功能被啟用,則當定時計數器TCNTn 計到0時,定時計數器緩沖寄存器TCNTBn 的值將被自動重裝到TCNTn 。

定時器操作
預分頻器和除法器

1個8位預分頻器和1個4位除法器在PCLK為50MHz時所能產生的信號頻率如下表所示:

開啟一個定時器的步驟

向TCNTBn和TCMPBn中寫入初始值。

設置相關定時器的手動更新位。

設置相關定時器的開始位啟動定時器(同時,清除手動更新位)。

脈寬調制 PWM

脈沖寬度調制(PWM)是英文“Pulse Width Modulation”的縮寫,簡稱脈寬調制。它是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用于測量,通信,功率控制與變換等許多領域。

方波信號有兩個參量,一個是周期(Ts ),另一個是脈沖占空比(Dn)。占空比就是高電平的持續時間與周期之比。

PWM基本原理

采樣控制理論基礎

沖量相等而形狀不同的窄脈沖加在具有慣性的環節上時,其效果基本相同;

沖量指窄脈沖的面積;

效果基本相同,是指環節的輸出響應波形基本相同;

將輸出波形進行付氏分解,低頻段非常接近,僅在高頻段略有差異。

典型慣性環節就是電感、電容負載。

實例

電路如下圖a)所示

電路輸入:u(t),窄脈沖,如上圖a、b、c、d 所示

電路輸出:i(t),如下圖 b)所示:

正弦波采樣

正弦半波N 等分,可看成N 個彼此相連的脈沖序列,寬度相等,但幅值不等;

利用前面的采樣控制理論我們可以在沖量相同的基礎上,將這些寬度相同,幅度不同的脈沖,用幅度相同,寬度不同的脈沖來替換,效果保持相同。這些幅度相同,寬度不同的信號,就是PWM信號,該信號通過慣性負載時,和原來的正弦波信號效果相同。

利用PWM技術控制慣性設備(比如:電機轉速、IGBT的開關等)的輸入,就相當于間接地利用模擬量控制了這些設備的行為。由于功率電子設備工作在開關狀態時比工作在線性狀態時工作效率更高,抗干擾能力更強,因此在電力電子應用中,常常采用這種技術對大功率電器設備進行控制。如UPS電源,開關電源,電機無級調速,恒溫加熱器,燈光亮度調節等應用中都會用到該技術。

利用PWM技術實現簡單DA轉換

不僅PWM信號經過慣性負載時,其輸出效果等同于原來的模擬控制信號,或者其輸出按原來的模擬信號變化規律變化。而且,如果PWM信號經過低通濾波器之后,我們還可以直接把其調制模擬信號取出,利用這個原理可以實現簡單DA轉換。

該電路沒有基準電壓,而且隨著負載電流和環境溫度的變化,精度很難保證。只能用在對D/A轉換輸出精度要求不高、負載很小的場合。

圖中A點的PWM波經過兩級阻容濾波在B點得到直流電壓信號,實現了D/A轉換功能。由于放大器的輸入阻抗很大,二級阻容濾波的效果很好,B點的電壓紋波極小,滿足高精度要求。輸出放大器工作在電壓跟隨器方式,輸出范圍在(0—5)V之間。

PWM簡單的實現原理

固定幅度、斜率和周期的鋸齒波加在比較器的反向端,調整信號Uc加在比較器的正向端,當Uc>鋸齒波信號的電平時比較器輸出高電平信號,反之輸出低電平信號。這樣Uc的大小決定了脈沖占空比。當Uc為一模擬信號,隨著時間變化時,脈沖占空比也會隨著時間變化,變化的規律和Uc一樣,也就是實現了Uc對方波的PWM調制。

S3C2410的PWM的實現原理

脈沖占空比取決于TCMPBn中的值,脈沖周期決定于TCNTBn 中的值,按照調制信號的大小改變TCMPBn 里的值,就會實現PWM調制。

死區控制

全橋PWM逆變器原理圖

PWM定時器控制寄存器

PWM應用舉例

舉例:使用PWM輸出功能,實現數模轉換。

具體要求為:使用S3C2410A的TOUT0口輸出PWM信號,使用RC濾波電路實現D/A轉換。通過檢測按鍵KEY1來改變PWM的占空比,改變D/A輸出的電壓值,輸出電壓分別為0.0V、0.5V、1.0V、1.5V、2.0V、2.5V和3.0V。

程序清單

#include  "config.h"    // 定義獨立按鍵KEY1的輸入口      #define     KEY_CON   (1<<4)      /* GPF4口  *//************************************************************************************ Function name: WaitKey** Descriptions: 等待一個有效按鍵。本函數有去抖功能。      ** Input: 無** Output: 無********************************************************************************/void  WaitKey(void){      uint32  i;    while(1)    {          while((rGPFDAT&KEY_CON) == KEY_CON) ;   // 等待KEY鍵按下        for(i=0; i<1000; i++);               // 延時去抖         if( (rGPFDAT&KEY_CON) != KEY_CON) break;    }     while((rGPFDAT&KEY_CON) != KEY_CON);       // 等待按鍵放開}
/******************************************************************************* Function name: PWM_Init** Descriptions: 初始化PWM定時器       ** Input: cycle     PWM周期控制值(uint16類型)**           duty      PWM占空比(uint16類型)** Output: 無***************************************************************************/void  PWM_Init(uint16 cycle, uint16 duty){          // 參數過濾    if(duty>cycle) duty = cycle;                 // 設置定時器0,即PWM周期和占空比    // Fclk=200MHz,時鐘分頻配置為1:2:4,即Pclk=50MHz。              rTCFG0 = 97;  // 預分頻器0設置為98,取得510204Hz    rTCFG1 = 0; // TIMER0再取1/2分頻,取得255102Hz    rTCMPB0 = duty;     // 設置PWM占空比    rTCNTB0 = cycle;    // 定時值(PWM周期)    if(rTCON&0x04) rTCON = (1<<1);                    // 更新定時器數據 (取反輸出inverter位)         else  rTCON = (1<<2)|(1<<1);               rTCON = (1<<0)|(1<<3);         // 啟動定時器       }
/******************************************************************************* Function name: main** Descriptions: 使用PWM輸出實現DAC功能,輸出電壓分別為0.0V、0.5V、1.0V、1.5V、2.0V、2.5V和3.0V。            ** Input: 無** Output: 系統返回值0*****************************************************************************/int  main(void){      uint16  pwm_dac;       // 獨立按鍵KEY1控制口設置      rGPFCON = (rGPFCON & (~(0x03<<8)));      // rGPFCON[9:8] = 00b,設置GPF4為GPIO輸入模式          // TOUT0口設置    rGPBCON = (rGPBCON & (~(0x03<<0))) | (0x02<<0);         // rGPBCON[1:0] = 10b,設置TOUT0功能        rGPBUP = rGPBUP | 0x0001; // 禁止TOUT0口的上拉電阻        // 初始化PWM輸出。設PWM周期控制值為255 (即DAC分辨率為8位)    pwm_dac = 0;     // 初始化占空比為0,即輸出0V電壓    PWM_Init(255, pwm_dac);             // 等待按鍵KEY1,改變占空比    while(1)    {                                    WaitKey();                     // 由于PWM周期控制值為255,所以0.5V對應的PWM占空比的               // 值為:0.5/3.3 * 256 = 39            pwm_dac = pwm_dac + 39;     // 改變D/A輸出的電壓值   if(pwm_dac>255)    {                      pwm_dac = 0;            }   rTCMPB0 = pwm_dac;          }        return(0);}

運行結果:

標簽: 模擬信號 基本相同 緩沖寄存器

上一篇:世界視訊!程序:三子棋游戲
下一篇:【Redis技術探索】「數據遷移實戰」手把手教你如何實現在線+離線模式進行遷移Redis數據實戰指南(在線同步數據)