單片機實現模擬量輸出的方法還是比較多的,主要有兩類方法,一類是通過一些常見的數模轉換芯片實現、另一類是通過單片機內部專有的DAC模塊進行轉換實現。比如STC系列單片機、mPS430系列單片機、STM32系列單片機等內部都有DAC輸出模塊,我們通過編寫程序對內部寄存器進行配置就可以實現模擬信號的輸出。

單片機實現模擬量輸出的方法有哪些

通過數模轉換芯片實現的模擬量輸出

我們常見的D/A轉換芯片有PCF8591,它 是一個單電源低功耗的 8 位 CMOS 數據采集器件,具有 4 路模擬輸入,1 路模擬輸出和一個串行 I2C 總線接口用來與 MCU 通信。3 個地址引腳 A0、A1、A2 用于編程硬件地址,允許最多 8 個器件連接到 I2C 總線而不需要額外的片選電路。器件的地址、控制以及數據都是通過 I2C 總線來傳輸,其原理圖如下

單片機實現模擬量輸出的方法有哪些

我們用這個芯片實現一個數模轉換的例子,例如我們制作一個函數信號發生器。有了 D/A芯片 這個武器,我們就不僅可以輸出方波信號了,還可以輸出任意波形,比如正弦波、三角波、鋸齒波等。我們以正弦波為例,首先我們要建立一個各種波形的數組。我們可以通過這些數據表,然后可以根據時間參數自己選取其中一定量數據作為我們程序的各種波形的數組,我們選取一定數量的點,如下面的圖所示。由于用的是I2C總線方式進行傳送,這種電路的轉換速率較慢,不適合高速場合下使用。

單片機實現模擬量輸出的方法有哪些

另外我們還可以用單片機與外圍DAC轉換芯片實現模擬量的輸出,常見的有AD7520(10位分辨率)、DAC1210(12位分辨率)、AK7546(16位分辨率)等,這里我們用一個8位單片機常用的DAC0832(8位分辨率)數模轉換芯片來說明,由于DAC0832芯片數據輸入有三種方式(雙緩沖、單緩沖、直通),我們舉的例子是采用的直通方式,它與單片機的接口電路如下面的圖所示。

單片機實現模擬量輸出的方法有哪些

這種芯片是電流輸出型的DA芯片因此在I2加了運算放大器,實現了把電流信號轉換為電壓信號的功能,這個電路的缺點是需要正負12V電源。其輸出的波形如下圖所示。

單片機實現模擬量輸出的方法有哪些

其參考程序如下:

/* 三角波數據,取值由小到大,再由大到小 */

uchar code tab_tri[40]={

0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,

20,19,18,17,16,15,14,13,12,11,10,9,8,7,6,5,4,3,2,1

};

/* 正弦波數據,y=128*sin(x*PI/180)+127,x=0~360,△x=10 */

uchar code tab_sin[36]={

127,149,171,191,209,225,238,247,253,255,253,247,238,225,209,191,

171,149,127,105,83,63,45,29,16,7,1,0,1,7,16,29,45,63,83,104

};

delay(uint i){while(--i);} //延時函數

void main(){

uchar waveFlag=0; //波形標志

uchar i;

while(1){

/* 按鍵部分 */

if(!key_off) waveFlag = Flag_off;

else if(!key_tri)waveFlag = Flag_tri;

else if(!key_sin)waveFlag = Flag_sin;

/* 波形產生部分 */

switch(waveFlag){

case Flag_tri: //三角波

for(i=0;i

{ DA0832=tab_tri*255/20; delay(10); }

break;

case Flag_sin: //正弦波

for(i=0;i

{ DA0832=tab_sin; delay(10); }

break;

default : //關閉輸出

DA0832=0;

}

}

}

單片機實現模擬量輸出的方法有哪些

其他方法也可以實現模擬量的輸出,比如SPWM波形的輸出,用單片機I/O口模擬出一種類似模擬量的輸出,在呼吸燈、直流電機調速等場合應用很廣泛。