Problemas con la conversión PIC A / D

6

Estoy intentando leer la señal analógica para una especie de mouse con un controlador pic18f14k50. Aquí el circuito simple: enlace . Tengo que leer la señal analógica del puerto del circuito AN9. La función principal lee desde el puerto y parpadea 30 veces si se alcanza el umbral:

void main(void) 
{
    InitializeSystem();

    #if defined(USB_INTERRUPT)
        USBDeviceAttach();
    #endif

    while(1) {

        if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) continue;

        if (!HIDTxHandleBusy(lastTransmission)) {
            int readed = myReadADC2(); //Here i tried both myReadADC2() or myReadADC1()
            if (readed > 40) { //If read threshold > 40, blink led 30 times
                int i;
                for (i = 0; i < 30; i++) {
                    Delay1KTCYx(0);
                    mLED_1_On();
                    Delay1KTCYx(0);
                    mLED_1_Off();
                }
            }
        lastTransmission = HIDTxPacket(HID_EP, (BYTE*)hid_report_in, 0x03);

        } /* [Ed: added] */
    }//end while
}//end main

Usé dos métodos para leer desde el puerto AN9, myReadADC () que usa el método de API OpenADC ():

int myReadADC(void) 
{
    #define ADC_REF_VDD_VDD_X 0b11110011                      
    OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST & ADC_12_TAD,
            ADC_CH9 & ADC_INT_OFF,
            ADC_REF_VDD_VDD_X & ADC_REF_VDD_VSS,
            0b00000010); // channel 9
    SetChanADC(ADC_CH9);
    ConvertADC();                 // Start conversion
    while (BusyADC());             // Wait for completion
    return ReadADC();           // Read result
}

y myReadADC2 (), que implementa la lectura manual desde el puerto.

int myReadADC2() 
{
    int iRet;
    OSCCON = 0x70;         // Select 16 MHz internal clock
    ANSEL = 0b00000010;  // Set PORT AN9 to analog input
    ANSELH = 0;          // Set other PORTS as Digital I/O
    /* Init ADC */
    ADCON0 = 0b00100101;   // ADC port channel 9 (AN9), Enable ADC
    ADCON1 = 0b00000000;   // Use Internal Voltage Reference (Vdd and Vss)
    ADCON2 = 0b10101011;   // Right justify result, 12 TAD, Select the FRC for 16 MHz
    iRet = 100;


    ADCON0bits.GO = 1;
    while (ADCON0bits.GO);   // Wait conversion done
    iRet = ADRESL;           // Get the 8 bit LSB result
    iRet += (ADRESH << 8); // Get the 2 bit MSB result
    return iRet; 
}

Ambos casos no funcionan, toco (enviando señal analógica) el puerto AN9, pero cuando configuro el umbral alto (~ 50) el led no parpadea, con el umbral bajo (~ 0) parpadea inmediatamente cuando doy energía a la foto. Tal vez estoy usando el puerto equivocado? ¿Estoy pasando AN9 como puerto de lectura? O tal vez el umbral es incorrecto? ¿Cómo puedo encontrar el valor correcto? Gracias

Aquí está el MPLAB C18 Apis enlace .

    
pregunta Emilio

4 respuestas

4

Creo que hay un error en tu myReadADC2 () sub ...

intente devolver iRet; en lugar de devolver iDelay;

    
respondido por el Wonko The Sane
3

El PIC ADC tiene una impedancia de entrada sorprendentemente baja. No estoy seguro de que tocar la entrada funcione bien. La mayoría de las veces, necesitará un amplificador operacional para almacenar la señal en el PIC, a menos que su señal sea naturalmente de baja impedancia.

Lea la hoja de datos cuidadosamente. Sería bueno que las hojas de datos pongan limitaciones conocidas y errores de resolución sean letras grandes en negrita, pero generalmente están ocultas en notas al pie y en tablas de características eléctricas.

    
respondido por el markrages
1

Agregue un conector para ICSP / debugging, y use un PICkit o ICD 3 para depurar su código. Luego puede concentrarse en hacer funcionar el ADC y luego ordenar el código USB.

Encontrará las cosas mucho más fáciles si utiliza el código ADC de Microchip en sus bibliotecas.

    
respondido por el Leon Heller
0

Tu esquema parece indicar que no hay nada conectado al pin 9, que es AN9.

¿Podrías, al menos temporalmente, poner un botón con una resistencia de extracción, idéntica a la que ya tienes en el pin 5, así que sabemos que el pin está siendo alto y bajo?

    
respondido por el davidcary

Lea otras preguntas en las etiquetas