You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 03:54:05