Forum: Mikrocontroller und Digitale Elektronik Arduino micro Frequenz Array messen


von Black D. (Gast)


Lesenswert?

Moin zusammen,

ich habe ein Array S[1600] und ein Array [16] diese zähle ich beide mit 
dem ersten code Beispiel durch. Um die durch zulaufen habe ich mit dem 
zweiten code Beispiel ein Interrupt erstellt.
Rein rechnerisch müsste ich bei einer Timer Frequenz von 80kHz geteilt 
durch 1600 Stellen auf 50Hz kommen und 80kHz geteilt durch 16 Stellen 
müssen das 5kHz sein. Wie kann ich das jetzt am besten messen ob das 
auch passt?
1
ISR(TIMER1_COMPA_vect){         //Interrupt
2
m=m+1;
3
if(m>1599)
4
m=0;
5
6
//Dreieckarray hochrechnen
7
n=n+1;
8
if(n>15)
9
n=0;
10
}
1
//Timer1 instalisieren
2
TCCR1A = 0;                     //Register definiert zurücksetzten
3
TCCR1B = 0;                     //zuerst Register definiert zurücksetzen
4
TCNT1 = 0;                      //Zählerwert zurücksetzten
5
6
OCR1A = 199;                    //Timer1 80kHZ einstellen
7
TCCR1B |= (1 << WGM12);         //CTC mode
8
//TCCR1B |= (0 << CS12) | (0 << CS11) | (1 >> CS10); //kein Prescale
9
TCCR1B |= (1 << CS10);          // clk/1 prescale 1024
10
TIMSK1 |= (1 << OCIE1A);        //Aktivieren des Timer-Vergleichs-Interrupt

von Jester (Gast)


Lesenswert?

Black D. schrieb:
> Rein rechnerisch müsste ich bei einer Timer Frequenz von 80kHz geteilt
> durch 1600 Stellen auf 50Hz kommen und 80kHz geteilt durch 16 Stellen
> müssen das 5kHz sein. Wie kann ich das jetzt am besten messen ob das
> auch passt?

Das wird wohl synchron mir deiner "Loop" laufen ...
Wie genau musst Du die 50Hz/5kHz denn wissen?

von Black D. (Gast)


Lesenswert?

Die Stellen nach dem Komma sind relativ egal. Sonst im Bereich von +-5%

von hmm (Gast)


Lesenswert?

1
unsigned long T_index_0 = 0;
2
unsigned long T_index_1599 = 0;
3
4
ISR(TIMER1_COMPA_vect){         //Interrupt
5
6
 if(m == 0){
7
   wenn_das_array_bei_index_0 = micros();
8
 }
9
 m=m+1;
10
11
 if(m>1599){
12
  m=0;
13
  wenn_das_array_bei_index_1599 = micros();
14
  Serial.print(" T = ");
15
  Serial.print(T_index_1599 - T_index_0);
16
  Serial.print(", freq = ");Serial.println( 1 / T_index_1599 - T_index_0);
17
 }
18
//Dreieckarray hochrechnen
19
 n=n+1;
20
 if(n>15)
21
  n=0;
22
}


ungefähr so. Nimmt Zeit bis array index = 0 und bei 1599.

von hmm (Gast)


Lesenswert?

ups die Serialen befehle aus der ISR raus, Setz n flag wenn das array 
durchgelaufen ist und lass es in loop() berechnen ud Serial ausgeben

von Black D. (Gast)


Lesenswert?

Ok danke.

von OMG (Gast)


Lesenswert?

Ja, Serial.print(...) in einer ISR ist äusserst geistreich ...

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.