单片机实现模拟量输出的方法还是比较多的,主要有两类方法,一类是通过一些常见的数模转换芯片实现、另一类是通过单片机内部专有的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口模拟出一种类似模拟量的输出,在呼吸灯、直流电机调速等场合应用很广泛。