<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 模擬技術(shù) > 設計應用 > 基于MSP430 Timer_B的D/A轉換及C語(yǔ)言源程序

基于MSP430 Timer_B的D/A轉換及C語(yǔ)言源程序

作者: 時(shí)間:2016-11-17 來(lái)源:網(wǎng)絡(luò ) 收藏

本文分析了利用在比較模式下輸出的脈寬調制(PWM)波,來(lái)實(shí)現/轉換的工作原理。介紹了利用MSP430F449的的PWM輸出產(chǎn)生正弦波和直流電平的方法,并給出了對應的硬件電路和。

1.簡(jiǎn)介

1.1 單片機介紹

雖然目前在國內市場(chǎng)上應用較多的單片機仍然是8位單片機,但是由美國德州儀器(TI)公司推出的16位單片機具有處理能力強、運行速度快、低功耗、指令簡(jiǎn)單等優(yōu)點(diǎn)。并采用了JTG技術(shù)、FLSH在線(xiàn)編程技術(shù)、BOOTSTRAP等諸多先進(jìn)技術(shù),因此具有很高的性?xún)r(jià)比,在歐洲市場(chǎng)已得到了非常廣泛的應用。雖然MSP430進(jìn)入國內市場(chǎng)的時(shí)間不是很長(cháng),但是因其具有以上所述的卓越品質(zhì),一進(jìn)入國內市場(chǎng)就被眾多電子工程師所青睞。其中MSP430F449具有7個(gè)工作模式可選8、10、12、16的16位計數器。用其比較模式產(chǎn)生的PWM可以實(shí)現/A轉換(/A conversion)。

1.2 PWM D/A簡(jiǎn)介

很多嵌入式微控制器(microcontroller)應用都需要產(chǎn)生模擬信號。這種情況下往往是采用集成的或者是分立的數模轉換器DAC(digital-to-analog converter)來(lái)實(shí)現。但是采用脈寬調制PWM(pulse-width modulated)信號來(lái)實(shí)現D/A轉換(簡(jiǎn)寫(xiě)為PWM D/A)也是一種常用的方法??梢杂肞WM信號產(chǎn)生所需的直流或交流信號。這篇文章以MSP430F449的輸出的PWM為例來(lái)產(chǎn)生一個(gè)200Hz的正弦波和一個(gè)0.5VCC的直流電平。實(shí)際上類(lèi)似的方法可以用于Timer_A以及MSP430其它型號的單片機。

2. 用PWM實(shí)現DAC的原理

2.1 基本原理

PWM信號是一種具有固定周期(T)不定占空比()的數字信號,如圖1所示。如果PWM信號的占空比隨時(shí)間變化,那么通過(guò)濾波之后的輸出信號將是幅度變化的模擬信號。因此通過(guò)控制PWM信號的占空比,就可以產(chǎn)生不同的模擬信號。在MSP430F449中就是采用CCR0來(lái)控制周期T,而用與定時(shí)器對應的CCRx寄存器來(lái)控制可變占空比,進(jìn)而實(shí)現D/A轉換。

2.2 分辨率

圖1 PWM信號示意圖

基于Timer_B PWM的DAC分辨率就等于計數器的長(cháng)度,通常是CCR0寄存器的值。PWM DAC的最低有效位是一個(gè)計數值,分辨率是總的計數值。

Rcounts = Lcounts

其中Rcounts是以計數值為單位的分辨率,Lcounts是計數器的總計數值。例如對8-bit DAC,計數器的長(cháng)度為8 bits,或者256個(gè)計數值。那么分辨率也就是8 bits,或者256。

更一般的情況下,基于PWM定時(shí)器和濾波器的PWM DAC的分辨率等于產(chǎn)生模擬信號的PWM信號的分辨率。PWM信號的分辨率決定于計數器的長(cháng)度和PWM計數器能夠實(shí)現的最小占空比。用數學(xué)表達式如下:

在這兒,是所需的PWM定時(shí)器頻率,是PWM信號的頻率,也就是DAC的更新頻率,n 是所需的比特分辨率。下文即將描述怎樣采用8-bit PWM DAC來(lái)同步產(chǎn)生一個(gè)200Hz的正弦波。由抽樣定理可得,最低的抽樣頻率應該為400Hz。但是通常情況下,PWM信號的頻率要遠高于Nyquist抽樣速率。這是因為PWM信號的頻率越高,對濾波器的階數就要求越低,合適的濾波器越容易實(shí)現。通常抽樣速率取Nyquist速率的16或者32倍。

2.4 所需的MSP430資源

文中的例子是用MSP430F449的Timer_B再加外部濾波器來(lái)產(chǎn)生一個(gè)200Hz的正弦波和一個(gè)0.5VCC的直流電平的。將Timer_B配置為16-bit、up模式。在這種模式下計數器計數至CCR0,然后復位從0開(kāi)始重新計數。給CCR0賦值255也就意味著(zhù)計數器的長(cháng)度為8bits。CCR1和TB1用于產(chǎn)生正弦波,CCR2和TB2用于產(chǎn)生直流電平。輸出模式都選為模式7,即PWM復位/置位模式。如圖2所示,在這種模式下,復位后每一個(gè)定時(shí)器的輸出都為高電平,直到計數器達到各自的CCRx值時(shí)變?yōu)榈碗娖?,當計數器達到CCR0時(shí)再置位。也就是說(shuō)CCRx的值決定了各自正脈沖的寬帶。若CCRx的值是變化的,就可以產(chǎn)生可變寬度的脈沖,下文中的正弦波就是用這種辦法產(chǎn)生的;若不變則產(chǎn)生的是固定寬度的脈沖,下文中的直流電平就是這樣產(chǎn)生的。最后SMCLK用作Timer_B的時(shí)鐘源。系統采用32768Hz的鐘表晶振,通過(guò)采用內部硬件鎖頻環(huán)FLL(frequency-locked-loop),來(lái)校準DCO(Digital Control Oscillator)頻率為系統提供MCLK/SMCLK時(shí)鐘。

圖2 輸出模式7:PWM復位/置位示意圖

3. 實(shí)現電路

用Timer_B PWM實(shí)現DAC外圍電路比較簡(jiǎn)單,如圖3所示。實(shí)際上外圍電路就是晶振電路和RC低通濾波器。

圖3 MSP430F449實(shí)現D/A電路圖

3.1 正弦信號的產(chǎn)生

在這個(gè)例子中,一個(gè)正弦波用32個(gè)抽樣值生成。正弦波的頻率為200Hz,所以每秒要抽樣200×32=6400次,也就是說(shuō)=6.4KHz。每完成一次抽樣要計數28,所以所需的時(shí)鐘頻率為。抽樣值包含在程序開(kāi)始的一個(gè)正弦表中,通過(guò)調用中斷函數,在每個(gè)PWM周期結束時(shí),將新的正弦波抽樣值載入捕獲/比較寄存器CCR1中。因此產(chǎn)生的PWM信號的脈沖寬度就決定了正弦波在每一個(gè)時(shí)刻的抽樣值,將這個(gè)PWM信號經(jīng)過(guò)低通濾波,即得所需的正弦波。

3.2 直流電平的產(chǎn)生

直流電平產(chǎn)生比較簡(jiǎn)單,因為它對應的PWM占空比是一定的。直流電平直接正比于PWM信號的占空比。要產(chǎn)生0.5VCC的直流電平,PWM的占空比顯然是50%(考慮到損耗,實(shí)際應大一些)。只需要簡(jiǎn)單地將CCR2的值設置為128,并且無(wú)須變化就可以得到50%占空比的PWM信號。將得到的PWM信號通過(guò)RC網(wǎng)絡(luò )進(jìn)行低通濾波,即可得到0.5VCC的直流電平。

3.3 濾波器設計

圖4 軟件流程

對兩路輸出都采用了結構簡(jiǎn)單的RC濾波器,如圖3所示。之所以采用這種結構,一是因為RC濾波器結構簡(jiǎn)單,二是為了實(shí)現低功耗,盡量避免采用有源器件。

用于交流信號的濾波器是一個(gè)雙極點(diǎn)級聯(lián)RC濾波器。如果濾波器階數過(guò)高,可以采用提高的抽樣頻率的辦法來(lái)降低濾波器階數。濾波器的截至頻率fc由下式來(lái)計算:

當R2 ? R1時(shí)濾波器的響應較好。但是如果截至頻率很接近信號帶寬邊沿,將會(huì )導致相當大的衰減。因此為了減小濾波器的衰減,截至頻率應該大于信號帶寬邊沿,但是要遠小于PWM信號的頻率。

用于產(chǎn)生直流電平的濾波器僅僅是用來(lái)儲存電荷的,而不像交流信號濾波器那樣用來(lái)濾波。因此采用了一個(gè)簡(jiǎn)單的單極RC濾波器。

4.程序流程

用MSP430F449的Timer_B的PWM來(lái)產(chǎn)生正弦波和直流電平的程序比較簡(jiǎn)單,流程如圖4所示。MSP430F449自身有FLL,可用它來(lái)實(shí)現DCO的頻率校準。但是DCO的頻率只能鎖定在A(yíng)CLK的整數倍上,所以對于沒(méi)有FLL的器件,或者所需頻率不是ACLK整數倍的情況下,要用Timer_A或者其它的定時(shí)器進(jìn)行DCO頻率校準,這也就是所謂的“軟鎖頻”。事實(shí)上實(shí)際的D/A轉換常常是一些隨時(shí)間變化的非周期信號。它們對時(shí)鐘的精度要求不是很高,因此大多數情況下硬件FLL是可以勝任的。

5. 程序清單

MSP430的另外一個(gè)特點(diǎn)是用編寫(xiě)程序簡(jiǎn)單,而且效率較高。本例就采用編寫(xiě)了程序。清單如下:

#include 《msp430x44x.h》

#include 《math.h》

int SampleTimes=0;

//***定義正弦表,并用32個(gè)抽樣值初始化正弦表,不要用“0”抽樣***//

int SinTable[]={255,254,246,234,219,199,177,153,128,103,79,57,37,22,10,2,

1,2,10,22,37,57,79,103,128,153,177,199,219,234,246,255};

void main(void)

{

int i;

WDTCTL = WDTPW +WDTHOLD; // 禁止看門(mén)狗定時(shí)器

//***初始化端口***//

P2DIR |= 0x0C; // P2.2和P2.3為輸出

P2SEL |= 0x0C; // P2.2和P2.3分別為T(mén)B1和TB2

//***設置系統時(shí)鐘***//

FLL_CTL0 = XCAP18PF; // 設置XTAL1的負載電容

SCFQCTL = 50-1; // 1.6384MHz/32768Hz = 50,fDCO=MCLK=1.6384MHz

for (i = 50000; i; i--); // 晶振初始化延時(shí)

//***設置Timer_B***//

TBCTL = TBSSEL1 + TBCLR; // 選擇SMCLK為時(shí)鐘,定時(shí)器清除

TBCTL|=MC_1+CNTL_0+TBCLGRP_0; //選擇up,16位模式

TBCCTL0=CCIE; //將CCR0設為比較模式,中斷允許

TBCCR0=256-1; //PWM的周期為256,也就是DAC為8bit

TBCCTL1=OUTMOD_7+CLLD_1; //將CCRx設為比較模式,中斷禁止

TBCCTL2=OUTMOD_7+CLLD_1; //選擇輸出模式7,當TBR計數到0時(shí)CCRx數據加載到TBCTLx

TBCCR1=SinTable[SampleTimes]; //將正弦表加載到CCR1

TBCCR2=128; //PWM的占空比為50%,產(chǎn)生0.5VCC的直流電平

_EINT(); //中斷允許

for (;;)

{ _BIS_SR(LPM0_bits); //CUP進(jìn)入低功耗模式

_NOP();

}

}

//調用中斷函數

interrupt [TIMERB0_VECTOR] void Timer_B(void)

{

SampleTimes=(SampleTimes+1)%32;

TBCCR1=SinTable[SampleTimes]; //將新的抽樣值裝入CCR1



關(guān)鍵詞: MSP430 Timer_B D A C語(yǔ)言 源程序

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>