Domanda:
Problemi con la conversione PIC A / D
Emilio
2010-12-13 21:44:22 UTC
view on stackexchange narkive permalink

Sto cercando di leggere il segnale analogico per una sorta di mouse con un controller pic18f14k50. Qui il semplice circuito: http://dl.dropbox.com/u/14663091/schematiconew.pdf. Devo leggere il segnale analogico dalla porta del circuito AN9. La funzione principale legge dalla porta e lampeggia 30 volte se viene raggiunta la soglia:

  void main (void) {InitializeSystem (); #if definito (USB_INTERRUPT) USBDeviceAttach (); #endif while (1) {if ((USBDeviceState < CONFIGURED_STATE) || (USBSuspendControl == 1)) continue; if (! HIDTxHandleBusy (lastTransmission)) {int letto = myReadADC2 (); // Qui ho provato sia myReadADC2 () che 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  

Ho usato due metodi per leggere dalla porta AN9, myReadADC () che usa OpenADC () metodo API:

  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); // canale 9 SetChanADC (ADC_CH9); ConvertADC (); // Avvia la conversione mentre (BusyADC ()); // Attendi il completamento return ReadADC (); // Leggi risultato}  

e myReadADC2 (), che implementa la lettura manuale dalla porta.

  int myReadADC2 () {int iRet; OSCCON = 0x70; // Seleziona il clock interno a 16 MHz ANSEL = 0b00000010; // Imposta PORT AN9 sull'ingresso analogico
ANSELH = 0; // Imposta altre PORTE come I / O digitali / * Init ADC * / ADCON0 = 0b00100101; // ADC port channel 9 (AN9), Abilita ADC ADCON1 = 0b00000000; // Usa riferimento tensione interno (Vdd e Vss) ADCON2 = 0b10101011; // Giustifica il risultato a destra, 12 TAD, Seleziona FRC per 16 MHz iRet = 100; ADCON0bits.GO = 1; while (ADCON0bits.GO); // Attendi la conversione eseguita iRet = ADRESL; // Ottieni il risultato LSB a 8 bit iRet + = (ADRESH << 8); // Ottieni il risultato MSB a 2 bit return iRet; }  

Entrambi i casi non funzionano, tocco (inviando segnale analogico) la porta AN9 ma quando imposto soglia alta (~ 50) il led non lampeggia, con soglia bassa (~ 0 ) lampeggia immediatamente quando fornisco alimentazione al PIC. Forse sto usando una porta sbagliata? Sto effettivamente passando AN9 come porta di lettura? O forse la soglia è sbagliata? Come posso trovare il giusto valore? Grazie

Qui l'API di MPLAB C18 http://dl.dropbox.com/u/14663091/API%20microchip%20C18.pdf.

Non riesco ad accedere alla casella personale dove mi trovo in questo momento, ma so che una cosa che puzzolente mi ha incasinato era assicurarmi di usare un pullup o un pulldown ... l'hai controllato? (Potrebbe non essere affatto il tuo codice effettivo a causare il problema, ma questa è solo una speculazione)
Sei mai riuscito a risolverlo?
E ora il collegamento è morto. Questo è il motivo per cui non utilizziamo Dropbox.
Quattro risposte:
Wonko The Sane
2010-12-14 01:51:31 UTC
view on stackexchange narkive permalink

Penso che ci sia un bug nel tuo sub myReadADC2 () ...

prova return iRet; invece di restituire iDelay;

Spiacenti, il codice reale è corretto, era solo un errore di battitura.
markrages
2010-12-14 04:00:02 UTC
view on stackexchange narkive permalink

Il PIC ADC ha un'impedenza di ingresso sorprendentemente bassa. Non sono sicuro che toccare l'input funzionerà bene. La maggior parte delle volte, avrai bisogno di un amplificatore operazionale per bufferizzare il segnale nel PIC, a meno che il tuo segnale non sia naturalmente a bassa impedenza.

Leggi attentamente la scheda tecnica. Sarebbe bello se i fogli dati mettessero limitazioni note e trucchi fossero grandi caratteri in grassetto, ma di solito sono nascosti nelle note a piè di pagina e nelle tabelle delle caratteristiche elettriche.

Questa è stata la mia esperienza t0o. Particolarmente vero per molti dei mux analogici incorporati nei PIC.
Leon Heller
2011-01-16 06:29:59 UTC
view on stackexchange narkive permalink

Aggiungi un connettore per ICSP / debug e usa un PICkit o ICD 3 per il debug del tuo codice. Puoi quindi concentrarti sul funzionamento dell'ADC e quindi risolvere il codice USB.

Troverai le cose molto più semplici se utilizzi il codice ADC di Microchip nelle loro librerie.

davidcary
2011-01-16 05:33:14 UTC
view on stackexchange narkive permalink

Il tuo schema sembra indicare che nulla è collegato al pin 9, che sembra essere AN9.

Potresti, almeno temporaneamente, mettere un pulsante con una resistenza di pull-up identica a quella che hai abbiamo già il pin 5, quindi sappiamo che il pin viene effettivamente tirato in alto e in basso?



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 2.0 con cui è distribuito.
Loading...