2017-03-27 6 views
-1

私は、DAC正弦波生成を駆動するためにSTM32f3ディスカバリボードにタイマ8を使用しています。ここに私のタイマーの設定があります:非正確なSTM32F303VCタイマクロック

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と仮定します。

正弦波の周波数を測定すると、100Hzではなく90Hzと表示されます。私はAPB1クロックのクロック周波数を計算すると、それは非常に奇妙に見える64.8MHzに等しいということになる。私はlcockの設定を変更することはありませんでした。デフォルトはすべてです。

システムクロックコアは72MHzです(RCC_GetClocksFreqコマンドを使用して確認してください)。

これはどこから来たのですか?

+0

_ "私はクロックが72MHzに等しいと仮定しています。" _あなたは本当にそれを前提にする必要があります。 PLLをこのように設定した場合は72MHz _only_、正確な外部発振器を使用する場合は_only_となります。内部のHSE RC発振器は幅広い変動を持ち、温度安定性はありません。標準のCMSISスタートアップコードを使用する場合、PLLはsystem_stm32f3xx.c 'SystemInit()'で設定されます。 _nominal_クロック周波数はグローバル 'SystemCoreClock'に格納されます。 – Clifford

+0

'SystemCoreClock'の点でプリスケーラを計算する方が良いかもしれませんが、ABP1クロック周波数は異なるクロック設定への移植性の点でより良いでしょう。 – Clifford

答えて

1

ソースとしてHSIクロックを使用している場合、ここに問題があります。

HSIクロックは正確ではなく、少なくとも±10%変化する可能性があります。

Btwあなたのコメントを見てください。あなたのケースで

tim_overflow_period = tim_clock/(period + 1) 

63943/11 = 5813 

をあなたは1124年にあなたのプリスケーラを設定し、までの期間場合:あなたが得る10の期間で

Timer count clock = timer_input_clock/(prescaler_value + 1) 

あなたの場合

72000000/1126 = 63943Hz 

9、あなたはより良い結果を得るでしょう。

timer_clock = 72000000/(1124 + 1) = 64000 
timer_overflow = 64000/(9 + 1) = 6400 

DAC出力信号は64サンプルありますか? 私はあなたがそれのためにDMAを使うと信じています。

もしそうなら、外部発振器があれば100Hzを得なければなりません。 HSIオシレータのキャリブレーションに関するアプリケーションノートを確認してください。

+0

ディスカバリーボードには結晶が入っているはずです – LPs

+0

正しいです。しかし、それをソフトウェアで有効にしましたか? – tilz0R

+0

質問しない;) – LPs

関連する問題