Valor aleatorio de ADC en PIC

1

Estoy leyendo los valores de ADC en mi dsPIC33EP512MU810 cuando deslizo mi POT linealizado. Pero, lo que obtengo son valores aleatorios, puedo leer algunos valores de ADC pero no se está actualizando en cada posición en el control deslizante. Además, no entiendo por qué todos los buffers se actualizan con diferentes valores de adc.

Además, los búferes se actualizan de forma aleatoria para, por ejemplo, ADC1BUF1 se actualiza en la 1ª ejecución, luego, ADC1BUFA se actualiza en la siguiente posición en la 2ª ejecución y así sucesivamente. Estoy utilizando un punto de interrupción en la línea "leyendo el valor de ADC" y lo depuro para ver el valor de ADC. A continuación está mi código y también he adjuntado las imágenes de salida.

void initAdc(void);
void Delay_us(unsigned int);
int  i, j;
int ADCValue;

int main(void)
{ 

PLLFBD = 58;/* M = 60*/
CLKDIVbits.PLLPOST = 0;/* N1 = 2*/
CLKDIVbits.PLLPRE = 0;/* N2 = 2*/
OSCTUN = 0;
/* Initiate Clock Switch to Primary Oscillator with PLL (NOSC = 0x3) */
__builtin_write_OSCCONH(0x03);
__builtin_write_OSCCONL(0x01);
while (OSCCONbits.COSC!=0x3);//wait for clockl switch to occur
while (_LOCK==0);//wait for PLL lock at 60MIPS
initAdc();
while(1)
   {
     AD1CON1bits.SAMP = 1;
     Delay_us(10);// Sample for 100 us
    // AD1CHS0bits.CH0SA = ch;  //select analog input channel
     AD1CON1bits.SAMP = 0;   //start the conversion
     while(!AD1CON1bits.DONE);// Wait for the conversion to complete
     //AD1CON1bits.DONE = 0;// Clear conversion done status bit
     ADCValue=ADC1BUF0;// Read the ADC conversion result*/
     Nop();
   } 
}

void initAdc(void)
{

/* Set port configuration */ 
ANSELA = ANSELB = ANSELC = ANSELD = ANSELE = ANSELG = 0x0000;
TRISBbits.TRISB12 = 1; //RB12 as input
ANSELBbits.ANSB12 = 1;// Ensure A7/RB12 is analog
//ANSELEbits.ANSE6 = 1;//AN30/RE6 is analog
/* Initialize and enable ADC module */
AD1CON1 = 0x0004;//bit 10 and bit 2 set to 1
AD1CON2 = 0x0000;
AD1CON3 = 0x000F;
AD1CON4 = 0x0000;
AD1CHS0 = 0x0005;
AD1CHS123 = 0x0000;
AD1CSSH = 0x0000;
AD1CSSL = 0x0000;
AD1CON1bits.ADON = 1;
Delay_us(20);
}
void Delay_us(unsigned int delay)
{
    for (i = 0; i < delay; i++)
    {__asm__ volatile ("repeat #39");
    __asm__ volatile ("nop");
    }
  }

    
pregunta Inquisitive

0 respuestas

Lea otras preguntas en las etiquetas