前言
今天介紹下STC8A8K64S4A12系列單片機(jī)DAC數(shù)模轉(zhuǎn)換原理及RC積分電路原理,掌握掌握STC8A8K64S4A12系列單片機(jī)實(shí)現(xiàn)DAC功能的硬件和軟件設(shè)計(jì)。
一、硬件設(shè)計(jì)
1.DAC概念介紹
DAC
(全稱是DigitaltoAnalogConvertor)數(shù)模轉(zhuǎn)換器是一種將數(shù)字信號(hào)轉(zhuǎn)換為模擬信號(hào)(以電流、電壓或電荷的形式)的設(shè)備,在很多數(shù)字系統(tǒng)中(例如計(jì)算機(jī)、單片機(jī)),信號(hào)以數(shù)字方式(0或者1)存儲(chǔ)和傳輸,而數(shù)模轉(zhuǎn)換器DAC可以將這樣的信號(hào)轉(zhuǎn)換為模擬信號(hào),從而使得他們能夠被外界(人或其他非數(shù)字系統(tǒng))識(shí)別。
數(shù)模轉(zhuǎn)換器DAC的常見用法是在音樂播放器中將數(shù)字形式存儲(chǔ)的音頻信號(hào)輸出為模擬的聲音。有的電視機(jī)的顯像也有類似的過程。數(shù)模轉(zhuǎn)換器DAC有時(shí)會(huì)降低原有模擬信號(hào)的精度,因此轉(zhuǎn)換細(xì)節(jié)常常需要篩選,使得誤差可以忽略。
DAC有幾個(gè)常見且重要的性能參數(shù),如分辨率、線性度、建立時(shí)間、絕對(duì)精度和相對(duì)精度等。這里簡(jiǎn)單說下分辨率和線性度的概念。DAC的分辨率是輸入數(shù)字量的最低有效位(LSB)發(fā)生變化時(shí),所對(duì)應(yīng)的輸出模擬量(電壓或電流)的變化量。其反映了輸出模擬量的最小變化值。DAC的線性度(也稱非線性誤差)是實(shí)際轉(zhuǎn)換特性曲線與理想直線特性之間的最大偏差。常以相對(duì)于滿量程的百分?jǐn)?shù)表示。
現(xiàn)市場(chǎng)上越來越多的MCU芯片內(nèi)部會(huì)集成DAC外設(shè),也有專用DAC芯片,包括一些音頻芯片都屬于DAC芯片,比如PCM5102A等。說到單片機(jī)DAC外設(shè),一定會(huì)給出這個(gè)DAC外設(shè)是多少位的,比如單片機(jī)片內(nèi)有16位DAC,就意味著數(shù)字信號(hào)的范圍是065535,假設(shè)該DAC輸出是03.3V的電壓型模擬信號(hào),那DAC轉(zhuǎn)換可分辨的最小電壓(分辨率)就是3300mV/65535=0.05mV,這也就意味DAC數(shù)字信號(hào)輸出有1bit的抖動(dòng),那么實(shí)際輸出的模擬信號(hào)就有0.05mV的偏差。
DAC核心部分是由R-2R電阻網(wǎng)絡(luò)(也稱倒T型電阻網(wǎng)絡(luò))、模擬開關(guān)和運(yùn)算放大器所組成。這里之所以說核心部分是因?yàn)橛行S肈AC芯片,比如音頻芯片可能還有I2S接口相關(guān)的外圍電路等。下面簡(jiǎn)單介紹下倒T型電阻網(wǎng)絡(luò)。解析這個(gè)原理圖時(shí)我們必須知道戴維南等效電源定理,然后從右側(cè)向左去等效可分析出I7是I的1/2,I6是I的1/4,I5是I的1/8,I4是I的1/16,I3是I的1/32,I2是I的1/64,I1是I的1/128,I0是I的1/256,如此每一位都發(fā)揮了有效的位權(quán),輸出電壓有256種變化,該T型電阻網(wǎng)絡(luò)等效輸出表達(dá)式為D0Vref/256+D1Vref/128+D2Vref/64+D3Vref/32+D4Vref/16+D5Vref/8+D6Vref/4+D7Vref/2。
圖1:T型電阻網(wǎng)絡(luò)示意圖
☆注:本T型電阻網(wǎng)絡(luò)是8位DAC舉例,若是10位、12位、16位依次按此方法增加R電阻和2R電阻電路部分。
2.開發(fā)板DAC硬件電路介紹
STC8A8K64S4A12系列單片機(jī)內(nèi)部沒有集成DAC外設(shè),所以STC8A8K64S4A12開發(fā)板實(shí)現(xiàn)DAC轉(zhuǎn)換是基于將高速PWM信號(hào)通過RC電路整合成比較平緩的電壓信號(hào)作為模擬輸出,而改變高速PWM信號(hào)的占空比可改變輸出電平信號(hào)的幅值。為了達(dá)到比較理想的電壓信號(hào)輸出,P7.0口輸出的PWM信號(hào)經(jīng)2級(jí)RC電路整合,如下圖。
圖2:開發(fā)板DAC轉(zhuǎn)換電路
☆注:開發(fā)板J27端子需使用短路帽短接P06||DAC_O和P70||DAC_I,并且將J27端子的P06||ADC和P70||DHT11短路帽去掉。
DAC電路占用的單片機(jī)的引腳如下表:
表1:DAC電路引腳分配
注:非獨(dú)立GPIO表示開發(fā)板有其他的電路使用這個(gè)GPIO。
RC積分電路簡(jiǎn)介
由電阻R和電容C構(gòu)成的電路稱為阻容電路,簡(jiǎn)稱RC電路。RC電路是電子電路中非常常見的一種電路,但RC電路的種類和變化很多,首先我們介紹下RC積分電路。
在RC電路分析中,有時(shí)要用到時(shí)間常數(shù)這一概念。時(shí)間常數(shù)為電容量與電阻值的乘積。在電容量大小不變時(shí),電阻值決定了時(shí)間常數(shù)的大小。電阻值不變時(shí),電容量的大小決定了時(shí)間常數(shù)的大小。輸入信號(hào)加在電阻R1上,輸出信號(hào)取自電容C1。輸入信號(hào)是矩形脈沖,在積分電路中,要求RC電路中的時(shí)間常數(shù)遠(yuǎn)大于脈沖寬度。
圖3:RC積分電路分析示意圖
☆注:RC積分電路的作用是:消減變化量,突出不變量。故RC積分電路可將矩形脈沖波轉(zhuǎn)換為鋸齒波或三角波,還可將鋸齒波轉(zhuǎn)換為拋物波。
RC積分電路的條件是時(shí)間常數(shù)遠(yuǎn)大于輸入信號(hào)的脈沖寬度,STC8A8K64S4A12開發(fā)板的RC電路中,R1取值3.3K、C1取值100nF,可計(jì)算時(shí)間常數(shù)為R1C1=3.3KΩ10010-9F=3.310-4。如果時(shí)間常數(shù)遠(yuǎn)大于輸入信號(hào)的脈沖周期,則也一定滿足RC積分電路的條件。換句話說如果時(shí)間常數(shù)的倒數(shù)遠(yuǎn)小于輸入信號(hào)的頻率,則也一定滿足RC積分電路的條件。時(shí)間常數(shù)的倒數(shù)可計(jì)算出為3.3*10-4的倒數(shù)約為3030,所以輸入信號(hào)的頻率只要遠(yuǎn)大于3.03KHZ即可滿足積分電路的條件(一般按照10倍來作為基本條件)。
STC8A8K64S4A12開發(fā)板控制P7.0口輸出PWM信號(hào)的頻率約是43.2KHZ(具體不詳述),該頻率滿足RC積分電路的條件,所以可將P7.0口輸出的PWM信號(hào)整合成比較平緩的電壓信號(hào)(可使用示波器輔助測(cè)量之)。又因?yàn)閱纹瑱C(jī)控制P7.0口輸出的PWM信號(hào)頻率不變、占空比變化,所以最后整合出的電壓信號(hào)的幅值會(huì)不同,從而實(shí)現(xiàn)輸出不同模擬量的目的。
RC微分電路簡(jiǎn)介
RC微分電路和RC積分電路在電路形式上相近,RC微分電路輸出電壓取自電阻,而且RC時(shí)間常數(shù)與積分電路不同。RC微分電路中,要求RC時(shí)間常數(shù)遠(yuǎn)小于輸入信號(hào)的脈沖寬度。如下圖所示。
圖4:RC微分電路分析示意圖
注:RC微分電路的作用是:消減不變量,突出變化量。故RC微分電路可把矩形波轉(zhuǎn)換為尖脈沖波,電路的輸出波形只反映輸入波形的突變,即只有輸入波形發(fā)生突變的瞬間才有輸出。而對(duì)恒定部分則沒有輸出。
除了上面描述的RC微分電路和RC積分電路,RC電路還有很多不同應(yīng)用,比如RC耦合電路、RC脈沖分壓器以及RC濾波電路等。
二、軟件設(shè)計(jì)
1.DAC檢測(cè) - 串口調(diào)試助手實(shí)驗(yàn)
1.1.工程需要用到的c文件
本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。
表2:實(shí)驗(yàn)需要用到的c文件
1.2.頭文件引用和路徑設(shè)置
需要引用的頭文件
#include "delay.h"
#include "uart.h"
#include "adc.h"
#include "pca.h"
需要包含的頭文件路徑
本例需要包含的頭文件路徑如下表:
表3:頭文件包含路徑
MDK中點(diǎn)擊魔術(shù)棒,打開工程配置窗口,按照下圖所示添加頭文件包含路徑。
圖5:添加頭文件包含路徑
1.3.編寫代碼
首先,在adc.c文件中編寫操作ADC外設(shè)會(huì)用到的函數(shù),如下表所示。
表4:ADC操作函數(shù)匯集
關(guān)于上面2個(gè)ADC基本操作函數(shù),下面詳細(xì)給出代碼。
程序清單:ADC口初始化函數(shù)
/**************************************************************************
功能描述:ADC口初始化
入口參數(shù):無
返回值:無
*************************************************************************/
void ADC_config(void)
{
ADC_CONTR|=0x80; //開AD轉(zhuǎn)換電源
delay_ms(10); //適當(dāng)延時(shí)等待AD轉(zhuǎn)換供電穩(wěn)定
ADC_CONTR|=0x0E; //選擇P0.6作為模擬功能AD使用
ADC_CONTR&=0xFE; //選擇P0.6作為模擬功能AD使用
ADCCFG&=0xFC; //AD轉(zhuǎn)換速度為416個(gè)時(shí)鐘數(shù)轉(zhuǎn)換一次
ADCCFG|=0x0C; //AD轉(zhuǎn)換速度為416個(gè)時(shí)鐘數(shù)轉(zhuǎn)換一次
ADC_CONTR&=0xDF; //清AD轉(zhuǎn)換完成標(biāo)志
EADC=0; //禁止ADC轉(zhuǎn)換中斷
ADCCFG|=0x20; //ADC轉(zhuǎn)換結(jié)果ADC_RES存高4位,ADC_RESL存低8位
ADC_CONTR|=0x40; //啟動(dòng)AD轉(zhuǎn)換,ADC_START=1
}
程序清單:讀取ADC轉(zhuǎn)換原始值函數(shù)
/**************************************
功能描述:ADC口檢測(cè)AD轉(zhuǎn)換值函數(shù)
入口參數(shù):無
返回值:ADC 12位數(shù)據(jù)
***************************************/
uint16 Get_ADC12bitResult(void)
{
uint16 AD_Dat=0;
ADC_CONTR&=0xDF; // 將ADC_FLAG清0
ADC_CONTR&=0xBF; //關(guān)閉AD轉(zhuǎn)換,ADC_START=0
//12位AD結(jié)果的高4位放ADC_RES的低4位,低8位在ADC_RESL
AD_Dat = ADC_RES; //將ADC_RES低4位移到應(yīng)在的第9位至第12位
AD_Dat <= 8;
AD_Dat|= ADC_RESL; //將ADC_RESL的8位移到應(yīng)在的低8位
ADC_CONTR|=0x40; //啟動(dòng)AD轉(zhuǎn)換,ADC_START=1
return AD_Dat;
}
程序清單:PCA初始化函數(shù)
/**************************************************************************
功能描述:PCA初始化
入口參數(shù):無
返回值:無
*************************************************************************/
void PCAInit(void)
{
P_SW1 &= 0xEF; //選擇PCA模塊0為引腳P7.0,選擇PCA模塊1為引腳P7.1
P_SW1 |= 0x20; //選擇PCA模塊2為引腳P7.2,選擇PCA模塊3為引腳P7.3
CCON = 0x00; //CF、CR、CCF1、CCF0位均清零
CMOD &= 0x7F; //CIDL位置0,空閑模式下PCA計(jì)數(shù)器仍然工作
CMOD &= 0xF1; //CP2、CP1、CP0設(shè)置為100,PCA時(shí)鐘源選擇為系統(tǒng)時(shí)鐘
CMOD |= 0x08; //CP2、CP1、CP0設(shè)置為100,PCA時(shí)鐘源選擇為系統(tǒng)時(shí)鐘
CMOD &= 0xFE; //ECF位置0,禁止寄存器CCON中CF位中斷(禁止PCA計(jì)時(shí)中斷)
CL = 0x00; //PCA計(jì)數(shù)器賦初值
CH = 0x00; //PCA計(jì)數(shù)器賦初值
//PCA模塊0初始化部分
CCAPM0 |= 0x40; //ECOM0位置1,允許比較器功能
CCAPM0 &= 0xDF; //CAPP0位置0,禁止上升沿捕獲
CCAPM0 &= 0xEF; //CAPN0位置0,禁止下降沿捕獲
CCAPM0 &= 0xF7; //MAT0位置0,禁止匹配控制位
CCAPM0 &= 0xFB; //TOG0位置0,禁止翻轉(zhuǎn)控制位
CCAPM0 |= 0x02; //PWM0位置1,開啟PWM模式
CCAPM0 &= 0xFE; //ECCF0位置0,禁止CCF0中斷
PCA_PWM0 &= 0x3F; //PCA模塊0工作于8位PWM功能
PCA_PWM0 &= 0xFC; //EPC0H位和EPC0L位置0
CCAP0L = 0x00; //PCA比較值寄存器賦初值
CR = 1; //啟動(dòng)PCA計(jì)數(shù)器陣列計(jì)數(shù)
}
最后,在主函數(shù)中對(duì)串口1進(jìn)行初始化,主循環(huán)中每200ms通過串口1發(fā)送讀取的端口P06的ADC原始值信息。
代碼清單:主函數(shù)
int main()
{
uint16 TempData=0;
P3M1 &= 0xFE; P3M0 &= 0xFE; //設(shè)置P3.0為準(zhǔn)雙向口
P3M1 &= 0xFD; P3M0 |= 0x02; //設(shè)置P3.1為推挽輸出
PCAInit(); //PCA初始化
ADC_config(); //ADC初始化
Uart1_Init(); //串口1初始化
EA = 1; //使能總中斷
delay_ms(10); //初始化后延時(shí)
while (1)
{
TempData++;
CCAP0H = (uint8)(256 - TempData); //P7.0引腳輸出頻率不變但占空比不斷變化的脈沖信號(hào)
if(TempData>138) //占空比達(dá)到很大時(shí)重新設(shè)定占空比
TempData=1;
delay_ms(20);
printf("\r\n ADC_P06端口原始值: %d\r\n",Get_ADC12bitResult()); //串口打印上傳的采集的原始值
delay_ms(200);
}
}
1.4.硬件連接
圖6:開發(fā)板連接圖
總結(jié)
以上是今天要講的內(nèi)容,希望對(duì)大家有幫助,如果有啥不明白的,歡迎討論哦!
-
單片機(jī)
+關(guān)注
關(guān)注
6043文章
44622瀏覽量
638533 -
dac
+關(guān)注
關(guān)注
43文章
2309瀏覽量
191563 -
轉(zhuǎn)換電路
+關(guān)注
關(guān)注
2文章
205瀏覽量
30539 -
數(shù)模轉(zhuǎn)換器
+關(guān)注
關(guān)注
14文章
1024瀏覽量
83377 -
積分電路
+關(guān)注
關(guān)注
11文章
85瀏覽量
37050
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論