1

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

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

我想念什么?

4

3 回答 3

5

这里:

float x=percentage/100;

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

将其更改为:

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

或者:

float x=percentage/100.f;
于 2013-03-20T14:05:00.887 回答
3

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

你要这个:

float x = percentage / 100.f;

或者只是将类型更改percentagefloat

于 2013-03-20T14:06:04.910 回答
1

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

因此,我会尝试考虑这是否可以用整数数学来完成。看序列:

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 允许的最小值)。

于 2013-03-20T14:27:12.447 回答