您尚未登录。

楼主 # 2025-02-24 08:33:13

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,401
积分: 1365.5

请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

	/*
	 * Find AVCC based on the fact that we know the bandgap voltage.
	 * To avoid excessive rounding we multiply 1024 by 1000 before dividing
	 * with the ADC result and then divide the result by 1000 afterwards.
	 * the final result is the supply voltage in millivolts.
	 */
	supply_voltage = ((BG_VOLTAGE * ((1024000) / bandgap)) / 1000);

例程是将VCC作为参考电压,采集内部1.1V电压的adc值,倒推Vcc电压值。
因为是10位adc,所以满量程是1024,BG_VOLTAG是内部1.1V电压值,是1100. bandgap是测量内部1.1电压得到的adc值。
好奇这里为什么先是1024放大1000倍,最后结果再除1000. 要是说为了避免丢掉四舍五入,但感觉结果还是会舍弃小数位的。
为何不直接这样?

supply_voltage = BG_VOLTAGE * 1024 / bandgap;

离线

#1 2025-02-24 11:52:01

海石生风
会员
所在地: 深圳
注册时间: 2019-07-02
已发帖子: 681
积分: 814
个人网站

Re: 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

他是为了保留括号,两种方法都可以。如同进门迈左脚还是右脚,没啥好讨论的。

离线

楼主 #2 2025-02-25 08:29:18

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,401
积分: 1365.5

Re: 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

海石生风 说:

他是为了保留括号,两种方法都可以。如同进门迈左脚还是右脚,没啥好讨论的。

感谢,不纠结了。

离线

#3 2025-03-05 14:35:17

wheregone
会员
注册时间: 2020-05-05
已发帖子: 21
积分: 11

Re: 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

让我联想到 KEIL C51 常量的大坑

离线

楼主 #4 2025-03-06 08:35:06

Gentlepig
会员
注册时间: 2018-10-24
已发帖子: 1,401
积分: 1365.5

Re: 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

wheregone 说:

让我联想到 KEIL C51 常量的大坑

能细说下吗?虽然不怎么用51,但还是没准以后还会用到。

离线

#5 2025-03-06 09:27:56

why1canhbjack
会员
注册时间: 2023-02-13
已发帖子: 23
积分: 38

Re: 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

注释已经说清楚了啊,为了避免过度的四舍五入,另外先放大再缩小可以减少浮点运算吧,毕竟浮点运算比较耗时

离线

#6 2025-03-06 12:20:49

wheregone
会员
注册时间: 2020-05-05
已发帖子: 21
积分: 11

Re: 请教,avr单片机例程,不明白这个先乘1000再除1000有什么作用。

Gentlepig 说:
wheregone 说:

让我联想到 KEIL C51 常量的大坑

能细说下吗?虽然不怎么用51,但还是没准以后还会用到。


就是常量定义,默认永远都是16位int计算,溢出也不给你报个信,哈哈

离线

页脚

工信部备案:粤ICP备20025096号 Powered by FluxBB

感谢为中文互联网持续输出优质内容的各位老铁们。 QQ: 516333132, 微信(wechat): whycan_cn (哇酷网/挖坑网/填坑网) service@whycan.cn