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 | }
|