RC-network-A-D-Converter

AVR專題研究報告

RC network A/D Converter

目錄

第一章緒論

1-1.製作動機

1-2.製作目的

1-3.功能摘要

第二章

2-1.AVR之控制與分析

2-2.Timer之轉換與分析

2-3.OPA之設計與分析

2-4. 7 Segment LED Display之設計與分析

第三章相關知識

3-1.A/D converter之系統分析

3-2.RC之使用與分析

3-3.比較器

3-4.電壓隨耦器

第四章製作評估

4-1.設備需求表

4-2.材料需求表

第五章硬體結構設計

5-1 A/D converter 電路圖

第六章軟體結構設計

6-1.程式控制流程圖

6-2.程式碼

6-3程式結構之設計與分析

第七章製作程序與測試

第八章結果與討論

第九章製作心得

9-1. 結論

9-2.發展空間

參考文獻

第一章緒論

1-1.製作動機

目前電子應用在生活上及科學上的量測越來越多,而單晶片隨之而來的問題是大部分的感測器都是類比的形式,A/D converter顯然便是常用的電路,目前常用的單晶片如PIC,MCS-51,AVR當中,極少數有內建A/D converter IC,且單價過高,對於一般均單晶片需外加IC使用,如ADC0804,這樣其實使電路成本大幅提高 ,其實在以往的經驗中獨立的被動元件越多,所產生的誤差也就越不可預測,而AVR系列中大部份均只有提供類比比較器中斷(即內建一顆OPA),依A/D轉換的理論,其實可以做出而不需外加其他IC(依做法而有所不同)。

1-2.製作目的

開發一套AVR A/D轉換的套件,是一個低成本的考量下,我們一開始並不考慮在電路上做太多的要求,因為我們希望在電路不完美的情況下,反映出與理論上的誤差所能容忍的範圍,並研究所能應用的範圍,這些都將在電路誤差情形及精密度的分析來考慮應用場合。

1-3.功能摘要

  1. 適用AVR系列8-bit Timer and analog comparator
  2. 測量電壓:0→5 v
  3. 解析度:0.1v
  4. 七段顯示測量電壓

第二章A/D converter之分析與設計

2-1.AVR之控制與分析

我們知道以單斜率積分作為A/D converter控制時,必須要同時啟動電容充電和計時器,為確保電路之正確動作,程式以中斷方式呈現,值得我們注意的是我們要在類比中斷和計時中斷中用同樣一個中斷副程式,原因是我們必須要用類比中斷去呼叫計時器停止,並把計數值取出來,然而我們並無法再尚未轉換完成時就將計數值取出所以程式中以T flag作為流程控制,set 表示轉換完成,我們可去呼叫另外一個副程式做我們要執行的工作,在這裡我們要執行輸出portD BCD碼給7447,在A/D converte 之前也要注意先將電容放電,我們透過兩個I/O port 直接對RC網路做充放電,因為是CMOS邏輯的IC,所以邏輯準位High大約等於Vcc,low大約等於0,在I/O port設定為輸出時,充電時電流相當小,放電時IC內部緩衝器可沉入20mA的電流,故電路是合理的,這在程式尚未完成之前均已測試並確認過。而0.1V的解析度可以得知0.1v/bit 的單位範圍5V即可得到50個值,假設考慮積分為線性,時間切割將等分為50,在每一個計數時間內將充電0.1V。

2-2.Timer之轉換與分析

從電路當中我們發現RC電路會以指數的曲線上升,也就是其電路充電曲線並非線性,但我們可以取以個小範圍來代替,在一小的範圍內可以取得進似線性的曲線,以Vcc=5v為例,若取3V則斜率誤差頗大,唯有取2V,大約是40%可以符合電路要求,加上取整數對電路計算上較方便的緣故,充電到2V的時間約為-R*C*ln(1-2/5),如過我們使用4MHZ石英震盪,預除值為8,則我們知道8*計數值/f=-R*C*ln(1-2/5),因為我們需要0.1V的解析度,在計數值的設定上就以5V/0.1V=50,由此8*50/4M=-R*C*ln(1-2/5),則RC值大約等於0.0002,我們用0.01uf 的電容串上20K電阻大約近似,由於電容電阻有一些誤差,我們以一顆10K可調電阻加上15K固定電阻就可以調整,而TCNT0我們設為(256-50),設定狀態戰存器I 位元及TIMSK中的TOIE0讓中斷致能。

為使電容正確動作,必須給予一個適當的放電時間,依電路的考量,太大則轉換時間變大,太慢則產生錯誤的值。然而整體做轉換時間約8*50/4M+delay,輸入信號原則上不能超過此一轉換頻率。如果要加快轉換時間,無疑的有加快放電時間,我們可以增加一個I/Oport,使用一顆電晶體接在電容上做快速放電,類似一個鋸歯波將出現在比較器的非反向輸入端,使反應時間加速。

2-3.OPA之設計與分析

這部分較屬於硬體,我們考量要擴大輸入範圍而用一電阻分壓,而需要一OPA做阻抗匹配,讓OPA有正負電源而可以輸入範圍可以設計在Vcc-2V到Vss+2V的範圍,這裡我們只考慮直流,若輸入交流信號,必須加入二極體箝位電路,將信號箝位到正電壓來做,其輸入Vp-p為4V,Vcc=5V,給予OPA 9V的雙電源即可正確動作,並加入保護電路避免輸入過大電壓而燒毀IC,資料手冊上power supply為4.0~6.0,所以最好不要超過Vcc 6.0V,如下圖所示。

AVR的類比比較器設定為上緣觸發,ACSR設為0Bh,如此當電容充電至Vin待測電壓時將發生中斷,類比IC的特性,Analog Comparator Input Offset Voltage有40mV(如下圖),輸入抵補電壓﹝Input Offset Voltage,Vio 或 Vos﹞,是因差動輸入電路的不平衡而產生。為了讓 OP Amp 的輸出電壓保持為零,必須對 OP Amp 的輸入端加入小額的差動輸入電壓,以改善因電路不平衡所生的輸出誤差,這個小額的差動輸入電壓,就是輸入抵補電壓。此專題2V有50個狀態剛好40mV,雖然存在此一誤差,但通常溫度及電源穩定下輸入抵補電壓變動不大,對於電路的影響不可忽略。

我們深入了解,在原廠資料手冊中,在室溫25度C下,1V到1.5V下顯然有較佳的特性,因此我們發覺在此專題中應該是2V~3V最穩定也是最準確的,其他位置會因為RC線性度和輸入抵補電壓而有所誤差,

2-4. 7 Segment LED Display and 7447之設計與分析

上圖是7447的基本電路,實用上我們並不會每條I/O都串聯限流電阻,那太複雜了,我們在公陽極七段上的共腳上接330Ω到Vcc即可,因為我們是接portD 到7447顯示0050,由此可知我們只需要用到7之接腳,剛好portD就是7隻,而需要注意的是7447為TTL邏輯的IC,當輸入腳空接的時候,會呈現高電位的狀態,所以我們必須將十位數7447的MSB腳直接接地,如此一來我們可以直接顯示0079的BCD碼。

第三章 相關知識

3-1.A/D converter之系統分析

  • Flash ADC

此種類型的ADC屬於高速型,也稱並聯比較型,成本高,不需要clock,預取得高解析度相當困難,但卻很容易IC化,雖然在此並不適用,但我們可以很容易了解ADC的轉換原理,需要比較器,參考電壓及一個解碼器,我們只有一個比較器。

  • Tracking A/D Converter

此種類型屬於中速型,利用計數器(上數/下數),及DAC輸出比較電壓,計數值會隨電壓高低而改變,故稱為追隨型ADC,缺點是輸入電壓的頻率太高時會跟不上(顯然和CLK有關),加上輸入電壓變化量不大時,輸出會有震盪的現象,除此之外,是非常不錯的ADC架構。此做法雖然單晶片也可以做到,但反而增加I/O的使用,因此不適用於此專題

  • successive-approximation ADC

連續近似ADC是比較聰明比較方式,不必每次都從0開始比較,以二近碼來看的話,是從最高位元開始比較,也就是一半的類比電壓去比較,若大於Vin則為零,小於則為1,如此比較N位元最多比較N次,所以比Tracking A/D Converter要快,我們可以利用PWM波配合RC網路形成DAC的做法完成,程式需要用到Timer1,Timer0和類比中斷。

  • integrating ADC

積分型ADC是由一固定電壓產生一定電流源對C充電,以OPA的積分器做電壓對時間的轉換,當Vin越大時,積分時間也越久,計數值也越大,每次轉換後都要對C做放電,一般積分形式的ADC都屬於1ms以上慢速型ADC,在本次專題中就是運用類似的方式來達到ADC的功能,藉由圖中可以得知,計數器及比較器在AT90S2313中已經有了,硬體方面只需要用到3 pin ,其中的2 pin 是比較器的輸入端,另外是充放電的控制信號。一般沒有IC使用,只有雙斜式ADC較常用

3-2.RC之使用與分析

  • RC電路

如上圖,藉由電路理論可以知道,而,當時,我們電容的充電現象如下圖:

我們知道這並非線性,因為並非是定電流

3-3.比較器

  • 比較器

主要是要求OPA開路工作穩定,速度快,其實比較器就像一個類比的開關,輸出至數位電路作為控制信號,但在有雜訊的時候輸出容易震盪,若要擴大輸入範圍,顯然要在比較器之前加上衰減器,如下圖

如左圖所表示其衰減率為,考慮信號上的需求這裡會加上一電壓隨耦器,並且會並連上一顆傍路電容,若考慮的更仔細,應加上一個齊納二極體作為IC的保護,以避免輸入信號過大。

3-4.電壓隨耦器

  • 電壓隨耦器

如圖,我們知道放大率為,當R1無窮大時,放大率為1,我們稱之為電壓隨耦器,又叫緩衝器,如下圖

第四章製作評估

4-1.設備需求表

|| || || || || || || || || ||

4-2.材料需求表

|| || || || || || || || || || || || || || || ||

第五章硬體結構設計

    1. A/D converter 電路圖

第六章軟體結構設計

6-1.程式控制流程圖

6-2.程式碼

.include "2313def.inc"

;***** Constants*************************************

.equpreset=206;T/C0 Preset constant (256-50)R=20k,c=0.01uf

;***** A/D converter Global Registers****************

.defresult=r16;轉換結果

.deftemp1=r17;變數 register

.deftemp2=r18

.defavgVoltage=R19

.defAccumulator=r20

.defloopReg=r21

.cseg

.org $0000

rjmp RESET ;Reset 中斷向量

.org OVF0addr

rjmp ANA_COMP ;Timer0 overflow 中斷向量

.org ACIaddr

rjmp ANA_COMP ;Analog comparator 中斷向量

;**********************************************************************

ANA_COMP:

in result,TCNT0 ;Load timer value

cbi PORTB,PB2 ;電容開始放電

sbi PORTB,PB3

clr temp1 ;Stop timer0

out TCCR0,temp1

subi result,preset+1 ;減去預設常數

set;Set T flag(=1,轉換完成)

;(=0,正在轉換)

cbi PORTB,PB3;fast discharge 禁能

reti ;Return

;***********************************************************************

convert_init:

clrloopReg

clrAccumulator

clravgVoltage

lditemp1,$ff;set port D as output

outDDRD,temp1

sbiddrb,2;充放電設定位元設為輸出

sbiddrb,3;快速放電控制位元設為輸出

cbi PORTB,PB2 ;電容開始放電

sbiPORTB,PB3

ldi temp1,$0B ;上緣觸發致能

out ACSR,temp1 ;

ldi temp1,$02 ;Enable Timer0 interrupt

out TIMSK,temp1

cbiPORTB,PB3

ret;Return

;************************************************************************

AD_convert:

ldi temp2,preset ;Clear counter

out TCNT0,temp2 ;and load offset value

clt;Clear T flag

lditemp2,$02;預除 f/8 and 開始計時

out TCCR0,temp2

sbi PORTB,PB2 ;Start charging

ret;Return

;*********************************************************************

;

Delay:

lditemp1,$f0

loop1:inc temp1

brne loop1

ret

;將result轉成BCD碼;PORTD輸出BCD碼

;**********************************************************************

display:

addAccumulator,result

brccnoCarry

incavgVoltage

noCarry:

decloopReg

brneexit

ldiZH,high(2*message)

ldiZL,low(2*message)

addZL,avgVoltage

lpm

outportd,r0

clrloopReg

clrAccumulator

clravgVoltage

exit:

ret

;**************main program*******************************************

RESET:

lditemp1,low(RAMEND);堆疊設定

outSPL,temp1

rcallconvert_init;A/D 轉換設定

sei;Enable interrupt

again:rcallDelay

rcallAD_convert;開始轉換

Wait:brtcWait;等待

rcalldisplay

rjmpagain;again

;**********************************************************************

message:

.db$00,$01,$02,$03,$04,$05,$06,$07,$08,$09

.db$10,$11,$12,$13,$14,$15,$16,$17,$18,$19

.db$20,$21,$22,$23,$24,$25,$26,$27,$28,$29

.db$30,$31,$32,$33,$34,$35,$36,$37,$38,$39

.db$40,$41,$42,$43,$44,$45,$46,$47,$48,$49

.db$50

6-3程式結構之設計與分析

  • ANA_COMP中斷副程式

將TCNT0的結果放入暫存器,並停止計數,開始放電,預取得真正的結果必須先減去(256-50)+1,如此可取出最大50的數字,並設定T,表示轉換完成,可以開始顯示

  • convert_init副程式

設定IO輸入輸出,上緣觸發致能,Enable Timer0 interrupt,並且預先放電

  • AD_convert副程式

載入預設的計數值,並啟動中斷,並開始放電,這裡要注意,在充電之前要先將快速放電關閉,否則電容不會充電

  • Delay副程式

主要分析在RC網路所需要的放電時間,因為有快速放電,我們將放電時間約1ms可,但快速放電亦有一Vce電壓在電晶體上約0.2V,加上NPN電晶體反應時間很快,我們只要短暫啟動快速放電即可,隨後才做延遲。

  • Display副程式

主要是將平均值顯示出,因為傳換速度太快,不適合直接輸出顯示,我們利用進位的方式,將暫存器累加256次,其進位次數即代表平均值,其Carry相當於1/256

  • 主程式

一開始先做堆疊設定,呼叫convert_init副程式,啟動中斷旗標,最後進入轉換的LOOP,delay必須先執行,最後才是display

  • 製作程序與測試

1.我們先將程式分成幾個部分,做成副程式的方式一一測試,我們先將7447電路安插好,測試程式BCDdisplay.asm將顯示00~79循環,確認無誤。

2.程式average.asm將顯示一平均值的做法,利用AVR模擬器將看到平均值出現在R16,確認無誤。

  1. 程式bitIO.asm我們克里看到利用cbi sbi 指令控制I/O,並利用三用電表測試高電位,低電位電壓,其結果與預測的相去不遠,並不影響旗標,其指令週期為2,反而比in out 更長。

4.測試程式test.asm將不啟動類比比較中斷,已示波器觀測電容充電情形,依我們所計算的值應當充電至2V後Timer0發生溢位中斷,我們一邊觀測一邊調整可調電阻至準確無誤,delay也要一邊調整至適當,最後我們會看到一個三角波的充放電情形。下圖示實際是波器測試的圖形,實際輸出後0.2~4.0有優良的線性度。

  1. 程式ad.asm將啟動類比比較中斷,開始轉換電壓,一開始我們OPA使用單電源,以致測試電壓無法調整至1.2V以下,最後以雙12V電源解決此一問題,確認開始轉換,我們可以開始測試成果,而使用NPN電晶體在放電上相當快速,快了至少4倍速度,主要是因為電容放電緣故,我們可以縮短delay時間至約50個指令週期,其實電壓早就已經到0V,但delay如果太短會造成C充放電不穩定,輸出會有很大誤差,加上NPN電晶體後對C充電也有影響大約3.5V的0.5~3.5V尚可有原來的線性度,其原因與NPN並聯C有關,如下圖所示,我們從示波器看到充放電的情形。

7.程式ad2.asm將修改其Timer0計數值及data,將修正至近似的真實電壓

  • 結果與討論

在解析度0.1V的要求下,我們計算5/0.1=50,RC網路我們取40%的充電範圍是0~2V,但在超過1.5V的電壓時,線性度急速下降,也就是說我們必須更改RC網路的值,但輸入範圍下降對抵補電壓的誤差相對就提高,所以我們會考慮用FET做一定電流源,對C做充電,其FET也不是昂貴元件,符合我們的要求,線性度提高後我們可以提高輸入範圍來改善比較器抵補電壓的影響,但基本上比較器抵補電壓還是存在的。可用軟體修正方式,因為積分斜率變小,我們可以經過Timer0延長,並修改資料表的內容,經過LPM指令後取出的BCD碼近似真實值。程式ad2.asm其轉換頻率約7‧1 KHZ,但我們實際電路上輸出會有震盪,也就是說電壓不穩定的情形在比較器上,我們使用平均值的做法使電壓穩定,結果我們最後的轉換頻率約28 HZ,輸出也穩定,如此也可以與積分型ADC原理做比較,我們只做到了35ms,作為一般顯示用途如DVM,慢速的自動控制,或PWM控制,尚可以接受,我們可以了解的是,單斜式積分ADC極少數有作為IC化的其原因是有太多因素影響電路穩定度,對於雙斜率式積分ADC來說,這些都不會影響,只要有一精準的參考電壓即可。

第九章製作心得

9-1. 結論

單斜式ADC缺點

      1. RC值的誤差影響,無法IC化
      2. 時脈穩定度影響對準確度成正比
      3. 電源雜訊直接影響RC電壓
      4. OPA的誤差,抵補電壓,飄移電壓調整困難
      5. 比較器的震盪直接影響輸出,將有轉換頻率/2相當的雜訊
      6. 為了放電快速而加入NPN電晶體,反而增加電路複雜度及誤差
      7. 理論合理也很漂亮,但實際均非理想且誤差頗大,校正困難,比起其他形式ADC反而困難

要有一線性的控制非常不易,雖然理論上都能做精準的計算,但實際上元件的誤差及缺陷無法彌補,只能在功能上做一些取捨,電容一般放電速度很慢,能快速放電的電容價格較高,電路上基本的缺點是放電太慢,OPA的誤差也需要考量,若比較器產生不正常的震盪必須做修正,例如降低解析度或做平均,若改用連續漸進式ADC將可有效改善積分式ADC速度慢的缺點,我們只需要用OPA加上R-2R網路做DAC,就電路來說沒有電榕的誤差,而大量使用同一阻值的電阻也可減少誤差,我們可以使用B型排阻來減少比例上的誤差,效果尤佳,其次是速度上比較快。

9-2.發展空間

改善單斜式積分ADC的缺點,使用雙斜率ADC,輸入電壓用感測器如AD590或其他感測器代替,利用PWM輸出控制功率,或利用RS-232做傳輸,與PC做結合,如果再配合網路即可形成類似遠端監控的功能,可以擴大應用的範圍。

參考文獻

http://www.allaboutcircuits.com/

http://en.wikipedia.org/wiki/RC_circuit

http://www.atmel.com/products/AVR/

http://www.avr-asm-tutorial.net/avr_en/beginner/index.html

附錄

AT90S2313資料手冊

74LS47資料手冊

Code Vision AVR C CompilerC 編譯器

Application NoteAVR128

Application NoteAVR108

指令表.HLPAVR指令

ponyprogV206fsetup.exe燒錄程式

Assembler tool組譯器

智慧財產權聲明

本文中所提到的商標,均屬其合法註冊之分公司所有。而其中所引用之網站畫面及圖片的著作權分屬各公司、團體、法人、或個人所有,在本專題中僅作介紹之用,絕無侵犯著作權之意。