首页 » 科学 » 单片机很好玩8三分钟弄懂什么是ADC若何运用电脑测电压_暗记_旗子

单片机很好玩8三分钟弄懂什么是ADC若何运用电脑测电压_暗记_旗子

南宫静远 2025-01-16 02:55:51 0

扫一扫用手机浏览

文章目录 [+]

不过不知道大家把稳到没有,环境的温湿度该当是无时无刻都在变革的,而我们利用单片机采集的温湿度值却是离散的(大约1秒个温度值),这实在便是将仿照信息数字化的过程。

利用ADC将仿照旗子暗记数字化

相称一部分单片机都带有 ADC 外设,ADC 的功能便是将仿照信息数字化。
恰好我利用的这款 51 单片机就有 ADC 功能,本节将先容该模块。
目的是让我们的电脑具备丈量电压的能力。

单片机很好玩8三分钟弄懂什么是ADC若何运用电脑测电压_暗记_旗子 科学

ADC 的全称是 Analog-to-Digital Converter,即“仿照到数字转换器”,它可以将连续不断变革的仿照旗子暗记转换为离散的数字旗子暗记,供打算机进一步处理。

将仿照旗子暗记数字化之后,才能利用打算机处理之,由于打算机本身便是数字电路组成的运算机器。

实在说将仿照旗子暗记“转换”为离散旗子暗记并不得当,更恰当的说法该当是 ADC 从仿照旗子暗记中取出“一部分”信息,请看下面右图的黑点即为 ADC 采集的数字旗子暗记。

这么看来,ADC的主要参数有两个:采样频率和精度。
采样频率决定了 ADC 从仿照旗子暗记中取数据的“密集”程度,一样平常来说肯定越密集越好,由于这样更能还原旗子暗记的特性。
精度则决定了取数据的时的精确性。

以我的 51 单片机为例,它有 8 路 10 位的 ADC,采样频率为 250K/s。
以是它能从每秒的仿照旗子暗记中取出 25 万个数字旗子暗记,也就相称于在坐标系中用 25 万个点描述出 1 秒的旗子暗记。

精度为 10 位,也便是说它利用 1~1024(2的十次方)的数字表示旗子暗记,我的 51 单片机 ADC 的参考电压旗子暗记为 5V,以是它能够表示的最小电压为 5V/1024 约为 5mV。

C措辞编程单片机,实现ADC采样

现在知道了什么是 ADC,怎么利用它呢?请连续往下看。
我利用的这款 51 单片机自带的 ADC 模块构造如下图所示:

可以看出,终极得到的数字旗子暗记实在是经由逐次比较的来的。
下图是 ADC 干系寄存器的信息:

以是,在 keil4 中可以写出如下C措辞代码:

sfr ADC_CONTR = 0xbc;sfr ADC_RES = 0xbd; // 高 8 位结果sfr ADC_LOW2 = 0xbe; // 低 2 位结果sfr P1ASF = 0x9d; //

我的这款 51 单片机的 ADC 转换通道与 P1 口复用,上电复位后 P1 口为弱上拉型 IO 口,我们可以通过 C措辞编程设置这 8 路的任意一起做 ADC 转换。

void adc_init(){ P1ASF = 0xff; // 8 个通道都开 ADC_RES = 0; ADC_CONTR = ADC_POWER|ADC_SPEEDLL; delay_about_100ms(2);}

上面的C措辞代码中,我们将 P1ASF 赋值为 0xff,表示 P1 的 8 个 IO 口都可以作为 ADC 采样口。
然后延时一段韶光,等待 ADC 模块初始化。

由于我利用的这款 51 单片机是一个 8 位单片机,传送 10 位的 ADC 值须要两次,当 AUXR1.1/ADRJ = 0 时,ADC 转换结果寄存器格式如下:

当 AUXR1.1/ADRJ = 1 时,ADC 转换结果寄存器格式如下:

这么看来,获取一次 ADC 的采样值高 8 位的 C措辞代码可以如下写:

// 获取高 8 位的 adc 值BYTE get_adc_h8bit(BYTE ch){ ADC_CONTR = ADC_POWER|ADC_SPEEDLL|ADC_START|ch; _nop_();_nop_();_nop_();_nop_(); // 等待转换完成 while(!(ADC_CONTR & ADC_FLAG)); ADC_CONTR &= ~ADC_FLAG; return ADC_RES;}

然后将之与余下 2 位 ADC 值组合一下,就得到了一次完全的ADC采样值:

// 获取 10 位 adcWORD get_adc_res(BYTE ch){ WORD res = 0; res = get_adc_h8bit(ch); res <<= 2; res |= ADC_LOW2; return res;}利用电脑丈量电压值

上面一小部分先容了单片机的 ADC 模块利用方法,结合之前先容的单片机的串口 printf,我们已经能够把外界的电压值转换为 1~1024 之间的数值并传送到电脑了,但是如何将之转换为电压值呢?

实在很大略,我的这款单片机 ADC 模块的参考电压为 5V,假设 ADC 采集的数值为 n,那么对应的电压值为:

U = n5V / 1024

如此一来,C措辞掌握程序可以如下写:

void main(){ init_uart(9600); adc_init(); while(1){ delay_about_100ms(2); printf(\"大众adc: %0.2f\r\n\"大众, 5.0((float)get_adc_res(0))/1024.0); }}利用电脑丈量电压

如上图,为了方便测试,将可变电阻和定电阻串联,将单片机的 P10 口与中间相连,即可在电脑真个串口调试助手得到电压信息:

利用电压表丈量该点的电压值,创造的确在 3.05V 附近:

现在调节可变电阻,创造串口传来的电压值也随之改变:

至此就实现了利用电脑丈量电压,相信大家也该当明白了 ADC 的功能。

欢迎在评论区一起谈论,质疑。
文章都是手打原创,每天最浅近的先容C措辞、linux等嵌入式开拓,喜好我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

标签:

相关文章

什么是音乐IC_音色_语音

1、音乐的通道与音色: 包络(envelope)、方波(patch 、通道(channel)。 包络:合成音色的一部分,...

科学 2025-01-16 阅读0 评论0