C 嵌入式将 float 转换为 int

C embedded convert float to int

你好,我正在尝试通过 arduino 上的中断来实现一个简单的 5hz 引导。我想计算在我必须切换 LED 之前必须发生多少次定时器溢出。但是由于某些我不明白的原因,我无法正确计算该值。 这是我的代码:

#define OF_FREQUENCY F_CPU / 256.0
#define SECONDS_PER_OF 1 / OF_FREQUENCY
#define F_LEDS 5 
#define LED_CYCLE_TIME (1 / F_LEDS) / 2
#define OVERFLOWS_PER_CYCLE (unsigned int)(LED_CYCLE_TIME / SECONDS_PER_OF)

OVERFLOW_PER_CYCLE 总是计算为 0,但它应该是 6250,因为我的 F_CPU 是 16E6。 我想在最后有一个 unsigned int。

LED_CYCLE_TIME 为零,因为您不使用浮点除法((1 / F_LEDS) / 2(1 / 5) / 2,但 1 / 5 == 0,所以是 0)。

只需使用双打:#define LED_CYCLE_TIME (0.5 / F_LEDS)

并且您还需要在定义周围添加一些额外的括号,因为目前 OVERFLOWS_PER_CYCLE 被定义为 (unsigned int)((1 / F_LEDS) / 2 / 1 / F_CPU / 256.0),它从左到右而不是按正确的顺序进行除法。

因此您的更正代码:

#define OF_FREQUENCY (F_CPU / 256.0)
#define SECONDS_PER_OF (1 / OF_FREQUENCY)
#define F_LEDS 5
#define LED_CYCLE_TIME (0.5 / F_LEDS)
#define OVERFLOWS_PER_CYCLE (unsigned int)(LED_CYCLE_TIME / SECONDS_PER_OF)

算法可以简单得多,并且不需要浮点数就可以执行。

认为 LED_CYCLE_TIME 是:

1 / (2 * F_LEDS)

并且您将其除以 SECONDS_PER_OF。但这与 乘以 SECONDS_PER_OF 倒数 相同,并且您已经将其计算为 OF_FREQUENCY。所以现在你有:

1 / (2 * F_LEDS) * OF_FREQUENCY

等同于:

OF_FREQUENCY / (2 * F_LEDS)

所以你最终得到的代码是:

#define OF_FREQUENCY (F_CPU / 256)
#define F_LEDS 5
#define OVERFLOWS_PER_CYCLE (OF_FREQUENCY / (2 * F_LEDS))

或更好:

#define LED_PRESCALER 256
#define F_LEDS 5
#define OVERFLOWS_PER_CYCLE (F_CPU / (LED_PRESCALER * 2 * F_LEDS))

给出的 F_CPU == 16000000 是 6250 并且需要 无浮点数