描述

目前单片机在电子产品中已得到广泛应用,许多类型的单片机内部已带有A/D转换电路,但此类单片机会比无A/D转换功能的单片机在价格上高几元甚至很多,本文给大家提供一种实用的用普通单片机实现的A/D转换电路,它只需要使用普通单片机的2个I/O脚与1个运算放大器即可实现,而且它可以很容易地扩展成带有4通道A/D转换功能,由于它占用资源很少,成本很低,其A/D转换精度可达到8位或更高,因此很具有实用价值。

其电路如图一所示:

图一

其工作原理说明如下:

1、硬件说明:

图一中“RA0”和“RA1”为单片机的两个I/O脚,分别将其设置为输出与输入状态,在进行A/D转换时,在程序中通过软件产生PWM,由RA0脚送出预设占空比的PWM波形。RA1脚用于检测比较器输出端的状态。

R1、C1构成滤波电路,对RA0脚送出的PWM波形进行平滑滤波。RA0输出的PWM波形经过R1、C1滤波并延时后,在U1点产生稳定的电压值,其电压值U1=VDD*D1/(D1+D2),若单片机的工作电压为稳定的+5V,则U1=5V*D1/(D1+D2)。

图一中的LM324作为比较器使用,其输入负端的U1电压与输入正端的模拟量电压值进行比较,当U1大于模拟量输入电压时,比较器的输出端为低电平,反之为高电平。

2、A/D转换过程:

如果使RA0输出PWM波形,其占空比由小到大逐渐变化,则U1的电压会由小到大逐渐变化,当U1电压超过被测电压时,比较器的输出端由高电平变为低电平,因此可以认为在该变化的瞬间被测的模拟量与U1的电压相等。

由于U1的电压值=VDD*D1/(D1+D2),当VDD固定时,其电压值取决于PWM波形的占空比,而PWM的占空比由单片机软件内部用于控制PWM输出的寄存器值决定,若软件中用1个8位寄存器A来存放RA0输出的PWM的占空比值D1,因此在RA1检测到由“1”变为“0”的瞬间,A寄存器的值D1即为被测电压的A/D转换值,其A/D转换结果为8位。如果用16位寄存器来作输出PWM的占空比,则A/D转换值可达到16位。

3、A/D转换误差分析及解决办法:

A/D转换的误差主要由以下几个方面决定,分别说明如下:

(1) 单片机的电源电压VDD:在该A/D转换中,VDD电压是造成A/D转换误差的主要原因,如果使VDD电压精度做到较高,则A/D转换误差可以做到很小,在VDD电压精度为0.5%情况下,实际的A/D转换误差小于1%。

(2) 软件产生的PWM占空比:若用于产生PWM的软件设计不良,会使存放占空比的寄存器值与实际输出的PWM占空比不一致,这会导致测量误差。

(3) 比较器输入端的失调电压:该电压对A/D转换精度有一定影响,但影响较小。

(4) RC滤波电路的纹波:在R1、C1取值不当的情况下,U1处的电压纹波较大,并且延时时间不够,会使A/D转换产生误差,因此R1、C1取值不能太小,但太大又会影响A/D转换速度,推荐使用图一中所示的R1、C1参数,在纹波合理的情况下,其转换误差也可通过软件消除。

A/D转换误差的解决办法:

(1) 对VDD造成的误差,只能通过提高VDD电压精度来解决,它相当于A/D转换的基准电压。

(2) 对于软件中PWM设计不良导致的误差,可修改软件进行解决,本文提供了用软件产生PWM的程序流程图,实际使用中可按此流程设计程序。

(3) 对比较器及RC滤波电路的纹波导致的误差,在软件中可通过上、下检测法进行消除,即先将PWM的占空比由小到大变化,使U1电压由低往高逐渐变化,在比较器输出端变化时记录其A/D转换值,再将PWM的占空比由大到小变化,使U1电压由高到低变化,在比较器输出端变化时记录其A/D转换值,将两次的A/D转换值进行平均,可有效地消除这两种误差。

(4) 对A/D转换值进行数字滤波,如多次转换求平均值等。数字滤波消除误差的方法很多,在此不再赘述。

4、A/D转换速度及提高办法:

由于该A/D转换是通过PWM滤波后再进行比较来完成的,其PWM的产生与滤波都需要一定的时间,因此其A/D转换速度较慢,适用于对A/D转换速度要求不高的产品中,其A/D转换速度取决于以下几个方面:

(1) 单片机的运行速度:单片机的运行速度越高则PWM的频率可以越高, RC值就可以取得越小,其延时时间也可以更短,转换速度就更快。

(2) 被测电压值的大小:由于U1电压时是由小到大逐渐加大的,当被测电压值较小时,U1电压上升到相应值的时间就越短,完成A/D转换的速度就越快。

(3) 初始占空比:初始占空比越高,U1电压较大,其上升到被测电压值的时间也就会越短,完成A/D转换的速度也就越快。

由上所述,A/D转换的速度可以通过提高单片机的工作频率,并在预知被测电压范围时尽可能地设置较高的初始占空比值来加快转换速度,如果所要求的A/D转换精度要求不高,还可以在软件中缩短PWM输出的延时时间来提高A/D转换速度。若单片机带有外部电平变换中断和定时器中断,其A/D转换的精度和速度还可以得到提高。

5、输入电压的测量范围:

A/D转换的输入电压测量范围为0V至单片机的电源电压(VDD),若需要提高被测电压范围,可将输入电压通过电阻分压后进行测量,但其A/D转换的误差会受分压电阻影响。

6、A/D转换通道的多路扩展:

图中所用的运算放大器为LM324,该集成电路内部带有4个运放,其余3个运放的输入端可分别作为另外3个A/D转换通道,其输出端与单片机连接,在软件上略作修改,就可以在不增加成本的情况下实现4路A/D转换。

7、用同样的工作原理实现D/A转换:

如图二所示,可使该电路很容易地只用单片机的一个I/O脚实现D/A转换功能。其输出的模拟量电压Vout=VDD*D1/(D1+D2)。该输出电压带有纹波,当RC值足够大时,该纹波值几乎为零,可忽略不计。

8、单片机的A/D转换软件程序流程图:

打开APP精彩内容

点击阅读全文

单片机c语言多路ad转换,如何使用单片机实现低成本的高精度AD转换和DA转换相关推荐

  1. stc15系列c语言pwm编程,STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现.docx...

    STC单片机C语言程序设计 第25章 STC单片机增强型PWM原理及实现 STC单片机增强型PWM发生器原理及应用主 讲:何宾Email:hebin@mail.buct.edu.cn2016.03增强 ...

  2. 8051单片机c语言编程模板,完美的8051单片机C语言编程模板.doc

    完美的8051单片机C语言编程模板.doc <8051单片机C语言编程模板> [程序开始处的程序说明] /***************************************** ...

  3. 单片机c语言期末考试题(a)的答案,单片机C语言期末考试题(A).doc

    单片机C语言期末考试题(A) 一.单项选择题:40 分 1.MCS-51系列的单片机中片内RAM的字节大小可能的是( ) A.128M B.128K C.128 D.64 2.C51语言提供的合法的数 ...

  4. 用51单片机c语言实现电磁炉功能,电磁炉控制系统单片机模拟

    电磁炉控制系统单片机模拟 目 录 引言--------------------------------3 加热原理------------------------------3 工作过程------- ...

  5. 单片机c语言彩灯依次点亮不灭,单片机说课(点亮彩灯).ppt

    <单片机应用技术>(中国劳动社会保障出版社),课题二点亮彩灯,,教材贯彻以任务驱动促进以学生为中心的教学方针,把激发学生的学习兴趣,培养学生思考问题.解决问题能力作为教学的根本目标.从实际 ...

  6. 基于单片机串口远程多路温湿度采集仿真-基于单片机ADC0809八路电压采集系统设计-基于单片机16x32点阵多模式显示仿真设计-基于单片机餐厅呼叫控制系统仿真设计-基于STM32单片机的智能水杯设计

    1220基于单片机ADC0809八路电压采集系统设计-毕设课设资料 数码管显示,测量八路电压表. #define addo (5.0/255.0) #define zero 0.005 //用于校准A ...

  7. 单片机c语言编译软件6,eUIDE下载-单片机c语言编译器 v1.07.32.23 官方版 - 安下载...

    eUIDE是一款专业的单片机c语言编译器,EM78系列集成开发环境是面向项目的ELAN EM78系列微控制器的开发工具,它包括UICE开发在线仿真器和eUIDE软件工具:eUIDE是基于PC端的UIC ...

  8. 单片机c语言程序设计实训报告,(整理)单片机C语言程序设计实训100例.doc

    (整理)单片机C语言程序设计实训100例.doc .单片机C语言程序设计实训100例基于8051Proteus仿真案例第 01 篇 基础程序设计01闪烁的LED/* 名称闪烁的LED说明LED按设定的 ...

  9. stc单片机c语言 pdf,STC单片机C语言程序设计 第13章 STC单片机C语言指针.pdf

    STC单片机C语言指针 主讲:何宾 Email :hebin@mail.buct.edu.cn 2016.03 C51编译器中指针的分类 Cx51编译器支持使用字符"*"声明变量指 ...

  10. 软件工程-c语言--基于at89c51单片机c语言编写的计算器,基于AT89C1单片机C语言编写的计算器.doc...

    基于AT89C1单片机C语言编写的计算器 #include #define uint unsigned int #define uchar unsigned char sbit dula=P2^6; ...

最新文章

  1. 用神经网络分类3*3矩阵
  2. 每日一博 - DelayQueue阻塞队列源码解读
  3. 第一次离线写Blog,先上个图先
  4. 3个多月,近3000人参与的源码共读,诚邀加入~
  5. 装箱与拆箱 c# 1613534570
  6. 一图抵千言:带你快速学会 GoogLeNet 神经网络 | CSDN 博文精选
  7. 华中数控hnc一818b_数控车床精确对刀方法总结
  8. 关于动态语言 静态语言 静态类型语言 动态类型语言的区别
  9. 【个人笔记】OpenCV4 C++ 图像处理与视频分析 10课
  10. 如何测试网站服务器mysql数据库连接,如何测试网站服务器mysql数据库
  11. 树莓派 之 动态DNS(DNSPod)
  12. oracle建表创建约束
  13. 全国地址邮编.sql
  14. 如果你毕业想进央企, 那就选这些大学, 性价比很高
  15. 微信小程序-从0到1实现小程序内打开H5链接或跳转到某个公众号文章
  16. 师资博后是个什么样的职位?
  17. MCS51 系列单片机的中央处理器(CPU)
  18. dve 二维数组信号 显示波形_VCS-DVE
  19. 如何使用cAdvisor和Wavefront监控容器
  20. (转)当AI变成宣传武器:继续深扒大数据公司Cambrige Analytica

热门文章

  1. win10计算机安全策略设置,win10系统重置本地安全策略所有设置的操作方法
  2. KYLO的Spring知识总结
  3. 干货分享!12款响应式的移动网站模板免费下载
  4. 在matlab中开根号,请问,在matlab里面如果输入开方号(根号)?如9的开方怎么写?...
  5. ECharts怎样显示中国地图
  6. 思维导图编辑最常用的几种Edraw Max(亿图)快捷键
  7. CAD中PDF转DWG
  8. 怎么使用计算机操作鼠标,新手学电脑如何使用鼠标
  9. 2021年秋季Python程序设计相关课程教材推荐
  10. 新ssd硬盘怎么安装efi_如何在PC中升级和安装新的硬盘驱动器或SSD