我在写一个AVR32程序的头文件中有以下代码:
#define PULSE_FREQ 150
#define TC_FREQ (60000000 / 8)
#define PULSE_PER (1 / PULSE_FREQ)
#define TC_PER (1 / TC_FREQ)
#define TTC ((PULSE_PER / TC_PER) - 1)
目标是能够给出频率并计算由此公式给出的常量计时器计数值:
Target Count = ((1 / Target Frequency) / (1 / Timer Frequency)) - 1
例如,对于150Hz的定时器频率,需要计时器计数值49999。手动输入定时器的值时,它可以工作并提供150Hz的频率。但是,使用上面的代码时,我的频率为57Hz。
我也收到关于除零的警告,常数中的数字是否可以这么小以至于它们被切断为零?
在运行时而不是使用#define
宏进行此操作会更好吗?
答案 0 :(得分:1)
整数除法可能在某个时刻返回小于1的数字,并且它被截断为0。
尝试通过使其中一个常量为double来强制进行浮点除法:
// The .0 should "infect" the other numbers
#define PULSE_FREQ 150.0
#define TC_FREQ (60000000 / 8)
#define PULSE_PER (1 / PULSE_FREQ)
#define TC_PER (1 / TC_FREQ)
#define TTC ((PULSE_PER / TC_PER) - 1)