Hallo zusammen,
ich kämpfe aktuell mit dem PDEC Peripheral am atsamd51 µC. Das zählen
funktioniert so weit sauber, aber "alles" was mit Index zu tun wird
offenbar ignoriert.
Die Signale liegen sauber am µC an. Signal B und I werden per Software
invertiert.
- Es erfolgt leider kein Reset des Counter-Reg, egal wie viele
Umdrehungen der Encoder macht.
- Das STATUS.IDXerr wird nie gesetzt
- Die eigentliche Funktion des Zählens, vorwärts+rückwärts, funktioniert
ohne Probleme
Ich verwende folgenden Code:
1 | /*************************************************************/
|
2 | /********** PDEC initialisieren ******************************/
|
3 | /*************************************************************/
|
4 | void Encoder_init(void)
|
5 | {
|
6 |
|
7 | // PDEC Encoder
|
8 | PORT->Group[0].PMUX[12].bit.PMUXE = 6; // PA24 ==> PDEC/QDI[0]
|
9 | PORT->Group[0].PMUX[12].bit.PMUXO = 6; // PA25 ==> PDEC/QDI[1]
|
10 | PORT->Group[1].PMUX[11].bit.PMUXE = 6; // PB22 ==> PDEC/QDI[2]
|
11 |
|
12 | PORT->Group[0].PINCFG[24].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // PORT PA24 MUX an, Input buffer an
|
13 | PORT->Group[0].PINCFG[25].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // PORT PA25 MUX an, Input buffer an
|
14 | PORT->Group[1].PINCFG[22].reg = PORT_PINCFG_INEN | PORT_PINCFG_PMUXEN; // PORT PB22 MUX an, Input buffer an
|
15 |
|
16 | MCLK->APBCMASK.bit.PDEC_ = 1; // Main-Clock auf PDEC aktivieren
|
17 | GCLK->PCHCTRL[31].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN_GCLK0; // PDEC an GCLK0
|
18 |
|
19 | PDEC->DBGCTRL.bit.DBGRUN = 1;
|
20 | PDEC->CTRLA.bit.SWRST = 1;
|
21 | while(PDEC->SYNCBUSY.bit.SWRST);
|
22 | while(PDEC->CTRLA.bit.SWRST);
|
23 | //PDEC->CTRLA.reg = PDEC_CTRLA_ANGULAR(7) | PDEC_CTRLA_PINEN(7) | PDEC_CTRLA_MODE_QDEC | PDEC_CTRLA_ENABLE | PDEC_CTRLA_PINVEN(6) | PDEC_CTRLA_PEREN | PDEC_CTRLA_CONF_X4;
|
24 | PDEC->CTRLA.reg = PDEC_CTRLA_ANGULAR(7) | PDEC_CTRLA_PINEN(7) | PDEC_CTRLA_MODE_QDEC | PDEC_CTRLA_ENABLE | PDEC_CTRLA_PINVEN1 | PDEC_CTRLA_PINVEN2 | PDEC_CTRLA_PEREN | PDEC_CTRLA_CONF_X4;
|
25 | PDEC->INTENSET.reg = PDEC_INTENSET_MC0;
|
26 | PDEC->CC[0].reg = ENC_MAX_CNT; // 280 lines * 4 * 16 (interpolation)
|
27 | while(PDEC->SYNCBUSY.bit.ENABLE);
|
28 | PDEC->CTRLBSET.reg = PDEC_CTRLBSET_CMD_START;
|
29 | while(PDEC->SYNCBUSY.bit.CTRLB);
|
30 | PDEC->INTFLAG.reg = 0x3f;
|
31 | }
|
Jemand ne Idee an was das liegen kann?
Beste Grüße,
Fabian