我正在尝试使用 Arduino Due 中的 TC 计时器创建一些 PWM 波。我的问题是我无法使用这种计时器生成准确的频率。
这是我正在尝试做的简单代码:
static void setupTimer(uint32_t freq_desired)
{
uint32_t ul_div;
uint32_t ul_tcclks;
uint32_t ul_sysclk = sysclk_get_cpu_hz();
uint32_t counts;
// Configure PMC
pmc_enable_periph_clk(ID_TC);
// Configure TC for the given frequency and trigger on RC compare.
tc_find_mck_divisor(
(uint32_t)freq_desired, // The desired frequency as a uint32.
ul_sysclk, // Master clock freq in Hz.
&ul_div, // Pointer to register where divisor will be stored.
&ul_tcclks, // Pointer to reg where clock selection number is stored.
ul_sysclk); // Board clock freq in Hz.
tc_init(TC0, CHANNEL, ul_tcclks | TC_CMR_CPCTRG);
// Find the best estimate of counts, then write it to TC register C.
counts = (ul_sysclk/ul_div)/freq_desired;
tc_write_rc(TC0, 0, counts);
// Enable interrupts for this TC, and start the TC.
tc_enable_interrupt(TC0, CHANNEL0, TC_IER_CPCS); // Enable interrupt.
tc_start(TC0,CHANNEL0); // Start the TC.
NVIC_DisableIRQ(TC_IRQn);
NVIC_ClearPendingIRQ(TC_IRQn);
NVIC_SetPriority(TC_IRQn,configMAX_PRIORITIES);
NVIC_EnableIRQ(TC_IRQn);
}
然后在定时器的手柄上,我所做的就是触发一个输出引脚:
ioport_toggle_pin_level(OUT_PIN);
问题是,当我尝试生成一个 1000Hz 的波(当然,为计时器提供 2000Hz)时,它工作正常。但是当我尝试像 3427Hz 时,它只产生 3420Hz 或类似的东西。
你知道如何解决这个问题吗?我尝试添加 round() 来计算“计数”变量值,它有点帮助,但仍然不是非常准确。
提前致谢。