mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Frequenzkontrolle


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade dabei mir zu überlegen wie ich am besten eine 
Frequenzkontrolle für 18 verschiedene Eingänge realisiere. Und zwar 
laufen die normalerweise auf 10KHz, jetzt soll überprüft werden ob einer 
der Ausgänge kurzzeitig seine Frequenz ändert.

Mikrocontrollertechnisch ist das wahrscheinlich etwas schwierig soviele 
Eingänge wirklich parallel und dauerhaft zu überwachen.

Hat jemand ne Idee?


Stefan

Autor: unsichtbarer WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Man könnte doch "einfach" die Eingänge mit einer Frequenz >20kHz 
abfragen und dann nachgucken, ob sie sich regelmässig ändern.
Einige AVR besitzen auch PinChange-Interrupt-Funktionen - damit kann man 
die Zeit zwischen Flankenwechseln messen...

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nur so als Idee

Es läuft doch darauf hinaus, lauter parallel laufende Frequenzzähler
zu machen. Bei 10 kHz würde ich das mit einer feststehenden Torzeit
mittels Timer machen. Sagen wir mal: alle 0.1 Sekunden kommt
ein Timerinterrupt.
In der Hauptschleife überwacht der µC 18 Pins, ob er dort einen
Flankenwechsel von 0 auf 1 vorfindet. Wenn ja wird ein, dem
Pin zugehöriger, Zähler erhöht.
Wenn jetzt der Timerinterrupt auftritt, werden die Zähler
ausgewertet. Die muessten bei 0.1 Torzeit alle im Bereich
999 bis 1001 sein. Bereich deshalb, weil die Torzeit ja nicht
exakt mit einem Flankenwechsel am zu überwachenden Pin beginnt.
Wenn ein Zähler jetzt nicht den vorgeschriebenen Wert hat
tritt der Alarmierungsfall ein und die entsprechende Massnahme
wird eingeleitet. Die Zähler alle wieder auf 0 stellen und
der nächste Messzyklus kann beginnen.
Wenn du Pin Change Interrupts zur Verfügung hast, vereinfacht
sich natürlich das Auffinden der Flanken.

So ungefähr, nur so als Idee. Ich hab jetzt nicht geprüft, ob
man da mit dem Timing hinkommt oder nicht. Aus dem Bauch
raus, würde ich aber sagen: könnte klappen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Karl Heinz

mit Torzeit ist einfach eine bestimmte Periodendauer gemeint oder?

Und die Überwachung der 18Pins in der Hauptschleife, wenn man das über 
zyklisches Polling macht, dann kann es aber leicht passieren dass so ein 
kurzers Flankenwechsel einfach untergeht, nicht?

Und an die Pin Change Dinger hab ich auch schon gedacht, aber da hat ein 
Mikrocontroller in der Regel ja nicht gerade viele.


Stefan

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Stefan wrote:
> Hallo Karl Heinz
>
> mit Torzeit ist einfach eine bestimmte Periodendauer gemeint oder?
>

Ja.

> Und die Überwachung der 18Pins in der Hauptschleife, wenn man das über
> zyklisches Polling macht, dann kann es aber leicht passieren dass so ein
> kurzers Flankenwechsel einfach untergeht, nicht?

Gneau das hab ich gemeint, mit 'ich hab das Timing nicht gecheckt.
Bei 10 kHz hast du von einer Flanke zur nächsten eine Zeitdauer
von 0.05ms zur Verfügung. Sollte eigentlich reichen um reihum
18 Pins abzufragen und zu entscheiden ob sich der Zustand geändert
hat.

Die Hauptschleife sieht in etwa so aus (Ich nehm jetzt
mal irgendwelche Ports an)
unsigned char Zustand[18];
unsigned int Counter[18];

....

int main()
{
  unsigned char* Vorher;
  unsigned int* PinCounter;
  unsigned char Pin;
  unsigned char Jetzt;
  unsigend char i;

  ...
  bla, bla, setup, init, etc ...

  while( 1 ) {
    Vorher = &Zustand[0];
    PinCounter = &Counter[0];

    // die ersten 8 Pins
    Pin = 1;
    for( i = 0; i < 8; ++i ) {
      Jetzt = PINA & Pin;
      if( Jetzt != *Vorher && Jetzt != 0 ) {
        (*PinCounter)++;
        *Vorher = Jetzt;
      }
      Vorher++;
      PinCounter++;
      Pin = Pin << 1;
    }

    // Pins 8 bis 15
    Pin = 1;
    for( i = 0; i < 8; ++i ) {
      Jetzt = PINB & Pin;
      if( Jetzt != *Vorher && Jetzt != 0 ) {
        (*PinCounter)++;
        *Vorher = Jetzt;
      }
      Vorher++;
      PinCounter++;
      Pin = Pin << 1;
    }

    // und die letzten beiden
    Pin = 1;
    for( i = 0; i < 2; ++i ) {
      Jetzt = PINC & Pin;
      if( Jetzt != *Vorher && Jetzt != 0 ) {
        (*PinCounter)++;
        *Vorher = Jetzt;
      }
      Vorher++;
      PinCounter++;
      Pin = Pin << 1;
    }
  }
}


Betrachte das jetzt nicht als der Weisheit letzter Schluss,
sondern als 'erste Skizze'. Die Grosse Frage ist: wie lange
dauert ein Durchlauf durch die while Schleife im schlimmsten
Fall.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>jetzt soll überprüft werden ob einer der Ausgänge kurzzeitig seine Frequenz 
ändert.<<

Wie lange ist kurzzeitig ?
Wie groß ist die Frequenzänderung ?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also Zusatz, ich schreib alles in Assambler :) .. trotzdem einstweilen 
Danke, ich werds mir grad mal durchlesen.


Per Assambler und AVR Studio kann man dann auch genau sehen wie lange 
die Durchläufe dauern.


Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Michael

Das kann man immer schlecht sagen, das es sich hier um Vibrationstests 
handelt also könnten und es sich bei der Frequenzänderung quasi mehr um 
einen kurzzeitigen Kontaktverlust handelt, den man herausfinden möchte.

Stefan

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry für den Kaudawelsch da oben, aber ich denke man versteht es 
trotzdem einigermaßen, Editfunktion gibts ja leider keine.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Das kann man immer schlecht sagen, <<

Du weißt, daß es für solche Probleme keine Lösung gibt ?

Autor: H.H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was ist kurzzeitig ? Wenn die Frequenzen gleichzeitig überwacht werden 
müssen,ist vielleicht für jede Frequenz eine eigene Überwachung 
notwendig.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es gibt dafür solange keine Lösung bis jemand eine findet.

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dazu muß man aber zunächst das Problem finden. Wer soll das sein außer 
Dir selbst ?

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei Vibrationstests ist es wohl immer so, dass man leider nie genau 
sagen kann wie und wie, wielange und wie oft sich ein Zustand ändert 
weil es eben einfach Fehler sind zu denen man nicht wirklich einen guten 
Zugang hat, mehr so ne zufällige Geschichte. Wahrscheinlich sollte man 
wirklich jeden der Eingänge über einen PIN Change am Mikrocontroller 
überwachen, ansonsten siehts wohl so aus als würde einem immer zu leicht 
etwas durch die Lappen gehen.

Stefan

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bei einer µC Auswertung ist das Hauptproblem meistens
(so auch hier): je kürzer, desto schwieriger.
Du wirst doch in etwa eine Abschätzung haben, wie lange
die Frequenzaussetzer dauern. Reden wir da von Nanosekunden,
Millisekunden, Stunden, Tage. Irgendeine Untergrenze, die
du detektieren musst wirst du ja haben.
Das andere: Ab welcher Abweichung gilt denn die Frequenz
daneben? Sind 9.999 kHz noch akzeptabel oder ist in diesem
Fall die Frequenz schon daneben.

Wenn du ein Messgerät designen willst, musst du dir erst
mal Gedanken um die Messbereiche und Genauigkeitsanforderungen
machen.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles klar, werd mir darüber mal Gedanken machen. Trotzdem danke an alle 
die hier gepostet haben. ;)

Stefan

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.