Die PIC12F-ADC-Wandlung hat einen unerwünschten Offset

Das aktuelle Setup ist unten dargestellt. PIC12F1822 mit einem 10-Bit-ADC.

PIC12F1822 0-20 mA ADC-Problem

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?

Abbildung 16-4 aus dem Datenblatt PIC12F1822

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.

Wenn Sie sagen, dass Sie 34,6 V über dem Widerstand hatten, wird das mit einem Oszilloskop oder einem anderen hochgenauen Voltmeter gemessen? Oder wird das aufgrund des bekannten Stromflusses angenommen? Wie lang ist außerdem die Verzögerung von der Auswahl des Kanals bis zum Beginn der Konvertierung?
Das ist unwahrscheinlich, aber hast du Klimmzüge aktiviert? Sie sind standardmäßig im Register OPTION_REG deaktiviert.
Toller Aufruf, dass die schwachen Pull-Ups aktiviert sind. Ich habe OPTION_REG nicht richtig eingerichtet, als ich die Timer0-Bits in diesem Register konfigurierte. Würde diesen Kommentar als Antwort markieren, wenn ich könnte!

Antworten (1)

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.