成为订阅者(免费)

加入29,000名其他订阅者以获得用户销售折扣和 其他免费资源。
:
:
大学教师'担心 - 您的邮件地址完全是 安全的。我保证使用它 只要 to send you MicroZine.

在微控制器中使用固定点数学

您可以使用固定点数学来保存闪存并提高性能。

通常,您需要计算结果作为一个结果'real' number, for 您通常转向浮点库(因为它 简单)。浮点有优势,主要是它很简单 使用,但在场景内存后面正在消耗。除此之外 处理器必须做更多的工作。

令人惊讶的是,你可以在没有损失的情况下进行许多计算 准确性,接受该计算的特定数量 十进制的地方 - 无论如何,在工程中是真的。


警告: 浮点是不准确的 - 你不能代表 数字作为浮点子。由于它是重复数量,因此浮点表示,1/3不能准确表示。 舍入错误蠕变,这就是你的原因 必须使用较大和更大的浮点表示来获得 accurate result.

而不是使用 浮点表示您使用整数变量并选择 将放置固定小数点的地方。

8位nba竞猜的理论操作

让我们说你有一个8位nba竞猜,你想弄清楚 nba竞猜被视为实数的电压。要做,你通常会锻炼 nba竞猜每位所需的浮点乘数:

Bit_Value = 5 / Pow(2,8)= 0.01953125

其中Bit_Value表示nba竞猜的每个位。

因此,如果您的nba竞猜返回值127,则nba竞猜电压将是:

0.01953125 * 127 = 2.48V

对于您将拥有的最大nba竞猜值:

0.01953125 * 255 = 4.98V

笔记: nba竞猜不会返回5V以进行最大电压输入,因为它可以 只有在0-255的步长的返回值,而不是0〜256(256 * 0.1953125 is 5V).

不要尝试通过更改缩放因子来强制值使用 5 /(POW(2,8)-1)由于这引入了更多的错误,即使最大值也是如此 nba竞猜的输出现在将显示5V(它是一种乳脂,所示值 not truly 5V).

问题是如何使用整数变量来存储和操纵此实际操作?

使用整数固定点的示例

一个示例问题

以下是解决问题的问题:

使用微控制器的最小内存资源,请使用带有5V参考的8位nba竞猜 通过串行端口将串行数据传输到PC nba竞猜每秒阅读。

最重要的决定不是使用浮点 - 这节省了 很多记忆资源 - 所有其余的;将数据发送到串行端口 和时间不会占用多少内存(软串行端口(TX) you can find 这里 大约需要90个内存单词,硬件内部串行模块需要更少的内存)。

对于此问题,您将想要计算需要0.0195的乘数nba竞猜电压。 

使用浮点变量的正常数学将导致 the following:

使用Float进行nba竞猜示例的结果

nba竞猜阅读 浮点计算 浮点效果
0 0 * 0.0195 0.0
127 127 * 0.0195 2.4765
255 255 * 0.0195. 4.9725

用固定点数学,你可以快速做到这一点 efficiently 只使用 integer类型变量。

笔记: 浮点变量在微控制器中使用大量资源 微控制器仅适用于整数变量。  要调用浮点复杂库函数。 这类似于旧的386处理器,这是不好的 at floating point 操作,太慢,因此单独的浮点处理器 was added.

如何设置固定点

所以如何做到这一点:首先是每个nba竞猜位的步骤大小是:

5V / 256 = 0.0195(19.5mV)

其中256是nba竞猜 2 ^ 8 POW中的位数的扩展值(2,8)。

接下来,完成大小的整数变量的大小 足以保持最大预期值,但也是最小尺寸 整数你可以逃脱。诸如nba竞猜位数等因素 并且所需的计算精度会影响变量大小。

忽略领先的零,选择乘数,然后按如下方式检查大小:

在此示例中,选择195的乘数:这里's最大输出值:

最大值:255 * 195 = 49725

unsigned int可以存储的最大值是216-1 = 65535.

在这里,您可以使用16位无符号int,因为49725小于65535。

笔记: 对于更大的计算 结果使用更大的整数.g"long" or "long long" and also 请记住,整数是不同的长度,具体取决于编译器 设置! (这就是为什么uint32_t的类型用于指定位 length).

固定点nba竞猜示例的结果

这已经计算了使用固定点的结果,如表所示 below:

nba竞猜阅读 整数计算  Integer result
0 0 * 195 0
127 127 * 195 24765
255 255 * 195 49725

注意上面的每个数字如何作为整数值但结果 匹配上表中的浮点计算。这一切 更改是十进制点的位置,固定四个地方 靠左。这个小数点是你作为程序员的部分 必须记住并考虑进一步的计算。

此代码使用内部编译器例程'16 bit multiply' which is 比浮点乘以更简单,因此您可以保存内存。

显示输出

简单的算法

要显示固定点表示,可以转换 将字符串表示(易于执行)的整数值(易于执行)测试 value for size i.e

如果该值大于1000,则打印出最左侧的其他数字打印零。

打印出点(小数点)。

然后以同样的方式进行:

if >100打印下一个数字打印零。

if >10打印下一个数字其他打印零。

if >1打印下一个数字其他打印零。

替代通用打印方法

另一个,更通用的方式,是使用整数划分(和剩余的) 例程和循环通过直到值为零。示例伪代码(如果持有该值'fixed'):

而(固定){
    if(固定%10)将固定%10存储为字符串中的字符。移动到下一个字符串位置。
    fixed /= 10;
}
反转字符串。

您将使用字符串缓冲区和指针进行上述作业。

更进一步

乘法或分裂何时呢?

当您开始使用固定点时,您可能需要乘以或 划分固定点数。这样做的关键是要知道哪里 小数点将在计算后。

在上面的例子中,选择数字将小数点4位放到左侧
所以我们有nba竞猜的最大输出:

255

和一个缩放因子

195

如果将这些数字标准化为科学符号,则为:

2.55E2

1.95E2

这是有用的,因为它告诉您小数点将在哪里,即在乘法时添加功率给出2.55 * 102 *1.95*102 or 4.9725 * 104 或左边的地方。

因此,对于最大输出编号49725,我们有4 [DP] 9725. [DP]是虚构的 - 你必须记住它的位置。

这似乎是很多工作,但一旦你想到了大小 需要变量和您只使用的预期输出值范围 结果和解释该程序的其余部分。

记住,你不'用这种方法丢失准确性,你节省了很多 闪存(可能约1k字或更多)。除此之外 执行速度将大大提高。

使用10位nba竞猜的示例

作为一个快速举例,如果您要使用标准的10bit nba竞猜 PIC和ATMEGA芯片然后按照以下计算:

每位电压值:

5V / 1024 = 0.0048828125(4.882mV)

比例因子现在变为488。

注意:选择所需精度的数字数量例如:你 可以选择比例因子4882 - 但请记住它改变了 小数点位置。

最大值:1023.0 * 488 = 499224

现在,您可以看到这个数字对于16位整数来说太大,因此您可以选择很长时间才能保持该号码。

小数点位置为1.023E3 * 4.882E2,因此添加功率给出 e5 =左边的5个地方。您可以看到自4.99224以来这是真的 是5V的一位值。这里的准确性是小数点。

提高准确性

通过增加缩放值中的数字数(电压值 每位)到4882您将获得以下最大输出:

1023 * 4882 = 4994286

添加一个4882的比特值给出:4994286 + 4882 = 4999168

因此,上面的准确到3位小数位,小数点现在位于左边的6位数。 最终需要准确性取决于输出所需的准确性。

新的! Comments

让你说到你刚刚阅读的东西!留下下面的框中的评论。



隐私政策 | 接触 | 关于我

网站地图 | 使用条款




访问我们的Facebook页面:

   点击这里



最近的文章

  1. 如何使用ADS1115

    使用ADS1115精度16位nba竞猜进行教程进行低功耗。

    阅读更多

  2. arduino.模拟输出...易模拟输出生成

    arduino.模拟输出:如何创建最精确的PWM模拟输出以及如何创建模拟PWM正弦波。

    阅读更多

  3. 数号和等效的快速宏。加快代码!

    了解DigitalWrite()的工作原理......现在使用17倍宏宏!

    阅读更多

  4. TCS230颜色传感芯片:如何运作以及如何使用它。

    如何使用TCS230(/ TCS3200)彩色检测器芯片并轻松将其添加到您的任何项目中。

    阅读更多

  5. 如何使用ADXL345进行运动感测等。

    使用ADXL345 Acellerometer,您可以检测到16G!您还可以了解如何使用它来点击检测等。

    阅读更多

  6. HMC5883L 3轴数字MAGENTOMTER如何运作

    HMC5883L - 如何制作数字罗盘,了解HMC5883L和QMC5883L之间的差异以及它们是否兼容。

    阅读更多



读者 Comments

"I wanted to thank
你这么好
对于所有信息
你已经提供了
你的网站's

高超极好的."

- 逃亡Potthath.

"This site really is
最好的和我最喜欢的。
我发现这里有很多很有用
项目和提示。"

- 米兰

Bursach.<at>gmail.com<

"Awesome site,
非常,非常容易和好
导航!"


-
镭_tr.<at>
wolf359.cjb.net.


学习微控制器

"Interested in
微控制器?"

注册
免费7天指南:

自由 GUIDE : CLICK HERE


"I am a newbie to PIC
我想说
 how great your
网站一直在为我。"


- 戴夫

de_scott.<at>bellsouth.net

"Your site is a great
和完美的工作。
恭喜。"


- SURESH.

IntegratedInfosys.<at>
Yahoo.com.

"I couldn't find the correct
要定义的词语
你的网页。

非常有用,揭开,
诚实明确。

非常感谢
你的时间和作品。
问候。"


- Anon.

回到顶部