历史上的今天
返回首页

历史上的今天

今天是:2024年12月06日(星期五)

正在发生

2019年12月06日 | AVR开发 Arduino方法(五) 模数转换子系统

2019-12-06 来源:eefocus

模数转换子系统用于将传感器采集的模拟信号转换为数字信号。Arduino UNO R3主处理器ATMega328P的模数转换子系统采用逐次逼近的方式完成模数转换。


使用Arduino库函数进行模数转换十分简单,下面的示例可以将A0引脚上的模拟信号转换为数字信号,并将转换结果打印到串口0上: 


 1 // ReadAnalogVoltage.ino

 2 void setup() {

 3   Serial.begin(9600);

 4 }

 5 

 6 void loop() {

 7   int sensorValue = analogRead(A0);

 8   float voltage = sensorValue * (5.0 / 1023.0);

 9   Serial.println(voltage);

10 }


与模数转换相关的Arduino库函数有:

analogRead(pin):将指定引脚上的模拟信号转换为数字信号

pin:指定模拟引脚


函数返回转换结果,是一个无符号整数,取值为0~1023

 

ATMega328P的模数转换子系统由2个相关寄存器控制。模数转换多路选择寄存器ADMUX的结构如下图所示:

REFS1

REFS0

ADLAR


MUX3

MUX2

MUX1

MUX0

输入通道选择MUX[3:0]位用于指定模拟信号输入的引脚,Arduino UNO R3开发板上有6个模拟信号输入引脚,它们分别是A0~A5,在ANALOG IN组中。


模数转换控制和状态寄存器ADCSRA的结构如下图所示:

ADEN

ADSC

ADATE

ADIF

ADIE

ADPS2

ADPS1

ADPS0

向模数转换使能位ADEN写入1则启用模数转换,写入0则禁用;向模数转换启动转换位ADSC写入1则启动模数转换,写入0则不启动;模数转换中断标志位ADIF在被置1时模数转换完成,可以向它写1清0;模数转换预分频选择位ADPS[2:0]用于设置模数转换的时钟源,它的设置如下表所示:

ADPS[2:0]

时钟源

000

系统时钟2分频

001

系统时钟2分频

010

系统时钟4分频

011

系统时钟8分频

100

系统时钟16分频

101

系统时钟32分频

110

系统时钟64分频

111

系统时钟128分频

模数转换的结果保存在模数转换数据寄存器ADCH和ADCL中。通过直接访问寄存器改写以上程序为:

 1 // ReadAnalogVoltage_reg.ino

 2 void setup() {

 3   ADMUX = 0x00;

 4   ADCSRA |= (1 << ADEN);

 5 

 6   Serial.begin(9600);

 7 }

 8 

 9 void loop() {

10   ADCSRA |= (1 << ADSC);

11   while (!(ADCSRA & (1 << ADIF)));

12 

13   int sensorValue = (ADCH << 8) | ADCL;

14   float voltage = sensorValue * (5.0 / 1023.0);

15   Serial.println(voltage);

16   ADCSRA |= (1 << ADIF);

17 }

推荐阅读

史海拾趣

创世(CS)公司的发展小趣事

随着产品的不断创新和技术的不断突破,创世公司的市场份额逐渐扩大。公司的SD NAND产品已经广泛应用于医疗设备、工业控制、轨道交通、安防、网络设备等多个领域。这一市场布局的成功,不仅提升了创世公司的品牌影响力,也为其在电子行业树立了良好的口碑。同时,创世公司还积极参与各种行业展会和交流活动,与国内外客户建立了广泛的合作关系,进一步拓展了市场。

艾为(AWINIC)公司的发展小趣事

随着艾为电子在技术和产品方面的不断突破,公司开始积极拓展市场。艾为电子的产品不仅覆盖了华为、小米等知名手机厂商,还广泛应用于可穿戴设备、智能便携设备等领域。同时,公司还加大了品牌建设的力度,通过参加行业展会、举办技术研讨会等方式,提高了品牌知名度和影响力。

AntennaHome公司的发展小趣事

AntennaHome公司深知技术创新是企业持续发展的根本动力。因此,公司始终坚持将研发作为企业的核心战略。公司不断加大对研发的投入力度,引进先进的研发设备和人才,同时积极与高校和研究机构开展合作。这些举措使得公司在天线技术领域始终保持领先地位,为公司的长远发展提供了有力保障。

这五个故事展示了AntennaHome公司在电子行业中的发展历程,从创业初期的技术创新到与国际大厂的合作,再到应对行业变革的挑战、参与国际展会以及持续投入研发,每一步都体现了公司的努力和坚持。

GigPeak公司的发展小趣事

GigPeak公司自成立之初,便专注于高速数据传输技术的研发。在2005年,公司研发团队成功开发出一种新型的光电转换器,该转换器能够在极低的功耗下实现前所未有的数据传输速率。这一技术创新迅速吸引了业界的关注,并成功应用于多个高端数据中心项目,帮助GigPeak在竞争激烈的市场中脱颖而出。随着技术的不断迭代和市场的广泛认可,GigPeak逐渐成为了高速数据传输领域的领军企业。

FEI Microwave Inc公司的发展小趣事

为了进一步增强自身的实力,FEI Microwave Inc公司积极寻求并购其他具有竞争力的企业。在经过一系列的考察和谈判后,FEI Microwave Inc公司成功收购了某家在微波滤波器领域具有领先技术的公司。这次并购不仅使FEI Microwave Inc公司在技术上得到了极大的补充,也为其在微波通信领域的发展奠定了更加坚实的基础。

A1 PROS公司的发展小趣事

在2006年至2007年期间,A1 PROS的技术实力得到了业界的广泛认可。韩国技术信用保证基金将A1 PROS评选为杰出技术公司,这是对A1 PROS在技术研发和创新方面所取得成就的肯定。同时,A1 PROS还被韩国工业银行选定为家族企业,获得了更多的资金支持和发展机会。

问答坊 | AI 解惑

ARM、DSP、FPGA的技术特点和区别

ARM、DSP、FPGA的技术特点和区别是什么?     ARM(Advanced RISC Machines)是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件。ARM架构是面向低预算市场设计的第一款RISC微处理器,基本是32 ...…

查看全部问答>

【EEWORLD模块整理】+超声波模块

本帖最后由 paulhyde 于 2014-9-15 03:01 编辑 [local]1[/loc方便大家    …

查看全部问答>

青越锋与Altium在PCB方面研发能力比较

Altium为澳大利亚的一家为印刷电路板,提供辅助设计软件的软件生产商。旗下EDA产品Protel从1985年的单纯的PCB设计的Dos版 Protel,到09年推出的包含PCB、Cam、FPGA等功能的Summer 09,中间经历了多个版本的升级。就PCB方面的设计而言,Protel每一次 ...…

查看全部问答>

我不说不行啊---说吧

  姐妹们,小S代言的“睡睡瘦”也可以免费申领了!       姐妹们,我昨天又有一个大发现,“睡睡瘦”也可以免费申领了。   这可是个货真价实的好东西,小S代言的,我以前买过,睡觉贴上就可以减肥,效果 ...…

查看全部问答>

讨论贴:WinCE And WinXP,来者有分

换新工作,马上要去做 WinCE 开发了,以前还没做过,大家来讨论看看 WinCE(ARM) 平台和 PC 的 Windows 平台上软件开发有什么不同的地方,想听听大家的意见。…

查看全部问答>

测量量程及供电电压的关系

  一个项目我要测量1000个点,用5V供电会比3V供电更准确吗?5V供电时两个点之间的电压应该更大一些,抗波动强一些.AD采集时我一般都选参考电压基准大的.希望有经验的朋友给予指点.非常感谢!!…

查看全部问答>

电容屏调得我头大

搞来两片台湾的电容式触摸屏,又借了一块7\"的800*480的液晶屏; 想把触摸的功能实现,嗯,是实现了,可调整就麻烦了; 头大得很,有有经验的前辈给点注意事项提醒下呗; 小弟先谢过了!!…

查看全部问答>

stm32在stop模式下串口唤醒会丢失数据?

                                 我想让设备平时在stop模式下,串口有数据来时才唤醒处理,但是现在发现唤醒后数据总是丢失前面一部分,是不是因为 ...…

查看全部问答>

ST-LINK(三合一)的一种连接失败现象及原因

在使用三合一的过程中一直很顺利,但是最近做产品小批量测试时出现一个奇怪的现象,三合一与某些目标板连不上,但是与三合一板上的STM8能正常连接。一开始以为是虚焊或其他问题,经多方查找,未能解决。后测量目标板供电,发现电压不超过5.06 ...…

查看全部问答>

不能设置断点的问题

我现在学2407的C编程,找到一个例子。烧好以后,加载单步运行。当运行到语句:        puts(\\"SineWave example started.\\\\n\\" 时,提示出错: Can\\\'t Set Breakpoint at 0x107: Too many H/W breakpoints. You ca ...…

查看全部问答>