stm32 timer-synchronisation

Gast #4857577
Lesenswert?

Ich habe 3 Timer tim2,3,4 die synchron laufen sollen

gestartet wird mit:
1
          TIM_Cmd(TIM2, ENABLE);
2
          TIM_Cmd(TIM3, ENABLE);
3
          TIM_Cmd(TIM4, ENABLE);

gemessen wird mit
1
void TIM2_IRQHandler()
2
{
3
  if(sw_store_ms1u){
4
    store_ms_u=timer_timeout_up_ms;
5
    sw_store_ms1u=0;
6
  }
7

8
  period= speedmult*255/speeddiv;
9
  pulse_vh= speedmult*sinetable[step]/speeddiv;
10
  pulse_vl= speedmult*sinetable[step+24]/speeddiv;
11
  pulse_uh= speedmult*sinetable[step+8]/speeddiv;
12
  pulse_ul= speedmult*sinetable[step+24+8]/speeddiv;
13
  pulse_wh= speedmult*sinetable[step+16]/speeddiv;
14
  pulse_wl= speedmult*sinetable[step+24+16]/speeddiv;
15

16
     TIM2->ARR = period;
17
     TIM2->CCR1 = pulse_vh;
18
     TIM2->CCR2 = pulse_vl;
19

20

21
  step++;
22
  if(step>(maxstep)){
23
    step=0;
24
    speed_ctrl++;
25
  }

messung per ir ausgelöst:
1
      case (198)://Synchronizität prüfen
2
    sw_store_ms1u=1;
3
    sw_store_ms1v=1;
4
    sw_store_ms1w=1;
5
      sw_store_ms2=1;
6
            break;



angezeigt:
1
          if(!sw_store_ms1w && sw_store_ms2){
2
             sw_store_ms2=0;
3
             lg(3,1);
4
             li(store_ms_u);lw("/");
5
             li(store_ms_v);lw("/");
6
             li(store_ms_w);lw("/");
7
           }
angezeigt werden für u,v,w immer identische Werte, dass heißt jeweils 
die gleiche ms.

Reicht die Genaigkeit der Messung aus und sind die timer für einen fu 
somit ohne weitere Maßnahmen ausreichend synchron?
Gast #4857581
Lesenswert?

grundschüler schrieb:
> Ich habe 3 Timer tim2,3,4 die synchron laufen sollen

Das ist in sich unlogisch.

Entweder die 3 Timer sind alle exakt gleich programmiert, dann laufen 
sie auch synchron (und du würdest nur einen brauchen, das die anderen 
redundant sind), oder sie sind unterschiedlich programmiert, dann laufen 
sie schon nach kurzer Zeit nicht mehr synchron.

Also nimm einen einzigen Timer und überdenke dein Konzept.

W.S.
Gast #4857858
Lesenswert?

W.S. schrieb:
> grundschüler schrieb:
>> Ich habe 3 Timer tim2,3,4 die synchron laufen sollen
>
> Das ist in sich unlogisch.
>
> Entweder die 3 Timer sind alle exakt gleich programmiert, dann laufen
> sie auch synchron (und du würdest nur einen brauchen, das die anderen
> redundant sind), oder sie sind unterschiedlich programmiert, dann laufen
> sie schon nach kurzer Zeit nicht mehr synchron.
>
> Also nimm einen einzigen Timer und überdenke dein Konzept.
>
> W.S.

habe den systick auf 10us reduziert und sehe jetzt teilweise um 1 
abweichende Werte. Die 3 timer laufen aber anscheinend synchron. eine 
Abweichung könnte dann entstehen, wenn die ISRs, die ja nicht paralell 
sondern hintereinander laufen, zu einer Verschiebung führen. Dafür ist 
die Dauer der irq s aber offensichtlich zu klein.


Eigentlich müsste es eine Verschiebung geben denn
         TIM_Cmd(TIM2, ENABLE);
          TIM_Cmd(TIM3, ENABLE);
dauert länger als ein Takt der PWM. D.h. die TIMs müssen vor dem 
Prescaler zwingend unsynchron sein und per Master/slave gestartet 
werden?


3 Timer * 2 Channel wegen 6 Halbbrücken. Ist programmtechnisch für mich 
einfach und ich bekomme kein Geld zurück wenn ich die Timer nicht 
benutze.
(Firma: TU Darmstadt) #4857993
Lesenswert?

Zu den verschiedenen STM32 gibt es Application Notes zur Verschaltung 
der Peripherie untereinander, z.B. AN4651 für den F3. Dort schaust Du 
Dir das Unterkapitel "From TIM to TIM" (z.b. Kap 3.15 für den F3) an. 
Dort siehst DU, welcher Timer welchen Timer starten kann. Für den F3 
kannst Du z.B. F2/3/4 mit TIM1 /15/19 starten. Jetzt musst Du nur noch 
das entsprechende Referenzmanual lesen und das Timer Master/Slave 
Wechselspiel implementieren :-)

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