2017-03-27 4 views
-1

Ich verwende einen Timer 8 auf STM32f3 Discovery-Board, um DAC Sinus Generation zu fahren. Hier ist meine Timer-Konfiguration:Nicht präzise STM32F303VC Timer Clock

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); 

Ich nehme an, dass Takt 72MHz entspricht.

Wenn ich Sinuswellenfrequenz messe, zeigt es 90Hz anstelle von 100Hz. Wenn ich die Taktfrequenz der APB1-Uhr zurück berechne, kommt es darauf hinaus, dass es 64,8 MHz entspricht, was sehr seltsam erscheint. Ich habe nichts in Bezug auf lcock Konfigurationseinstellungen geändert, alles ist Standard.

Der Systemtaktkern entspricht 72 MHz (wurde mit dem Befehl RCC_GetClocksFreq überprüft).

Hat jemand eine Idee, woher das kommt?

+0

_ "Ich nehme an, dass Takt 72MHz entspricht." _ Sie müssen wirklich _know_ wissen - das können Sie nicht annehmen. Es ist 72 MHz _only_ wenn Sie die PLL als solche konfiguriert haben, und genau _only_ wenn Sie einen exakten externen Oszillator verwenden. Der interne HSE-RC-Oszillator weist eine große Variationsbreite auf und ist nicht temperaturstabil. Wenn Sie den Standard-CMSIS-Startcode verwenden, wird die PLL in system_stm32f3xx.c 'SystemInit()' konfiguriert. Und die _nominal_ Taktfrequenz wird im globalen 'SystemCoreClock' gespeichert. – Clifford

+0

Sie können Ihren Prescaler auch in Bezug auf 'SystemCoreClock' für oder besser noch die ABP1-Taktfrequenz für Portabilität zu verschiedenen Uhrkonfigurationen berechnen. – Clifford

Antwort

1

Wenn Sie HSI-Uhr als Quelle verwenden, ist hier das Problem.

HSI-Uhr ist nicht genau und kann variieren + mindestens - 10%.

Btw Blick auf Ihre Kommentare.

Timer count clock = timer_input_clock/(prescaler_value + 1) 

Ihr Fall

72000000/1126 = 63943Hz 

Mit Zeitraum von 10 erhalten Sie:

tim_overflow_period = tim_clock/(period + 1) 

in Ihrem Fall

63943/11 = 5813 

Wenn Sie Ihre Vorteiler bis 1124 und Zeit eingestellt 9, erhalten Sie bessere Ergebnisse.

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

Haben Sie 64 Samples Ihres DAC-Ausgangssignals? Ich glaube, dass Sie DMA dafür verwenden.

Wenn ja, sollten Sie 100Hz bekommen, wenn Sie einen externen Oszillator haben, sonst nicht. Überprüfen Sie App-Notizen in Bezug auf HSI-Oszillator-Kalibrierung.

+0

Discovery-Boards sollten Kristalle haben – LPs

+0

Richtig. Aber hast du es in Software aktiviert? – tilz0R

+0

Nicht meine Frage;) – LPs