1

我正在为使用 8 位 mcu(8051 架构)的设备开发固件。我正在使用 SDCC(小型设备 C 编译器)。我有一个功能,用于设置我的电路驱动的步进电机的速度。通过将所需值加载到定时器的重载寄存器中来设置速度。我有一个变量 MotorSpeed,它在 0 到 1200 的范围内,表示电机每秒的脉冲数。我将 MotorSpeed 转换为正确的 16 位重载值的函数如下所示。我知道浮点运算非常慢,我想知道是否有更快的方法来做到这一点......

void SetSpeed()
{
    float t = MotorSpeed;
    unsigned int j = 0;
    t = 1/t ;
    t = t / 0.000001;
    j = MaxInt - t;
    TMR3RL = j;      // Set reload register for desired freq
    return;
}
4

3 回答 3

2

如果我理解正确你想计算表达式

MaxInt - 1000000/MotorSpeed

其中 MotorSpeed 是 0 到 1200 之间的数字,表示每秒的脉冲数。

如果您的编译器支持浮点运算,它必须支持整数除法。你为什么不试试呢。如果速度 > 15 没有问题,但对于 0 到 15 范围内的速度,结果是否定的。这意味着,如果计数器为 16 位宽并且以 1MHz 的速率递增,则根本不可能生成频率低于 16Hz 的脉冲。您是否有额外的预分频器可以减少增量频率?(我不知道 8051)。

于 2010-04-30T20:44:09.010 回答
1

经典的方法是使用定点,在除法之前按比例放大,并将其全部作为整数。

j = (MotorSpeed * 65536) / 1200;

这仍然需要实际除法(除以 1200),但至少它是全整数。缩放应该非常快,因为可以使用移位来实现。

于 2010-04-30T13:49:48.727 回答
0

unwind 关于固定点是正确的。

我在使用 32 位数字的 8051 上为 SDCC 编写了一个固定库。只需确定您想要的分数精度,并对值应用适当的偏移即可。

例如,我的定点库使用 2 个字节作为小数空间。

所以每个数字 x 表示为x * 65535。您可以使用正常的有符号长加减法。

对于乘法和除法,您需要调整偏移量。简单的乘法会给出(x * 65535) * (y * 65535). 只需分解并计算出每个数字部分的偏移量并将它们全部加起来。

只需将您的定点数分解为字节或 16 位整数,然后分段处理它们。

查看Embedded.com 上的这篇文章

于 2010-04-30T20:55:13.433 回答