台式电脑

电脑怎么样实现测电压(单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化)

在第7节,我们讨论了借助于单片机和传感器,电脑也能获取环境参数,例如室内的温度和湿度等信息。

不过不知道大家注意到没有,环境的温湿度应该是无时无刻都在变化的,而我们使用单片机采集的温湿度值却是离散的(大约1秒个温度值),这其实就是将模拟信息数字化的过程。

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

使用ADC将模拟信号数字化

相当一部分单片机都带有ADC外设,ADC的功能就是将模拟信息数字化。恰好我使用的这款51单片机就有ADC功能,本节将介绍该模块。目的是让我们的电脑具备测量电压的能力。

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

ADC的全称是Analog-to-DigitalConverter,即“模拟到数字转换器”,它可以将连续不断变化的模拟信号转换为离散的数字信号,供计算机进一步处理。

将模拟信号数字化之后,才能使用计算机处理之,因为计算机本身就是数字电路组成的运算机器。

其实说将模拟信号“转换”为离散信号并不合适,更恰当的说法应该是ADC从模拟信号中取出“一部分”信息,请看下面右图的黑点即为ADC采集的数字信号。

单片机很好玩8,电脑也能测电压,只要使用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模块结构如下图所示:

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

可以看出,最终得到的数字信号其实是经过逐次比较的来的。下图是ADC相关寄存器的信息:

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

所以,在keil4中可以写出如下C语言代码:

sfrADC_CONTR=0xbc;sfrADC_RES=0xbd;//高8位结果sfrADC_LOW2=0xbe;//低2位结果sfrP1ASF=0x9d;//

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

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

电脑怎么样实现测电压(单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化)

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

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

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

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

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

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

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

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

//获取10位adcWORDget_adc_res(BYTEch){WORDres=0;res=get_adc_h8bit(ch);res<<= 2; res |= ADC_LOW2; return res;}使用电脑测量电压值

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

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

U=n*5V/1024

如此一来,C语言控制程序可以如下写:

voidmain(){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);}}使用电脑测量电压单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

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

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

使用电压表测量该点的电压值,发现的确在3.05V附近:

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

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

单片机很好玩8,电脑也能测电压,只要使用ADC将模拟信号数字化

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

欢迎在评论区一起讨论,质疑。文章都是手打原创,每天最浅显的介绍C语言、linux等嵌入式开发,喜欢我的文章就关注一波吧,可以看到最新更新和之前的文章哦。

相关新闻

返回顶部