Hallo Forum,
ich probiere schon seit einigen Stunden rum und lese mich durch diverse
Foren und Beiträge. Leider habe ich noch nichts gefunden, was mein
Problem erklärt.
Ausgangssituation:
Ich möchte an PC9 eine Frequenz messen.
1kHz +- max.
Meine bisherige Init hierzu:
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; // activate int
33
NVIC_Init(&NVIC_InitStructure);
34
}
Interrupt:
1
void EXTI9_5_IRQHandler(void)
2
{
3
// do not enter twice
4
if(EXTI_GetITStatus(EXTI_Line9) != RESET)
5
{
6
// count the interrupts received, reset is done by time period (devtimer.c)
7
u32Interrupts++;
8
9
// clear the EXTI line 9 pending bit
10
EXTI_ClearITPendingBit(EXTI_Line9);
11
}
12
}
Dieser muß natürlich in stm32f10x_it.h als Prototyp bekanntgemacht
werden.
1
void EXTI9_5_IRQHandler(void); // this line for EXTI Line9
"Abgeholt" wird das Ganze von einem zweiten Interrupt, der alle 500ms
den gezählten Wert in u32Interrupts ausliesst und rücksetzt.
1
Frequenz = u32Interrupts * 4; // calc frq
2
u32Interrupts = 0; // reset for next time period
Mein Problem ist jetzt, dass der Interrupt EXTI9_5 etwa 9% zu viel
zählt.
Trotz Entprellung in Hardware (10nF) und "sauberer" Rechteckkurve
(50:50) vom Funktionsgenerator.
Kann mir hier jemand weiterhelfen?
Grüße,
XSiteZ
Hi Georg B,
bist du sicher das die Zeitbasis von deiner
Tor-Frq mit 500ms GENAU stimmt ?
du kannst zum test mal diese Init Funktion benutzen :
(hier für STM32F4 ...musst du event. abändern)
Hallo,
ich habs mittlerweile am Laufen, aber ich habe vermutlich ein
Performace-Problem bei ca 1kHz. Kann das sein?
Die Kurve am Oszi ist ok. Trotzdem bricht die berechnete Frequenz ein.
Ein Überlauf kann es nicht sein. Ist alles uint32_t. Das müßte ja ewig
ausreichen...
Danke für den Tip Uwe. Ich werde dem nachgehen.
So wie es jetzt ist, ist es nicht praktikabel.
Ich melde mich, würde mich aber über Anregungen freuen, da ich bisher
mit STM32 Timern nicht viel am Hut hatte.
Grüße,
XSiteZ
>aber ich habe vermutlich ein>Performace-Problem bei ca 1kHz. Kann das sein?
unwahrscheinlich bei 168MHz CLock :-)
>Ein Überlauf kann es nicht sein. Ist alles uint32_t. Das müßte ja ewig>ausreichen
wenn du alle 500ms den Counter-Wert sicherst und einen Clock von 1kHz
hast, dann dürfte da nur ein Wert von 500 drinnstehen...reicht also
locker
hier mal ein Beispiel für InputCompare
mit TIM3/CH4 an PC9
Hallo Uwe,
danke für das Beispiel,
was ich noch vergesen habe: Ich verwende eine STM32F103VE bei 72MHz.
Leider kennt mein Compilerpaket manche der o.g. Funktionen und/oder
defines nicht. :-(
Ich versuche gerade das umzuschreiben...
Grüße,
XSiteZ
>Leider kennt mein Compilerpaket manche der o.g. Funktionen und/oder>defines nicht. :-(
bei STM auf der Webseite gibt es für fast alle Anwendungen
Beispielquellcode (den habe ich auch benutzt)
bestimmt gibt es auch ein Beispiel für Input-Capture
mit dem STM32F103VE
musst einfach mal danach suchen
vlt geht das schneller als alle Fehler einzeln zu beseitigen
Das Problem ist, das es nicht da tut, was es soll.
In u32Frequency stehen irgendwelche zufälligen Werte.
Ich vermute, dass TIM3 einfah so losläuft, ohne auf irgend ein externes
clock Signal zu warten.
Was mache ich falsch?
Danke für Durchsicht.
Grüße,
XSiteZ
>hat leider nichts passendes
dann hast du nicht lange genug gesucht
mach mal einen download von STSW-STM32054 :
http://www.st.com/web/en/catalog/tools/PF257890
und wenn du da unter : "Project/STM32F10x_StdPeriph_Examples/TIM"
nichts findest...dann schreib nochmal ;-)
>Ich vermute, dass TIM3 einfah so losläuft, ohne auf irgend ein externes>clock Signal zu warten.
das lässt sich per Debugger prüfen
Gruss Uwe
Ich werd nicht.
Ich hab alles fast 1:1 aus dem Beispiel ..Examples\TIM\InputCapture
Natürlich umgeschrieben von PA7 (T3_Ch2) auf PC9 (TIM3_Ch4).
Einzig was ich mehr brauche für diesen Kanal ist ein
und alles was dem Interrupt einfällt ist Chaos.
Er reagiert auf ein Event am Eingang. Soweit ja mal ganz gut, nur
eventuell für 0Hz etwas unpraktisch, aber prinzipiell mal nicht
schlecht.
Nur liefert
1
TIM_GetCapture4(TIM3);
totalen Datenkram zurück.
Ich werd das Ganze jetzt mal sacken lassen und mich kommende Woche
nochmal dransetzen.
So ein Mist grrrrr
Bis dann
XSiteZ
_________________________
nur der Vollständigkeit halber:
Init:
aber vorsicht ...da gibt es eine Division durch null, wenn
u16Capture2 = u16Capture1 !!
-> also u32Frequency nur ausrechnen, wenn u32Measurement!=0
und ist diese Zeile notwendig ?
Hallo Uwe,
ich breche die Versuche mit InputCapture hiermit ab.
In der readme vom Beispiel in der STM32F10x_StdPeriph_Lib_V3.5.0 steht
der kleine Satz
"For Low-density, Medium-density, High-density and Connectivity line
devices, the minimum frequency value to measure is 1100 Hz.
For Low-Density Value line, Medium-Density and High-Density Value line
devices, the minimum frequency value to measure is 366 Hz."
Das Konzept ist damit für meine Anwendung nicht geeignet.
Ich brauche eine Frequenzbestimmung für 0..1kHz. (vgl. meine erste Post)
Dazu würde ich gerne TIM3 (PC.09) als extern getriggerten Counter
betreiben.
Im Prinzip das, was ich in meinem ersten Post bereits am Laufen habe,
nur möchte ich das Zählen der Interrupts vom Timer (TIM3->CNT) erledigen
lassen. Damit hat die CPU nicht (im Worst Case) 1000 Sprünge in der
Sekunde zu und von einem IRQ_Handler, um eine Variable zu ++en.
Performancegründe. Die CPU soll sich auf Wichtigeres konzentrieren...
Danke für deine Unterstützung bis hier her.
Ich denke ich muss mich dann wohl doch durch das Datenblatt wursteln.
Wie immer für Hilfe dankbar.
XSiteZ
ok ist lange her, bin aber via Google hierüber gestolpert.
1KHz mit einem 16Bit counter bei 72MHz messen? Ich vermute mal der
Counter hat schneller die 65535 grenze geknackt als eine Flanke bei
1000Hz festgestellt werden kann.
Also musst Du TIM3 ein Prescaler verpassen, so z.B.:
/* Configures the TIMx Prescaler. */
TIM_PrescalerConfig(TIM3, 2000, TIM_PSCReloadMode_Immediate); // 36KHz
Georg B. schrieb:> Hallo Uwe,>> ich breche die Versuche mit InputCapture hiermit ab.> In der readme vom Beispiel in der STM32F10x_StdPeriph_Lib_V3.5.0 steht> der kleine Satz>> "For Low-density, Medium-density, High-density and Connectivity line> devices, the minimum frequency value to measure is 1100 Hz.> For Low-Density Value line, Medium-Density and High-Density Value line> devices, the minimum frequency value to measure is 366 Hz.">> Das Konzept ist damit für meine Anwendung nicht geeignet.>> Ich brauche eine Frequenzbestimmung für 0..1kHz. (vgl. meine erste Post)>
jaja, den ganzen text lesen! Das gild wenn der chip mit 72MHz rennt und
wenn kein Teiler verwendet wird. In dem Example Code von ST wird nämlich
kein Teiler angwendet und daher die Warnung ;)
/* TIM3 channel 4 pin (PC.09) configuration */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
Das ist glaube ich falsch. GPIO Mode muss auf alternate function
gestellt werden und dann noch entsprechend die selbige im entsprechenden
AFR Register eingestellt werden.
Werner