Das aktuelle Setup ist unten dargestellt. PIC12F1822 mit einem 10-Bit-ADC.
Ich verwende einen 250R 0,05% Präzisionswiderstand, um einen schönen 0-5-V-Eingang zum analogen Pin (AN2, wenn es darauf ankommt) zu erhalten. Soweit ich das beurteilen kann, habe ich die Softwareseite der Dinge korrekt, aber ich zeige die relevanten Teile des Codes unten.
Ich schiebe die Konvertierungsergebnisse (ADRESH und ADRESL) direkt auf den SPI SDO-Pin, von dem ich weiß, dass er richtig funktioniert.
Das Problem ist, dass ich für einen 0-mA-Eingang (beide Eingangsanschlüsse geerdet) einen Ausgang von 00 0011 0011 (51 Dez) erhalte. Wenn meine Stromquelle angeschlossen und so niedrig wie möglich eingestellt ist - etwa 34,6 mV über dem Widerstand - erhalte ich ein Ergebnis von 00 0011 1010 (58 Dez). Ein Wert von 58 dezimal sollte einer Eingangsspannung von 0,283 V entsprechen, was ziemlich groß ist
Ich habe Mühe zu verstehen, warum es einen Versatz von etwa 5,6% gibt. Ist die interne Einrichtung eine mögliche Ursache?
Es ist so konfiguriert, dass es Vdd und Vss als Referenzspannungen verwendet, einen Umwandlungstakt von Fosc/2 (250 kHz) hat und das ADC-Modul während einer Startroutine eingeschaltet wird.
Relevanter Code:
ADC_CONV
banksel ADCDATAH
clrf ADCDATAH
banksel ADCDATAL
clrf ADCDATAL
banksel ADCON0 ;
bsf ADCON0,ADGO ;Set ADGO conversion start bit
CONVTEST clrwdt ;Clear Watchdog Timer
call DELAY ;Short delay
btfsc ADCON0,ADGO ;If conversion finished skip next instr
goto CONVTEST ;Conversion not yet finished
call DELAY
banksel ADRESH ;
movf ADRESH,0 ;Move the upper bits of conversion to W
banksel ADCDATAH
movwf ADCDATAH ;W to ADCDATAH
banksel ADRESL ;
movf ADRESL,0 ;Move the lower bits of conversion to W
banksel ADCDATAL
movwf ADCDATAL ;W to ADCDATAL
return
SPI_ADC_TRANSMIT
banksel PORTA
bcf CS ;Select DAC slave to receive data (16 bits)
banksel ADCDATAH
movf ADCDATAH,0 ;Move SPIDATAH data to W
banksel SSP1BUF
movwf SSP1BUF ;W to SSP1BUF
call DELAY ;Call delay (must be >8 inst cycles)
;
banksel ADCDATAL
movf ADCDATAL,0 ;Move SPIDATAL data to W
banksel SSP1BUF
movwf SSP1BUF
call DELAY
banksel PORTA
bsf CS
return
Sollte ich das ADC-Modul nur einschalten, wenn ich eine Konvertierung durchführe? Sein einziger Zweck ist als ADC, daher sah ich keinen Sinn darin, ihn auszuschalten, da der Stromverbrauch kein Problem darstellt.
Die Anerkennung dafür sollte Dan Laks zuteil werden (siehe Kommentar zur ursprünglichen Frage), aber diese Frage befindet sich immer noch im Abschnitt „Unbeantwortet“, also gebe ich eine Antwort darauf.
Stellen Sie sicher, dass schwache Klimmzüge in den OPTIONS_REG nicht aktiv sind.
Dan Laks
Dan Laks
JoshGreen1