单片机实现模拟量输出的方法有哪些

发布日期:2023-01-06
单片机实现模拟量输出的方法有哪些

电工优优今天要和大家分享的单片机实现模拟量输出的方法有哪些相关信息,接下来我将从单片机实现模拟量检测,单片机实现模拟量到数字量,单片机模拟量输入这几个方面来介绍。

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

以上就是"电工优优"为大家介绍的单片机实现模拟量检测的相关信息,想了解更多"单片机实现模拟量输出的方法有哪些,单片机实现模拟量检测,单片机实现模拟量到数字量,单片机模拟量输入"相关知识,请收藏电工无忧吧。