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 并且需要 无浮点数。
你好,我正在尝试通过 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 并且需要 无浮点数。