ATSAM D51 Position_decoder

1 post / 0 new
Author
Message
#1
  • 1
  • 2
  • 3
  • 4
  • 5
Total votes: 0

223/5000

Hi,
I set up the registers and the read encoder works. However, I am interested in how to set up the RPM reading described in 53.6.2.6.3 Speed Measurement "Datasheet DS60001507E-page 1953".
Can anyone help me.
greetings,
Matjaž

 

 

// Plošča: Adafruit Grand Central M4 (SAMD51)   Position_decoder03
// Dela !

int  value_now;
int  status_reg;

void setup() {
  delay(3000);
  Serial.begin(115200);
  Serial.println("Start");
                                                                                                 // Nastavi clock GCLK7 48 MHz
  GCLK->GENCTRL[7].reg = GCLK_GENCTRL_DIV(1) | 
                         GCLK_GENCTRL_IDC | 
                         GCLK_GENCTRL_GENEN |
                         GCLK_GENCTRL_SRC_DFLL;  
                                           
  while (GCLK->SYNCBUSY.bit.GENCTRL7);                                                           // Wait for synchronization
  
                                                                                                 // Enable perhipheral channel PDEC,  Connect generic clock GCLK7 to PDEC,  stran 169 
  GCLK->PCHCTRL[31].reg = GCLK_PCHCTRL_CHEN | GCLK_PCHCTRL_GEN_GCLK7;                             // Even Parno    Odd Neparno     
  
                                                                                                  
  //PORT->Group[PORTC].PINCFG[16].bit.PMUXEN = 1;              // PDEC0 PC16 QDI(0) D16 A           // Poveže pine na ustrezne PDEC signale Alternativna funkcija G (str. 34, str. 909)
  //PORT->Group[PORTC].PINCFG[17].bit.PMUXEN = 1;              // PDEC1 PC17 QDI(1) D17 B
  //PORT->Group[PORTC].PINCFG[18].bit.PMUXEN = 1;              // PDEC2 PC18 QDI(2) D18 Z

  PORT->Group[g_APinDescription[0].ulPort].PINCFG[g_APinDescription[0].ulPin].bit.PMUXEN = 1;   //Z   PB25
  PORT->Group[g_APinDescription[1].ulPort].PINCFG[g_APinDescription[1].ulPin].bit.PMUXEN = 1;   //B   PB24
  PORT->Group[g_APinDescription[11].ulPort].PINCFG[g_APinDescription[11].ulPin].bit.PMUXEN = 1; //A   PB23
   
                                                                                                   
                                                                                                  
  //PORT->Group[PORTC].PMUX[16>>1].reg |= PORT_PMUX_PMUXE(6);  // PDEC0  PC16 QDI(0) D16 A           // Even Parno    Odd Neparno
  //PORT->Group[PORTC].PMUX[17>>1].reg |= PORT_PMUX_PMUXO(6);  // PDEC1  PC17 QDI(1) D17 B
  //PORT->Group[PORTC].PMUX[18>>1].reg |= PORT_PMUX_PMUXE(6);  // PDEC2  PC18 QDI(2) D18 Z

  PORT->Group[g_APinDescription[0].ulPort].PMUX[g_APinDescription[0].ulPin >> 1].reg |= PORT_PMUX_PMUXO(6);
  PORT->Group[g_APinDescription[1].ulPort].PMUX[g_APinDescription[1].ulPin >> 1].reg |= PORT_PMUX_PMUXE(6);
  PORT->Group[g_APinDescription[11].ulPort].PMUX[g_APinDescription[11].ulPin >> 1].reg |= PORT_PMUX_PMUXO(6);
  
  

  MCLK->APBCMASK.reg |= MCLK_APBCMASK_PDEC;                                                           // Stran 192 Omogoči clock in vpisovanje v PDEC registre
  delay(100);
  
                                                                                                       // Določi Mode QDEC, Conf X4 in 16-bitni Angular
                                                                                                       // PDEC->CTRLA.reg = PDEC_CTRLA_MODE_QDEC | PDEC_CTRLA_CONF_X4 | PDEC_CTRLA_ANGULAR(7) ;
       
  PDEC->CTRLA.bit.PINEN0 = 1;  // Omogoči Pin0 A
  PDEC->CTRLA.bit.PINEN1 = 1;  // Omogoči Pin1 B
  PDEC->CTRLA.bit.PINEN2 = 1;  // Omogoči Pin2 Z

  REG_PDEC_CC0=0x1CF;                                                                                   //do koliko steje enkoder stevec 116 pulzov v x4 mode je 464
   

  PDEC->CTRLA.reg = 0x77C102;                                                                            // Zamenjal PDEC->CTRLA.bit.ENABLE = 1;  // Omogoči PDEC                                                                 

  REG_PDEC_CTRLBSET|=0x80;
  while (PDEC->SYNCBUSY.bit.CTRLB); 
    
  PDEC->CTRLBSET.reg = PDEC_CTRLBSET_CMD_START;                                                            //  Start branja enkoderja
  
  Serial.println("Konec Setup");                   
}

void loop() {
    
       PDEC->CTRLBSET.reg = PDEC_CTRLBSET_CMD_READSYNC;

       value_now = PDEC->COUNT.reg;  
       status_reg = PDEC->STATUS.reg;  
  
  Serial.print("ROTATION: ");
  Serial.print(value_now >> 9,DEC);  
  Serial.print(", ANGLE: ");
  Serial.print(PDEC->COUNT.reg);
  Serial.print(", SMER: ");

  if((status_reg&0x80)>0)
    {
      Serial.print("CCW");
    }
  else
    {
      Serial.print("CW");
    }
  Serial.print(", STATUS: ");
  Serial.println(status_reg,HEX);
  delay(100);
  }

 

 

 

Last Edited: Tue. Aug 11, 2020 - 02:37 PM