首页 > 解决方案 > C嵌入式将float转换为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 。

标签: carduinoembedded

解决方案


LED_CYCLE_TIME为零,因为您不使用浮点除法((1 / F_LEDS) / 2is (1 / 5) / 2, but 1 / 5 == 0, so it's 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)


推荐阅读