首先介绍下如何使用51单片机输出模拟信号,要让51单片机输出模拟信号,同样
需要相应的转换器,这种转换器我们称之为DAC数模转换器,但DAC专用芯片价
格是比较高的,在实际应用中通常使用PWM技术来模拟DAC输出。我们开发板上
集成了一个DAC(PWM)模块电路,通过单片机IO口生成PWM波来模拟DAC输出。
本章要实现的功能是:系统运行时,DAC(PWM)模块上的指示灯DA1呈呼吸灯效果,
由暗变亮再由亮变暗。
1 DAC 介绍
- 2 PWM 介绍
3 硬件设计
4 软件设计
1 DAC 简介
DAC(Digital to analog converter)即数字模拟转换器,它可以将数字信
号转换为模拟信号。它的功能与ADC相反。在常见的数字信号系统中,大部分传
感器信号被转化成电压信号,而 ADC 把电压模拟信号转换成易于计算机存储、
处理的数字编码,由计算机处理完成后,再由 DAC 输出电压模拟信号,该电压
原就是这样一个过程。
模拟信号常常用来驱动某些执行器件,使人类易于感知。如音频信号的采集及还
DAC 的主要技术指标如下:
(1)分辨率
DAC 的分辨率是输入数字量的最低有效位(LSB)发生变化时,所对应的输出
模拟量(电压或电流)的变化量。它反映了输出模拟量的最小变化值。分辨率与
输入数字量的位数有确定的关系,可以表示成FS/(2^n)。FS表示满量程输入
值,n为二进制位数。对于5V的满量程,采用8位的DAC时,分辨率为5V/256
=19.5mV;当采用12位的DAC时,分辨率则为5V/4096=1.22mV。显然,位数
越多分辨率就越高。
(2)线性度
线性度(也称非线性误差)是实际转换特性曲线与理想直线特性之间的最大
偏差。常以相对于满量程的百分数表示。如±1%是指实际输出值与理论值之差
在满刻度的±1%以内。
(3)绝对精度和相对精度
绝对精度(简称精度)是指在整个刻度范围内,任一输入数码所对应的模拟
量实际输出值与理论值之间的最大误差。绝对精度是由DAC的增益误差(当输入
数码为全1时,实际输出值与理想输出值之差)、零点误差(数码输入为全0时,
DAC 的非零输出值)、非线性误差和噪声等引起的。绝对精度(即最大误差)应
小于1个LSB。相对精度与绝对精度表示同一含义,用最大误差相对于满刻度的
百分比表示。
(4)建立时间
建立时间是指输入的数字量发生满刻度变化时,输出模拟信号达到满刻度值 的±1/2LSB 所需的时间。是描述D/A转换速率的一个动态指标。根据建立时间 的长短,可以将DAC分成超高速(<1μS)、高速(10~1μS)、中速(100~10 μS)、低速(≥100μS)几档。
2 DAC 工作原理
DAC的输出电压可以通过以下公式计算:
V0=Vref×z/256
其中,z表示单片机提供的数字量,Vref为参考电压,通常连接到系统电源上,即5V。数值256表示DAC的精度为8位。
DAC主要由以下几个部分组成:
- 数字寄存器:用于存储单片机提供的数字量。
- 模拟电子开关:根据数字寄存器中存储的数字量的每一位,控制对应位的模拟电子开关的开启或关闭。
- 位权网络(T型电阻网络):模拟电子开关分别连接在位权网络上,这些开关根据输入的二进制数据的每一位对应开启或关闭,将分压器件(如电阻)上的电压引入输出电路中。位权网络确保每个开关在位权上产生与其位权成正比的电流值。
- 求和运算放大器:对各电流值进行求和,并转换成电压值输出。
- 基准电压源(或恒流源):提供稳定的参考电压或电流,确保DAC输出的准确性。
模拟电子开关的个数取决于DAC的精度。对于8位DAC,有8个模拟电子开关。这些开关将基准电压分为256份(由于是8位二进制数,所以为28=256份),这些分压并不是平均的,而是根据二进制权重进行分配的。
当单片机提供一个8位的数字量时,数字寄存器将其存储,并控制对应的模拟电子开关开启或关闭。这些开关将位权网络上与其位权成正比的电压值引入求和运算放大器,求和运算放大器再将这些电压值求和并转换成最终的输出电压。
PWM介绍
出于成本考虑,在实际开发应用中,使用较多的是通过PWM来模拟DAC输出。
下面就先来了解下PWM相关概念。
PWM 是 Pulse Width Modulation 的缩写,中文意思就是脉冲宽度调制,简
称脉宽调制。它是利用微处理器的数字输出来对模拟电路进行控制的一种非常有
效的技术,其控制简单、灵活和动态响应好等优点而成为电力电子技术最广泛应
用的控制方式,其应用领域包括测量,通信,功率控制与变换,电动机控制、伺
服控制、调光、开关电源,甚至某些音频放大器,因此学习 PWM 具有十分重要
的现实意义。
其实我们也可以这样理解,PWM 是一种对模拟信号电平进行数字编码的方
法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号
的电平进行编码。PWM 信号仍然是数字的,因为在给定的任何时刻,满幅值的直
流供电要么完全有(ON),要么完全无(OFF)。电压或电流源是以一种通(ON)或断
(OFF)的重复脉冲序列被加到模拟负载上去的。通的时候即是直流供电被加到负
载上的时候,断的时候即是供电被断开的时候。只要带宽足够,任何模拟值都可
以使用 PWM 进行编码。
3 硬件设计
本实验使用到硬件资源如下:
(1)DAC(PWM)模块
下面来看下开发板上DAC(PWM)模块电路,如下图所示:
从上图中可知,PWM输出控制管脚接在单片机P2.1管脚上,DAC1为PWM输
出信号,将其连接一个LED,这样可以通过指示灯的状态直观的反映出PWM输出
电压值变化。LM358芯片与这些电容电阻构成了一个跟随电路,即输入是多少,
输出即为多大电压,输出电压范围是0-5V。输出信号由J52端子的DAC1引出,
在其端子上还有一个AIN3脚,它是上一章介绍ADC时的外部模拟信号输入通道。
如果使用短接片将DAC1和AIN3短接,这样就可以使用XPT2046芯片采集检测
PWM 输出信号。
4软件设计
本章所要实现的功能是:DAC(PWM)模块上的指示灯DA1呈呼吸灯效果,由暗
变亮再由亮变暗。
程序框架如下:
(1)编写PWM函数
(2)编写主函数
本章软件的重点是如何让单片机IO口输出PWM。下面我们打开“\4--实验
程序\1--基础实验\24-DAC数模转换实验”工程,在App工程组中可以看到新添
加了pwm.c文件(里面包含了PWM驱动程序),还要包含对应的头文件路径。
PWM实现函数
PWM的实现均在pwm.c文件中,代码如下:
主函数
打开main.c文件,代码如下:
主函数比较简单,首先调用外设驱动头文件,然后进入主函数初始化PWM, 将定时器设置为0.01ms,初值为0XFFF6,即每隔0.01ms进入一次中断。PWM周 期倍数设置为100,即PWM周期为1ms,占空比设置为0。最后进入while循环, 通过dir切换方向实现duty值的自增和自减来调节占空比,将该值传入到占空 比调节函数pwm_set_duty_cycl。为了使呼吸灯流畅,每调节占空比短暂延时一 下。
实验现象
使用USB线将开发板和电脑连接成功后(电脑能识别开发板上CH340串口),
把编译后产生的.hex文件烧入到芯片内,实现现象如下:DAC(PWM)模块上的指
示灯DA1呈呼吸灯效果,由暗变亮再由亮变暗。
注意:实验中可通过DA1指示灯观察PWM输出,也可使用万用表测量DAC和
GND 电压,观察电压变化。