我正在为一个使用8bit mcu(8051体系结构)的设备开发固件。我正在使用SDCC(小型设备C编译器)。我有一个功能,我用来设置步进电机的速度,我的电路正在驱动。通过将所需值加载到计时器的重新加载寄存器中来设置速度。我有一个可变的,在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;
}

最佳答案

如果我理解正确的话,你想计算这个表达式

MaxInt - 1000000/MotorSpeed

其中,MotorSpeed是0到1200之间的一个数字,表示每秒的脉冲数。
如果编译器支持浮点运算,则必须支持整数除法。你为什么不试试呢。如果速度大于15,则没有问题,但对于0到15范围内的速度,结果为负。这意味着,如果计数器是16位宽的,并且以1兆赫的速率递增,就不可能产生低于16赫兹的脉冲。你有一个额外的预分频器,可以减少增加的频率吗?(我不知道8051)。

关于c - 在8位MCU中用C进行除法的最快方法是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2744925/

10-12 18:21