关于单片机AD或者测量时候,小数的计算和表示方法。

本次测试的单片机是STC15F2K06S2单片机,利用自带的10位AD转换功能,通过串口来显示电压,保留到小数点后2位。

在计算小数的时候,有个技巧,就是可以不用float,直接利用整数来换算。

下面看一下实例:

      先看一下keil中对运算的步骤思路:

      比如  unsigned int  Value;
              Value = Read_Adc( 0 )*5/1024 ;  其中Read_Adc( 0 )表示读取0通道的ad值,返回值为unsigned int,首先程序会先看Read_Adc( 0 )*5/1024中的每一个量,然后将最大量程类型的作为基准,题中也就是Read_Adc( 0 )的类型,为unsigned int,,然后以这种类型做计算,先计算Read_Adc( 0 )*5 并且结果装入unsigned int类型,然后计算剩下的/1024,结果也装入unsigned int类型,然后把这个传递给Value.。思路就是这样,下面做具体讲解: 

       比如最高电压为5V,我们AD测出的值为m,则电压值X为 5 * m  / 1024 ,如果按照普通的unsigned int 来做这个运算的话,如果测得的m为1023的话,结果就为4,小数就直接被忽略了,所以测得的电压为整数,不涵小数。所以我们想到了这样计算: 50* m  / 1024,这样的话,如果测的m为1023的话,结果就为49,那么再将它分开显示,加上小数点就行了。但是这是一位小数的情况,还不会出错,这是因为m最高为1024,则50*1024 = 51200,不会超过其unsigned int (65535)的大小,但是两位小数的话,运算表达式为500* m  / 1024,则最高为1024*500 = 512000大于了unsigned int 的大小,所以会出现错误。所以在这种计算的时候最好衡量一下最大值,强制转换,比如两位小数我们可以这样 ( unsigned long )m*500  / 1024,这样的话就可以计算了,并且计算的时候都是用unsigned long作为类型基准,还有一个需要注意的就是计算完后传递给Value的时候,一定要看一下Value能否将结果装下,比如最高为1024的时候,采用上诉的方法,最后计算出来的结果是500并且类型为unsigned long,所以Value的类型至少都应该为unsigned int类型。下面是一个错误实例,为的是来看一下程序计算:

显示的结果是

也就是说结果为结果为0051,我们来仔细分析一下,我的ad输入电压是4.99V,也就是说,出来的值应该是499,但是它却是51,下面就来好好计算一下,首先4.99V也就是说m的值为1023,并且那段计算基础类型为unsigned int,那么首先执行的1023*500 = 511500,这个值大于了65535,所以会溢出,511500的二进制位:‭0111-1100-1110-0000-1100‬,那么我们只取它的低16位,因为unsigned int为16位,多的就溢出了,所以为1100-1110-0000-1100‬即为十进制的52748,那么再计算52748/1024 = 51.51171875,所以显示的值为51,这个大家可以自己去计算一下。

所以如果程序改为:

 则结果为:

所以只要注意基础类型和最大结果就行了。 

        

发布了12 篇原创文章 · 获赞 67 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/qq_37429313/article/details/88025030