隨著單晶片微控器技術日益進步,可完成的工作愈來愈複雜,其主因不只是因內部中央處理器(CPU)核心的處理能力不斷提升,從早期的4位元、8位元、到現在漸成主流的16位元,甚或32位元外,內嵌記憶體包括唯讀存儲記憶體(ROM)和隨機存取記憶體(RAM)容量也加大很多。另外,也整合比以往更豐富的周邊硬體模組,如A/D、D/A,各式各樣的串列、並列通訊介面,並整合各種波形產生和量測需求的各式計時器(Timer)。
由於CPU核心運算速度的提升,再加上硬體整合度提高,在系統設計時,本來須外接的硬體線路,便可用軟體的處理方式省略。如此,不僅可以降低硬體成本,也可因零件的減少而提高產品的可靠度。本文將以瑞薩(Renesas)R8C/Tiny系列中的R8C/1B為設計案例,利用PWM Timer產生DTMF複頻撥號音,取代傳統的DTMF產生器,並討論如何善用新一代MCU的高整合能力,以實現降低硬體成本的設計需求。
搭配RC濾波電路產生所需電壓
PWM廣泛地應用於MCU以實現大功率數位/類比(D/A)的類比訊號輸出,利用Pulse寬度可調變的特性,再搭配簡單的RC濾波電路,便可產生需要的電壓準位。如圖1和圖2中,tw表1完整的脈波週期,ton表邏輯Hi的時間,toff表邏輯Low的時間。如圖1所示,若把一固定工作週期比例(ton/tw)之方波,在其截止頻率遠小於脈波頻率的條件下,輸入一簡單的RC積分電路,輸出則為一接近穩定的DC電壓,此輸出電壓(Vo)之大小為:Vo=Vhi×(ton/tw)+Voffset),上式中Vhi為邏輯Hi的電位,Voffset為邏輯Low的電位,因Vhi和Voffset兩者皆為常數,若要改變輸出電壓Vo,只要改變ton/tw的比率即可(圖2)。
表1 相對振幅對應之PWM設定值 | ||
N | 相對振幅Y=sin(n×2π/256) | Sin_table[n]=int(Y×511+512) |
0 | 0 | 512 |
1 | 0.024541286 | 523 |
2 | 0.049067789 | 536 |
3 | 0.073564735 | 548 |
4 | 0.098017369 | 561 |
— | — | — |
252 | -0.098002747 | 460 |
253 | -0.073550082 | 473 |
254 | -0.049053114 | 485 |
255 | -0.024526598 | 498 |
256 | 1.46928E-05 | 512 |
圖1 把一固定工作週期比例方波,輸入一簡單RC積分電路所得之常數。 |
圖2 改變ton/tw的比率即可改變輸出電壓Vo |
如圖3所示,將一個完整正弦波週期依角度分成二百五十六等分,依據Y=sin(θ)求出每一等分相對應之相對振幅值,如sin90度時為1、sin45度時為0.707,求出每一點的相對振幅後,並將每一點等比率乘511放大後,再加上Offset值(512),便成為每一點的PWM設定值,請參閱表1,本例PWM解析度為1,024,放大倍率即Offset值為PWM解析度/2-1=511,加Offset目的在於使每一點的相對振幅為正整數(1~1,023)。
圖3 正弦波週期 |
利用PWM調變正弦波
根據表1,要完整呈現DTMF十六個撥號音,須產生八組頻率的弦波,即697Hz、770Hz、852Hz、941Hz、1,209Hz、1,335Hz、1,477Hz、1,633Hz。這八組頻率的弦波採用一固定的還原時間取樣還原點(Sampling Period),本例使用50微秒,根據每一個取樣還原時間點,計算出每組頻率對照二百五十六等分弦波表的偏移量,計算方式為單位取樣間隔表格偏移量(Wave Table Moving Step Per Sampling Period) Wave_step=256/(Tsine/Tsample),其中256為Sine-table樣本數,Tsine為弦波周期,Tsampling為Sample Period取樣還原間隔=50微秒。若要產生852Hz之弦波,其wave_step=256/((1/852)/50μS)=10.9μS, 其餘七組頻率依上述方法計算出如表2。
表2 七組頻率弦波計算結果 |
|
頻率(Hz) | wave_step(?)=256/((1/Freq)/50uS) |
697 | 8.9216 |
770 | 9.856 |
852 | 10.9056 |
941 | 12.0448 |
1,209 | 15.4752 |
1,335 | 17.088 |
1,477 | 18.9056 |
1,633 | 20.9024 |
至此,可知道在每個Sample Period時間產生的頻率表格指標,累加上wave_offset查表sine_table[256],取得新的PWM值輸出,經過RC積分變成電壓準位,如此週而復始,就會產生需要的弦波波型。而且也可發現,不同頻率之弦波的wave_step不一樣,頻率愈高,wave_setp愈高,取樣還原點就愈少,波形解析度就愈低。反之,頻率愈低,wave_step就愈少,取樣點還原點愈多,波形解析度就愈高。
調變兩組正弦波合成DTMF訊號
任一DTMF撥號音是由高頻音(High Tone)群中任一組頻率,和低頻音(Low Tones)群中任一組頻率組合而成,組合的方式為波形的相加或相減。因此,在程式的流程中,需要兩組指標和兩組wave_stept,在每個Sample Period中,這兩組指標分別累加其wave_offset,進而取得各自更新的PWM值,再將其值相加後除2,得到合成的PWM值,輸出經過積分濾波,即可得到兩弦波合成的訊號(圖4)。 當然,並不是每一顆MCU都可以利用軟體實現模擬DTMF訊號的功能,此MCU須內建一些基本的硬體模組以及速度夠快的執行效能,本例MCU基本的功能需求包括10位元PWM Timer一組,用來控制PWM實現D/A;Time Base Timer一組,用來產生50微秒單位取樣間隔的中斷;CPU指令週期愈短,則產生波形的抖動愈低,本例指令週期為50奈秒。
圖4 兩弦波合成的訊號示意圖 |
本例所使用的MCU,其電路圖(圖5)中S1 ~S12及R10~R21組合成串列分壓的按鍵偵測電路,不同按鍵按壓時,AD_KEY端會有對應的分壓電壓,此電壓輸入MCU的AN11端,經過軟體解析,即可正確判斷是哪一個按鍵被按。當軟體偵測到有按鍵被壓時,其相對PWM波形透過P10腳位輸出,經過R1及C1積分後,在WAVE_OUTPUT端點即可量測到DTMF的波形,另外,PWM訊號經過T11直接驅動喇叭SP1,發出DTMF撥號音。而主程式流程與50微秒中斷服務程式流程如圖6、圖7所示。
圖5 本文範例採用之MCU電路圖 |
圖6 主程式流程圖 |
圖7 50微秒中斷服務程式流程圖 |
圖8(a)及(b)為本例利用R8C/1B模擬DTMF訊號,實際量測到的波形,可參考PWM訊號Duty Cycle的變化和經過RC積分濾波後訊號的相互關係(CH1為PWM訊號,CH2為DTMF訊號),看到輸出的完整與高訊號品質,證明本文的方法可行,並可為使用者降低成本。
圖8 利用R8C/1B模擬DTMF訊號實際量測之波形。 |
(本文作者任職於晶偉電子)