变量类型混乱

Variable types mess

本文关键字:混乱 类型 变量      更新时间:2023-10-16

为什么在下面的代码中我没有得到正常的结果?

void Motors::setCycleDutyA(int percentage) {
    Serial.println(percentage);
    Serial.println(pwmCycleDutyA);
    float x=percentage/100;
    Serial.print(x);
    pwmCycleDutyA = int(255*x);
    Serial.println(pwmCycleDutyA);
}

当我调用函数时:

Motors::setCycleDutyA(45);

我得到这些结果:

45 255 0.000

45 0 0.000

45 0 0.000

我错过了什么?

此处:

float x=percentage/100;

您正在执行整数除法(因为两个操作数都是整数)。这意味着每次percentage小于100时,结果将是0。这就解释了你得到的结果。

改成:

float x=percentage/static_cast<float>(100);

或者:

float x=percentage/100.f;

问题是float x = percentage / 100,其中percentageint类型。这意味着/的两个参数都是整数,因此执行整数除法。然后,将结果转换为float

你想要这个:

float x = percentage / 100.f;

或者直接将percentage的类型更改为float

对于这种情况,我倾向于避免使用浮点数。像这样控制电机的代码通常运行在一个不直接支持浮点数的小型微控制器上,因此浮点计算通常在软件中模拟,这是缓慢的,并且可以添加相当多的额外代码。

因此,我尝试考虑是否可以在整数数学中完成。查看序列:

float x=percentage/100;
pwmCycleDutyA = int(255*x);

这基本上相当于:

pwbCycleDutyA = percentage * 2.55;

对于许多用途,将其视为percentage * 2.5就足够了,这很容易在整数数学中呈现:

pwbCycleDutyA = (percentage * 5) / 2;

这将我们可以产生的值范围缩小到0。用250代替0…255——但请记住,由于百分比以int开始,我们在任何情况下都只能生成100个离散值,所以这几乎不可能产生太大(如果有的话)差异。

但是,如果您确定乘数确实需要为2.55而不是2.5,您也可以这样做。最明显的方法是重新排列你的等式——不是先除以100再乘以255,而是先乘以255,再除以100:

pwbCycleDutyA = (percentage * 255) / 100;

在重新排列这样的方程时要记住的主要事情是确保不会溢出。假设percentage永远不会超过100,我们是相当安全的——中间结果永远不会超过25500,这很容易适用于有符号的16位int (C允许的最小值)。