如何在TinyGo中实现ADC区间到编码器数值区间的映射转换
解决方案
问题根因
你编写的代码存在整数除法截断问题:1000/65535 在Golang语法中默认是两个整数执行除法运算,运算结果会直接取整为0,就算后续转换为float64类型也还是0,因此最终计算结果恒为0。
正确实现方式
方案1:浮点运算修正版
调整运算顺序,先把ADC数值转成浮点型,再执行乘除运算,避免整数截断:
var adcValue uint16 = 35000 // 读取到的ADC原始值 encoderValue := uint16(float64(adcValue) * 1000.0 / 65535.0)
方案2:纯整数运算(更适合单片机场景,性能更高)
TinyGo运行在Arduino Uno这类资源有限的单片机上时,浮点运算开销更高,可以采用先乘后除的整数运算实现,注意选择范围更大的数值类型承接中间结果避免溢出:
var adcValue uint16 = 35000 // uint32取值范围远大于65535*1000的计算结果,不会出现溢出问题 encoderValue := uint16((uint32(adcValue) * 1000) / 65535)
边界验证
- ADC输入为0时,输出为0,符合区间要求
- ADC输入为65535时,输出为1000,符合区间要求
- 示例输入35000的计算结果约为534,符合预期
内容的提问来源于stack exchange,提问作者Jadefox10200
相关产品推荐
相关产品推荐

