Forum: Mikrocontroller und Digitale Elektronik Atxmega 128A3 Quadrature decoding


von david A. (davidarmstrong)


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
}

von david A. (davidarmstrong)


Lesenswert?

kann mir niemand helfen? ich weiß,dass die frage banal ist.

von M. N. (Gast)


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?

von Jens (Gast)


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ß

von david A. (davidarmstrong)


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 :)

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.