Forum: Mikrocontroller und Digitale Elektronik STM32 5sec Timer


von Max M. (Gast)


Lesenswert?

Hallo,
bin gerade dabei das ich mir einen Timer bastle, welcher nach 5sec einen 
Interrupt auslöst.

  TIM_DeInit(TIM1);
  TIM_TimeBaseStructure.TIM_Period = 50000;
  TIM_TimeBaseStructure.TIM_Prescaler = 24;
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Down;
  TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
  TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

  TIM_ITConfig(TIM1, TIM_IT_Update, ENABLE);


  TIM_Cmd(TIM1, ENABLE);


Jetzt bin ich mir aber nicht sicher, wie das mit dem Prescaler und der 
Period funktioniert.

Also Prescaler mal auf 24 damit ich von 24MHz -> 1MHz komme. Period habe 
ich auf 50000 für 5sec.

Die 50000 sind bestimmt falsch. Nur versteh nicht ganz wie das mit dem 
umrechnen funktioniert.


lg m1011

von Jan (Gast)


Lesenswert?

1 Hz = 1 tick pro sekunde

24 Mhz = 24MHz * 1000 KHz /MHz  * 1000 Hz/KHz

TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;

Lies dir auch noch mal durch was das bedeutet.

Für so große Sachen hat der STM übrigens auch nen Real Time Counter.

mfg Jan

von Matthias K. (matthiask)


Lesenswert?

Solch lange Zeiten realisiert man normaler Weise nicht direkt mit einen 
Timer. So könnte es aber gehen, nicht getestet. (Geht von 
SystemCoreClock = 24MHz aus!)
1
#define TIMER_TAKT 10000  // Timer wird mit 10KHz getaktet
2
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
3
uint16_t PrescalerValue;
4
5
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // TIMER 2 Takt freigeben, Bsp.
6
PrescalerValue = (uint16_t) (SystemCoreClock / TIMER_TAKT) - 1;   // Vorteiler berechnen
7
8
// Timer Grundkonfiguration
9
TIM_TimeBaseStructure.TIM_Period = 50000;  // Timer zählt von 0 .. 50000, = 0,2Hz
10
TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;
11
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
12
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // Zählrichtung (hoch)
13
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); // Timer einstellen

Interrupt dazu für Überlauf konfigurieren.

von Max M. (Gast)


Lesenswert?

thx erst mal.

es ist so, ich bekomme vom ADC einen wert. unterschreitet der eine 
gewisse grenze, dann soll ein timer ausgelöst werden (5sec lang). nach 
weiteren 5sec soll noch ein interrupt kommen.

weiters soll ein anderer timer eine LED steuern.

also im grunde brauche ich zwei timer (2x 5sec & LED).

wie soll ich da jetzt am besten vorgehen? soll ich die 5sec jeweils mit 
dem "Real Time Counter" machen und nur die LED mit einem timer?

lg m1011

von Matthias K. (matthiask)


Lesenswert?

Die STM32 haben genug flexible Timer. Ich würde es aber in konkreten 
Fall anders lösen, indem ich den SysTick-Timer in einem konstanten 
Raster (zB. 10ms) laufen lassen würde. In der dazugehörigen 
Interruptroutine kannst Du dann bei Bedarf andere Variablen hoch- oder 
runterzählen und dann entsprechende Reaktionen ausführen.

von Bernhard (Gast)


Lesenswert?

Max Mustermann schrieb:
> unterschreitet der eine
> gewisse grenze, dann soll ein timer ausgelöst werden (5sec lang).

Diesen Satz kapier ich nicht so ganz. Du bekommst vom ADC einen Wert und 
wenn diese eine bestimmte Grenze unterschreitet dann soll 5 Sekunden 
lang was passieren?

Ich persönlich würd es abhängig machen: Wenn du sowieso einen Timer 
brauchst, dann kannst du ja gleich in der ISR eine Variable für die 5 
Sekunden Zeitspanne hochzählen.

Wenn du eine Art delay Funktion haben möchtest, die einfach nur 5 
Sekunden wartet, dann würde ich das mit dem Systick Timer lösen.

von Max M. (Gast)


Lesenswert?

über ein potentiometer kann ich einen wert einstellen, mit der RTC wird 
dieser jede sekunde abgefragt und mittels ADC umgewandelt.
nehmen wir an unserer grenzwert liegt bei 15, stellt man den poti jetzt 
auf 12 so soll ein timer von 5sec ausgelöst werden. wird der wert 
innerhalb der 5sec nicht wieder auf min. 15 erhöht so beginnt wieder ein 
5sec. timer welcher am ende einen alarm auslöst.

von Matthias K. (matthiask)


Lesenswert?

Max Mustermann schrieb:
> nehmen wir an unserer grenzwert liegt bei 15, stellt man den poti jetzt
> auf 12 so soll ein timer von 5sec ausgelöst werden. wird der wert
> innerhalb der 5sec nicht wieder auf min. 15 erhöht so beginnt wieder ein
> 5sec. timer welcher am ende einen alarm auslöst.

Das zu lösen ist keine wirkliche Herausforderung. Alles leicht über 
SysTick oder einen Universal-Timer zu machen.

von Max M. (Gast)


Lesenswert?

danke erstmals! hatte in letzter zeit viel um die ohren und konnte mich 
deshalb nicht der thematik stm32 wittmen.
wie würde das mit der SysTick aussehen? weiß jetzt nicht ganz wie ich da 
an die sache rangehen soll.

lg m1011

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.