0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

STC8A8K64S4A12系列單片機(jī)DAC數(shù)模轉(zhuǎn)換器講解

CHANBAEK ? 來源:百家號電子友人號 ? 作者:百家號電子友人號 ? 2023-11-17 16:38 ? 次閱讀

前言

今天介紹下STC8A8K64S4A12系列單片機(jī)DAC數(shù)模轉(zhuǎn)換原理及RC積分電路原理,掌握掌握STC8A8K64S4A12系列單片機(jī)實現(xiàn)DAC功能的硬件和軟件設(shè)計。

一、硬件設(shè)計

1.DAC概念介紹

DAC
(全稱是DigitaltoAnalogConvertor)數(shù)模轉(zhuǎn)換器是一種將數(shù)字信號轉(zhuǎn)換為模擬信號(以電流、電壓或電荷的形式)的設(shè)備,在很多數(shù)字系統(tǒng)中(例如計算機(jī)、單片機(jī)),信號以數(shù)字方式(0或者1)存儲和傳輸,而數(shù)模轉(zhuǎn)換器DAC可以將這樣的信號轉(zhuǎn)換為模擬信號,從而使得他們能夠被外界(人或其他非數(shù)字系統(tǒng))識別。

數(shù)模轉(zhuǎn)換器DAC的常見用法是在音樂播放器中將數(shù)字形式存儲的音頻信號輸出為模擬的聲音。有的電視機(jī)的顯像也有類似的過程。數(shù)模轉(zhuǎn)換器DAC有時會降低原有模擬信號的精度,因此轉(zhuǎn)換細(xì)節(jié)常常需要篩選,使得誤差可以忽略。

DAC有幾個常見且重要的性能參數(shù),如分辨率、線性度、建立時間、絕對精度和相對精度等。這里簡單說下分辨率和線性度的概念。DAC的分辨率是輸入數(shù)字量的最低有效位(LSB)發(fā)生變化時,所對應(yīng)的輸出模擬量(電壓或電流)的變化量。其反映了輸出模擬量的最小變化值。DAC的線性度(也稱非線性誤差)是實際轉(zhuǎn)換特性曲線與理想直線特性之間的最大偏差。常以相對于滿量程的百分?jǐn)?shù)表示。

現(xiàn)市場上越來越多的MCU芯片內(nèi)部會集成DAC外設(shè),也有專用DAC芯片,包括一些音頻芯片都屬于DAC芯片,比如PCM5102A等。說到單片機(jī)DAC外設(shè),一定會給出這個DAC外設(shè)是多少位的,比如單片機(jī)片內(nèi)有16位DAC,就意味著數(shù)字信號的范圍是065535,假設(shè)該DAC輸出是03.3V的電壓型模擬信號,那DAC轉(zhuǎn)換可分辨的最小電壓(分辨率)就是3300mV/65535=0.05mV,這也就意味DAC數(shù)字信號輸出有1bit的抖動,那么實際輸出的模擬信號就有0.05mV的偏差。

DAC核心部分是由R-2R電阻網(wǎng)絡(luò)(也稱倒T型電阻網(wǎng)絡(luò))、模擬開關(guān)和運(yùn)算放大器所組成。這里之所以說核心部分是因為有些專用DAC芯片,比如音頻芯片可能還有I2S接口相關(guān)的外圍電路等。下面簡單介紹下倒T型電阻網(wǎng)絡(luò)。解析這個原理圖時我們必須知道戴維南等效電源定理,然后從右側(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ā)板實現(xiàn)DAC轉(zhuǎn)換是基于將高速PWM信號通過RC電路整合成比較平緩的電壓信號作為模擬輸出,而改變高速PWM信號的占空比可改變輸出電平信號的幅值。為了達(dá)到比較理想的電壓信號輸出,P7.0口輸出的PWM信號經(jīng)2級RC電路整合,如下圖。

圖2:開發(fā)板DAC轉(zhuǎn)換電路

☆注:開發(fā)板J27端子需使用短路帽短接P06||DAC_O和P70||DAC_I,并且將J27端子的P06||ADC和P70||DHT11短路帽去掉。

DAC電路占用的單片機(jī)的引腳如下表:

表1:DAC電路引腳分配

注:非獨立GPIO表示開發(fā)板有其他的電路使用這個GPIO。

RC積分電路簡介

由電阻R和電容C構(gòu)成的電路稱為阻容電路,簡稱RC電路。RC電路是電子電路中非常常見的一種電路,但RC電路的種類和變化很多,首先我們介紹下RC積分電路。

在RC電路分析中,有時要用到時間常數(shù)這一概念。時間常數(shù)為電容量與電阻值的乘積。在電容量大小不變時,電阻值決定了時間常數(shù)的大小。電阻值不變時,電容量的大小決定了時間常數(shù)的大小。輸入信號加在電阻R1上,輸出信號取自電容C1。輸入信號是矩形脈沖,在積分電路中,要求RC電路中的時間常數(shù)遠(yuǎn)大于脈沖寬度。

圖3:RC積分電路分析示意圖

☆注:RC積分電路的作用是:消減變化量,突出不變量。故RC積分電路可將矩形脈沖波轉(zhuǎn)換為鋸齒波或三角波,還可將鋸齒波轉(zhuǎn)換為拋物波。

RC積分電路的條件是時間常數(shù)遠(yuǎn)大于輸入信號的脈沖寬度,STC8A8K64S4A12開發(fā)板的RC電路中,R1取值3.3K、C1取值100nF,可計算時間常數(shù)為R1C1=3.3KΩ10010-9F=3.310-4。如果時間常數(shù)遠(yuǎn)大于輸入信號的脈沖周期,則也一定滿足RC積分電路的條件。換句話說如果時間常數(shù)的倒數(shù)遠(yuǎn)小于輸入信號的頻率,則也一定滿足RC積分電路的條件。時間常數(shù)的倒數(shù)可計算出為3.3*10-4的倒數(shù)約為3030,所以輸入信號的頻率只要遠(yuǎn)大于3.03KHZ即可滿足積分電路的條件(一般按照10倍來作為基本條件)。

STC8A8K64S4A12開發(fā)板控制P7.0口輸出PWM信號的頻率約是43.2KHZ(具體不詳述),該頻率滿足RC積分電路的條件,所以可將P7.0口輸出的PWM信號整合成比較平緩的電壓信號(可使用示波器輔助測量之)。又因為單片機(jī)控制P7.0口輸出的PWM信號頻率不變、占空比變化,所以最后整合出的電壓信號的幅值會不同,從而實現(xiàn)輸出不同模擬量的目的。

RC微分電路簡介

RC微分電路和RC積分電路在電路形式上相近,RC微分電路輸出電壓取自電阻,而且RC時間常數(shù)與積分電路不同。RC微分電路中,要求RC時間常數(shù)遠(yuǎn)小于輸入信號的脈沖寬度。如下圖所示。

圖4:RC微分電路分析示意圖

注:RC微分電路的作用是:消減不變量,突出變化量。故RC微分電路可把矩形波轉(zhuǎn)換為尖脈沖波,電路的輸出波形只反映輸入波形的突變,即只有輸入波形發(fā)生突變的瞬間才有輸出。而對恒定部分則沒有輸出。

除了上面描述的RC微分電路和RC積分電路,RC電路還有很多不同應(yīng)用,比如RC耦合電路、RC脈沖分壓器以及RC濾波電路等。

二、軟件設(shè)計

1.DAC檢測 - 串口調(diào)試助手實驗

1.1.工程需要用到的c文件

本例需要用到的c文件如下表所示,工程需要添加下表中的c文件。

表2:實驗需要用到的c文件

1.2.頭文件引用和路徑設(shè)置

需要引用的頭文件

#include "delay.h"  
#include "uart.h"  
#include "adc.h"  
#include "pca.h" 

需要包含的頭文件路徑

本例需要包含的頭文件路徑如下表:

表3:頭文件包含路徑

MDK中點擊魔術(shù)棒,打開工程配置窗口,按照下圖所示添加頭文件包含路徑。

圖5:添加頭文件包含路徑

1.3.編寫代碼

首先,在adc.c文件中編寫操作ADC外設(shè)會用到的函數(shù),如下表所示。

表4:ADC操作函數(shù)匯集

關(guān)于上面2個ADC基本操作函數(shù),下面詳細(xì)給出代碼。

程序清單:ADC口初始化函數(shù)

/************************************************************************** 
功能描述:ADC口初始化 
入口參數(shù):無 
返回值:無 
 *************************************************************************/  
void    ADC_config(void)  
{     
    ADC_CONTR|=0x80;        //開AD轉(zhuǎn)換電源  
    delay_ms(10);           //適當(dāng)延時等待AD轉(zhuǎn)換供電穩(wěn)定  
    ADC_CONTR|=0x0E;              //選擇P0.6作為模擬功能AD使用  
    ADC_CONTR&=0xFE;              //選擇P0.6作為模擬功能AD使用  
      
    ADCCFG&=0xFC;             //AD轉(zhuǎn)換速度為416個時鐘數(shù)轉(zhuǎn)換一次  
    ADCCFG|=0x0C;             //AD轉(zhuǎn)換速度為416個時鐘數(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;          //啟動AD轉(zhuǎn)換,ADC_START=1  
}

程序清單:讀取ADC轉(zhuǎn)換原始值函數(shù)

/************************************** 
功能描述:ADC口檢測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 

程序清單: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計數(shù)器仍然工作  
    CMOD &= 0xF1;                   //CP2、CP1、CP0設(shè)置為100,PCA時鐘源選擇為系統(tǒng)時鐘  
    CMOD |= 0x08;                   //CP2、CP1、CP0設(shè)置為100,PCA時鐘源選擇為系統(tǒng)時鐘  
    CMOD &= 0xFE;                   //ECF位置0,禁止寄存器CCON中CF位中斷(禁止PCA計時中斷)  
    CL = 0x00;                      //PCA計數(shù)器賦初值  
    CH = 0x00;                      //PCA計數(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;                         //啟動PCA計數(shù)器陣列計數(shù)  
} 

最后,在主函數(shù)中對串口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);                               //初始化后延時  
      
  while (1)  
    {  
        TempData++;  
        CCAP0H = (uint8)(256 - TempData);           //P7.0引腳輸出頻率不變但占空比不斷變化的脈沖信號  
        if(TempData>138)                                   //占空比達(dá)到很大時重新設(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)容,希望對大家有幫助,如果有啥不明白的,歡迎討論哦!

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 單片機(jī)
    +關(guān)注

    關(guān)注

    6022

    文章

    44375

    瀏覽量

    628278
  • dac
    dac
    +關(guān)注

    關(guān)注

    43

    文章

    2225

    瀏覽量

    190431
  • 轉(zhuǎn)換電路
    +關(guān)注

    關(guān)注

    2

    文章

    205

    瀏覽量

    30416
  • 數(shù)模轉(zhuǎn)換器

    關(guān)注

    13

    文章

    966

    瀏覽量

    82915
  • 積分電路
    +關(guān)注

    關(guān)注

    11

    文章

    84

    瀏覽量

    36772
收藏 人收藏

    評論

    相關(guān)推薦

    STC8A8K64S4A12串口通信

    宏晶 的51單片機(jī)STC8A8K64S4A12想用r422的串口通信方式,誰能發(fā)個原理圖,r422芯片是TI的65HVD33。
    發(fā)表于 03-09 15:48

    STC8A8K64S4A12開發(fā)板學(xué)習(xí)資料

    `STC8A8K64S4A12系列單片機(jī)是宏晶公司(STC)2016年推出的寬電壓工作范圍的1T單片機(jī),該
    發(fā)表于 01-06 10:25

    淺析STC8A8K64S4A12開發(fā)板

    版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上原文出處鏈接。文章目錄前言一、STC8A8K64S4A12系列單片機(jī)介紹二、STC8A8K64S4A12開發(fā)板概述三、
    發(fā)表于 07-19 09:24

    如何對基于STC8A8K64S4A12單片機(jī)的ADC進(jìn)行檢測

    STC8系列單片機(jī)有哪些優(yōu)點?與ADC相關(guān)的寄存有哪些?如何對基于STC8A8K64S4A12單片機(jī)
    發(fā)表于 08-03 07:30

    基于STC8A8K64S4A12智能車設(shè)計資料分享

    智能車進(jìn)階版文章目錄基于STC8A8K64S4A12智能車設(shè)計一、板載外設(shè)二、功能三、實物:四、代碼五、PCB和元件六、焊接基于STC8A8K64S4A12智能車設(shè)計一、板載外設(shè)1.1 紅外接收頭
    發(fā)表于 02-16 06:43

    STC8A8K64S4A12的命名規(guī)則是什么

    STC8A8K64S4A12的命名規(guī)則STC8 -- STC8系列A -- 子系列中的
    發(fā)表于 02-18 07:32

    如何使用STC8A8K64S4A12單片機(jī)實現(xiàn)簡單的LED燈閃爍

    前幾日,使用STC8A8K64S4A12單片機(jī)寫了一個簡單的LED燈閃爍,是在庫函數(shù)里直接寫的,生成的HEX有100多K,下載進(jìn)入板子,本來設(shè)置的1秒延時突然變的有20秒的樣子,檢查一天都沒有結(jié)果
    發(fā)表于 02-18 07:17

    STC8A8K64S4A12單片機(jī)怎么能掉電后保存數(shù)據(jù)?

    STC8A8K64S4A12單片機(jī)怎么才能做到掉電后把數(shù)據(jù)寫到EEPROM通過哪些功能實現(xiàn)
    發(fā)表于 10-08 08:00

    STC8A8K64S4A12迷你開發(fā)板電路原理圖免費下載

    本文檔的主要內(nèi)容詳細(xì)介紹的是STC8A8K64S4A12迷你開發(fā)板電路原理圖免費下載。
    發(fā)表于 06-27 08:00 ?159次下載
    <b class='flag-5'>STC8A8K64S4A12</b>迷你開發(fā)板電路原理圖免費下載

    使用STC8A8K64S4A12單片機(jī)掉電喚醒定時應(yīng)用的實例

    本文檔的主要內(nèi)容詳細(xì)介紹的是使用STC8A8K64S4A12單片機(jī)掉電喚醒定時應(yīng)用的實例。
    發(fā)表于 01-28 08:00 ?24次下載
    使用<b class='flag-5'>STC8A8K64S4A12</b><b class='flag-5'>單片機(jī)</b>掉電喚醒定時<b class='flag-5'>器</b>應(yīng)用的實例

    STC8A8K64S4A12開發(fā)板】—聊聊單片機(jī)中斷原理

    版權(quán)聲明:本文為博主原創(chuàng)文章,轉(zhuǎn)載請附上原文出處鏈接。文章目錄前言一、關(guān)于中斷的一些概念二、STC8A8K64S4A12系列的中斷請求源三、關(guān)于中斷的一些概念STC8A8K64S4A12系列
    發(fā)表于 11-10 20:50 ?13次下載
    【<b class='flag-5'>STC8A8K64S4A12</b>開發(fā)板】—聊聊<b class='flag-5'>單片機(jī)</b>中斷原理

    基于STC8A8K64S4A12單片機(jī)硬件IIC_光照強(qiáng)度檢測

    基于STC8A8K64S4A12單片機(jī)硬件IIC_光照強(qiáng)度檢測
    發(fā)表于 11-14 15:21 ?18次下載
    基于<b class='flag-5'>STC8A8K64S4A12</b><b class='flag-5'>單片機(jī)</b>硬件IIC_光照強(qiáng)度檢測

    STC8A8K64S4A12的命名規(guī)則

    STC8A8K64S4A12的命名規(guī)則STC8 -- STC8系列A -- 子系列中的
    發(fā)表于 12-23 19:11 ?24次下載
    <b class='flag-5'>STC8A8K64S4A12</b>的命名規(guī)則

    四軸飛控STC8A8K16S4A12原理圖與源代碼分享

    四軸飛控-STC8A8K16S4A12原理圖與源代碼,本飛控使用世界上速度最快的51:宏晶科技出品的STC8系列單片機(jī)STC8A8K64S4A12
    發(fā)表于 09-30 17:23 ?10次下載

    基于STC8A8K64S4A12制作一個示波器

    摘要:此示波器的主控是STC8A8K64S4A12,是在B站老劉示波器基礎(chǔ)上的升級版,擴(kuò)展了測量負(fù)電壓的功能,更新了UI設(shè)計,屏幕升級為1.3寸OLED屏。
    的頭像 發(fā)表于 02-06 11:48 ?2433次閱讀