我在STM32f3发现板上使用定时器8来驱动DAC正弦波生成。这是我的Timer配置:
TIM_TimeBaseInitTypeDef timer;
RCC_APB1PeriphClockCmd( RCC_APB1Periph_TIM6, ENABLE );
TIM_TimeBaseStructInit( &timer );
timer.TIM_CounterMode = TIM_CounterMode_Up;
//Setting prescaler so that timer clock will be only 64000Hz
timer.TIM_Prescaler = 1125;
//Setting period so Timer will give signal of frequency 1000Hz
timer.TIM_Period = 10;
TIM_TimeBaseInit( TIM6, &timer );
//generate event when counter hits TIM_period value
TIM_SelectOutputTrigger(TIM6, TIM_TRGOSource_Update);
/* TIM2 enable counter */
TIM_Cmd(TIM6, ENABLE);
我认为时钟等于72MHz。
当我测量正弦波频率时,它显示90Hz而不是100Hz。当我计算回APB1时钟的时钟频率时,它会等于64.8MHz,这看起来很奇怪。我没有改变有关lcock配置设置的任何内容,一切都是默认的。
系统时钟内核等于72MHz(使用RCC_GetClocksFreq命令检查它)。
任何人都知道这是从哪里来的?
答案 0 :(得分:1)
如果您使用HSI时钟作为源,这就是问题所在。
HSI时钟不准确,至少可以变化+ - 10%。
顺便看看你的评论。
Timer count clock = timer_input_clock / (prescaler_value + 1)
你的案子
72000000 / 1126 = 63943Hz
期限为10,你得到:
tim_overflow_period = tim_clock / (period + 1)
在你的情况下
63943 / 11 = 5813
如果将预分频器设置为1124,将周期设置为9,则会得到更好的结果。
timer_clock = 72000000 / (1124 + 1) = 64000
timer_overflow = 64000 / (9 + 1) = 6400
您的DAC输出信号有64个样本吗? 我相信你会使用DMA。
如果有的话,如果你有外部振荡器,你应该得到100Hz,否则你可能没有。查看有关HSI振荡器校准的应用说明。