Atxmega 128A3 Quadrature decoding

OP #3104012
Lesenswert?
• ▲
▼
Hi, ich arbeite mich derzeit in die Welt der 
Mikrocontrollerprogrammierung ein. Zur Verfügung habe ich einen 
ATXMEGA128A3. Mein Ziel ist es mit der Quadratur Decodierung einen von 
hand drehbaren Drehregler auszulesen(also in welche Richtung und wie 
schnell wird gedreht).

Dafür ist dieser Quadratur Decoder ja perfekt geeignet.

Ich habe jetzt das Beispiel von Atmel durchgearbeitet. Jetzt wollte ich 
fragen ob ich das so richtig verstehe.

Ich verstehe das so: QDEC_Total_Setup() wird aufgerufen und da werden 
Parameter wie welcher Port, an welchem Pin mein QDPH0 anliegt, welchen 
Channel ich nehme, welchen Event ich nehme etc. übergeben.

Wofür ist dabei lineCount zuständig?


Danach besteht die Möglichkeit ein Testsignal zu erzeugen.

/* Period of counter ticks are 1/(F_CPU/clk_div) Was macht diese Zeile? 
Die Periodendauer bestimmen, aber was ist dabei clk_div?

Dann bestimmt man die Frequenz wie schnell gedreht wird, rechnet diese 
in RPM um und gibt sie an Port C an einer LED aus?


Schon mal danke für eure Hilfe!!

Hier der Beispielcode:
1
int main( void )
2
{
3
  QDEC_Total_Setup(&PORTD,                    /*PORT_t * qPort*/
4
                   0,                         /*uint8_t qPin*/
5
                   false,                     /*bool invIO*/
6
                   0,                         /*uint8_t qEvMux*/
7
                   EVSYS_CHMUX_PORTD_PIN0_gc, /*EVSYS_CHMUX_t qPinInput*/
8
                   false,                     /*bool useIndex*/
9
                   EVSYS_QDIRM_00_gc,         /*EVSYS_QDIRM_t qIndexState*/
10
                   &TCC0,                     /*TC0_t * qTimer*/
11
                   TC_EVSEL_CH0_gc,           /*TC_EVSEL_t qEventChannel*/
12
                   lineCount);                /*uint8_t lineCount*/
13

14

15
#ifdef GENERATE_TEST_SIGNAL
16
  /* Initialize and start outputting quadrature signal.*/
17
  generate_qdec_signal(&PORTE, lineCount, freq, dir);
18

19
  /* Enable low level interrupt.*/
20
  PMIC.CTRL |= PMIC_LOLVLEN_bm;
21

22
  /* Enable global interrupts.*/
23
  sei();
24
#endif
25
  
26
  /* Display the frequency of rotation on LEDs */
27
  while (1) {
28

29
    if ((TCD0.INTFLAGS & TC0_CCAIF_bm) !=  0) {
30
      /* Period of counter ticks are 1/(F_CPU/clk_div)
31
       * Real tick count is 4 times captured value
32
       * (when used with quadratur signal).
33
       * Real frequency is then (F_CPU/clk_div)/(capture_value * linecount)
34
        * For output in RPM multiply frequency by 60 (60 sec per min).*/
35
      calcFreq = (F_CPU / CLOCK_DIV) /
36
                 ((GetCaptureValue(TCD0) & 0xFFFC) * lineCount );
37
      calcRPM = calcFreq*60;
38
      PORTC.OUT = ~(calcFreq);
39
    }
40
  }
41
}
Gast #3104862
Lesenswert?
• ▲
▼
Welchen Encoder Du auch immer verwendest, die paar Hz Ausgangsfrequenz 
wird wohl jeder per Software erfassen. Die Hardware im ATXmega ist eher 
was für Eingangsfrequenzen im MHz-Bereich, und wo auch sonst keinerlei 
Prellimpulse möglich sind.

Welchen Drehgeber hast Du denn in der Hand?
Gast #3104872
Lesenswert?
• ▲
▼
Wenn du eine Dreghzahl erfassen willst, brauchst du eine Zeitbasis. Das 
passiert wohl mit dem
calcFreq = (F_CPU / CLOCK_DIV) /
                 ((GetCaptureValue(TCD0) & 0xFFFC) * lineCount );

Hier wird bestimmt, wie lange der letzte Puls her ist. Aus der Zeit 
kannst du dann die Drehzahl bestimmen.
Gruß
OP #3105328
Lesenswert?
• ▲
▼
Hi, danke erstmal für eure Hilfe! Ich habe einen EC11 Rotary Encoder. 
Der kann zum drehen und drücken verwendet werden, für mich spielt aber 
erstmal nur drehen eine Rolle.

Ich weiß,dass der Atxmega mehr kann und für schnelleres gedacht ist, 
aber habe mir gedacht es ist leichter erstmal mit einem von Hand 
gedrehten Drehgeber anzufangen :)

Antwort schreiben

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.