打印
[技术问答]

新人求各位大神解惑

[复制链接]
492|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
陶文韬|  楼主 | 2018-10-24 16:58 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Rtemp = 19246500/Rtemp-4700;                //4095/Rtemp*4700-4700;(数据无变化,不清楚问题)
再调试的时候出现的问题,用前面的代码能够正常的获取到数据,但是用注释掉的代码值是不会变化的;
Rtemp是ADC的值;
沙发
tianxj01| | 2018-10-24 17:09 | 只看该作者
运算时候,必须注意参与运算的数据的有效位,这个是初学的很容易犯的一个错误。
后面一个公式,各有效位都是4096以内,编译器调用的应该就是16位运算,这里就直接产生了大量的丢位、溢出等的问题。所以,你要获得理想结果,过程的数据精度,是你必须注意的。这里,假如Retmp是一个2048---4095之间的一个结果,那么后面这个公式运行的结果都=0。而2047---1024的话,结果都等于1。这很明显不是你需要的结果吧?
想要后面一个算法达到希望的精度,你必须定义数据为浮点,才行。

使用特权

评论回复
板凳
陶文韬|  楼主 | 2018-10-24 17:19 | 只看该作者
tianxj01 发表于 2018-10-24 17:09
运算时候,必须注意参与运算的数据的有效位,这个是初学的很容易犯的一个错误。
后面一个公式,各有效位都 ...

多谢大佬,懂你意思了,就是数是几位就调用几位的运算,不是定义变量的类型来决定几位运算。
新塘003不是不能使用浮点运算嘛,所以我这边都是扩大了倍数

使用特权

评论回复
地板
tianxj01| | 2018-10-24 17:37 | 只看该作者
本帖最后由 tianxj01 于 2018-10-24 17:51 编辑
陶文韬 发表于 2018-10-24 17:19
多谢大佬,懂你意思了,就是数是几位就调用几位的运算,不是定义变量的类型来决定几位运算。
新塘003不是 ...


可以用浮点运算,这个和用什么芯片没什么关系,有关系的是某些芯片支持多位浮点运算(硬件),而大多数通用8位机是不可能支持硬件浮点运算的。
用8位机做浮点运算,编译器会调用浮点运算子程序,根据单片机运算速度强弱,运算时间差异非常大,反正8位单片机做浮点运算速度都是比较慢的就是了。
因此,一般来说,我们尽量避免让程序执行浮点运算,尤其是那些对速度有要求的过程。对于期望的精度,我们可以有很多办法,比如尽量采用定点数,除法因子放置最后等等。
比如,我们要获取100/99的除非结果,很明显,如果用整数运算,结果只能是1,这里我们可以把1000放大到结果需要的精度,比如结果是1%精度,那么我们只需要把100*128,然后做除法,然后,结果的后面7位,就是小数点部分,而8位以后就是整数部分。
100*128=12800=3200H/63H=81H=10000001,切位后,整数1,小数点后面*100/128=0.01(四舍五入)。

使用特权

评论回复
5
陶文韬|  楼主 | 2018-10-24 17:49 | 只看该作者
tianxj01 发表于 2018-10-24 17:37
可以用浮点运算,这个和用什么芯片没什么关系,有关系的是某些芯片支持多位浮点运算(硬件),而大多数通 ...

多谢大佬解惑

使用特权

评论回复
6
antusheng| | 2018-10-25 10:50 | 只看该作者
加上小括号试试。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

12

帖子

1

粉丝