STM32 5sec Timer

Gast #2205883
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
Gast #2205908
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
#2206124
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.
Gast #2207267
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
#2207317
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.
Gast #2207333
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.
Gast #2207350
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.
#2207439
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.
Gast #2227735
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren