|
发表于 2007-12-16 14:48:36
|
显示全部楼层
1.8位的单片机主要用途是作为"控制"的(所以叫微控制器),其相对的计算能力比较差.尽管AVR有硬件乘法指令(其它的芯片可能还有除法指令),但其数值计算的能力还是比较差.因此在8位系统中,浮点运算占用资源和时间非常大(因为没有专门处理浮点运算的硬件,需要大量的指令).因此对于需要大量数据处理和计算的系统,可以考虑使用32位的系统.现在32位的系统,如M3的价格同高端的8位或16的已经一样了.
2.在使用AVR设计的系统,如果需要比较多的数据处理,首先应该注意选择FLASH比较大的芯片,同时系统时钟应该适当提高.
============================================
下面简单介绍浮点转定点的问题
说明:这是根据我个人的应用经验采用的方法,供参考.另外,数据处理中需要使用到一些复杂的数学处理,如三角函数,对数,指数运算,还是采用浮点数为好
首先要注意到这一点,对于控制系统的输出或输入数据都是整数,如AD读入的是整数,如果控制PWM输出的话,寄存器中的设置值也是整数.因此最好的方式是采用整数计算(整数也是定点数).
另外,不管是浮点数还是整数,在计算机内部都是以二进制计算为最快捷的.因此,计算和保存应该使用二进制,只有需要显示的时候才需要转换成十进制数,以及其它形式的数.
1.根据系统的实际,确定数据处理过程中小数点后应该保留的有效位数是多少,比如是5位,那么参与运算的数据全部放大,乘上100000.
2.确定计算过程中最大值(乘上100000的值),是否超过系统中整数的表达范围.
如果上2条满足,就适合将浮点转换成整数计算了.
============================================
用个简单例子看具体的处理和设计.
假定一个系统通过测汽车轮子转速来计算距离,一个脉冲表示轮子转一圈,轮子的直径为0.485米.那么理论计算公式是:
S = N * 3.1415926... * 0.485
S 为距离(米)
N 为脉冲个数(肯定是整数)
那么我们就要首先确定计算结果的精度.根据实际情况,距离的精度到达毫米即可.因此计算中的精度为毫米.这样轮子的直径为485.0毫米,4位有效数字.然后将3.1415926变成整数31416,放大10000,5位有效(保证计算精度).
那么S = (N * 31416 * 485) / (10000) 毫米 ====>(2)
接下来看无符号长整型数为4个字节,表示最大数为:4294967295,那么: 4294967295 / 31416 / 485 == 281.88 (N的值)
因此,2式中的N最大不能超过281.
取N为280,为1秒内轮子转动的圈数,则280*3.1416*0.485 = 426.63米/秒 换算成公里/小时为:1535.85公里/小时!!
实际汽车的速度不可能这么快,所以N不会超过280个/每秒.2式可以使用.
这样浮点的计算换成了整数计算.
系统可以每一秒计算一次:
将在一秒内测得的圈数N,按N*31416*485计算(纯整数计算).
计算结果的小数点左移7位显示速度(米/秒),
计算结果除10000(单位毫米)送距离累加.
在我的新书中,有测周期转换成频率,AD测电压的例子,理论上都需要浮点计算(带小数点),但我全部转换成整数计算的.可参考. |
|