- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 7 von 7

Thema: PIC18F442 - ADC Problem

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    12.09.2010
    Beiträge
    20

    PIC18F442 - ADC Problem

    hi, ich habe einen PIC18F442.
    Mit dem ADC dort möchte ich nun eine Temperatur messen!
    Dazu nutze ich einen KTY 81-220 mit 2000Ohm bei 25°C

    Ich habe einiges gelesen aber komm leider nicht weiter...
    Ich habe den KTY an AN0 gehängt. Der KTY hängt in reihe mit einem 4,7K Widerstand und das ganze fungiert als Spannungsteiler. Ich Greife nun die Spannung ab und leite diese an den PIC (AN0) zu messung weiter.

    Nun ja. Da ich den PIC mit 5V betreibe und der ADC 10Bit hat ist eine Werterhöhung bei 5/1024 = 4,88mV.
    Für den KTY habe ich mir eine Wertetabelle in Excel gemacht die ich hier mal anhängen werde!
    Laut der Tabelle erhalte ich bei 20°C 1,451V und der ADC Wert müsste 297 Betragen.

    Ich komme bei weitem nicht auf diese Werte! 1,434 V habe ich direkt am Spannungsteiler (mit Multimeter gemessen) und ich habe hier ca. 23°C

    Das ganze Programm schicke ich nun mal nicht rüber... da die Multiplexingfunktion und die Uhr gut funktionieren. Also nur das nötigste
    Code:
    /*
     *  I N C L U D E S
     */
    #include <p18F442.h>
    
    /*
     *  C O N F I G U R A T I O N S
     */
    
    #pragma config OSC = XT
    #pragma config PWRT = ON        //keine ahnung... Memo: noch mal Nachlesen!
    #pragma config WDT = OFF      //Watchdog off
    #pragma config LVP = OFF        //Low Voltage ICSP
    /*
     * D E F I N A T I O N S
     */
    
    
    /*
     *  F I X E D    V A R I A B L E S
     */
    //Global
    int i = 0;
    int mode = 3;           //Anzeigemodus
    
    //Dot Matrix Anzeige
    int iCol = 0;           //Zähler für die Spalten
    int iRow = 0;           //Zähler für die Zeilen
    int CursorPos = 0;      //Aktuelle Position im "Display"
    int CursorValue[5] = {0,10,10,10,10};   //Werte an der Position
    int SegPos = 0;         //Aktuelle Position im Segment
    int co = 0;             //Anzahl Overflows
    int coAnpassen = 0;     //Counter um den fehlen viertelTakt nachzuholen.
    
    //Temperatur
    int temp1 = 0;
    int temp2 = 0;
    
    //Uhr
    int Stunden  = 0;
    int Minuten  = 0;
    int Sekunden = 0;
    
    //Taster
    int TWT = 800;          //Entprelltimer
    int T1WT = 0;
    int T2WT = 0;
    int T3WT = 0;
    
    
    /*
     *  I N T E R R U P T
     */
    
    #pragma interruptlow InterruptHandler
    //Ausgeblendet
    /*
     *  P R O G R A M M
     */
    #pragma code
    unsigned char ADC_read(void){
        ADCON0bits.GO_DONE = 1;
        temp2 = 0;
        while(ADCON0bits.GO_DONE != 0){}
        temp2 = ADRESL;
        temp2 += (ADRESH << 6);
    }
    void main(void) {
        TRISD = 0x00;
        PORTD = 0x00;
        TRISB = 0x07;
        TRISAbits.RA0 = 1;
    
        T0CONbits.TMR0ON = 1;       //Timer0 an/aus
        T0CONbits.PSA    = 1;       //Den Vorteiler 0 = AN | 1 = OFF
        T0CONbits.T0PS   = 0b000;   //Voteiler einstellen
        T0CONbits.T0CS   = 0;       //Tacktquelle | 1 = vom TOCKI holen | 0 = vom OSC holen
        T0CONbits.T08BIT = 1;       //Timer Breite einstellen | 1 = 8bit | 0 = 16bit
    
        
        RCONbits.IPEN = 0;          // Priorität aktivieren/deaktivieren
        INTCONbits.GIEL = 0;        // Low priority
        INTCONbits.GIEH = 1;        // Interrupting enabled.
    
        INTCONbits.TMR0IE= 1;
        INTCONbits.TMR0IF= 1;
        INTCON2bits.TMR0IP=0;
    
        ADCON1 = 0b11001110;
        ADCON0 = 0b01000000;
        ADCON0bits.ADON = 1;
    
        init_4094();
    
        //test();
    
        while(1){
            if(mode==0){
                test();
            }
            if(mode==1){
                uhr_show();
            }
            if(mode==2){
                uhr_binaer();
            }
            if(mode==3){
                if(Sekunden % 2 == 0 ){
                    ADC_read();
                }
                therm();
            }
        }
    }
    if(Sekunden % 2 == 0 ){
    ADC_read();
    }
    Soll nur dafür sorgen dass jede sekunde ein mal gemessen wird. Funktioniert gut... da der ADC ja Zeit benötigt zwischen den messungen dachte ich es wäre vorerst die besste Idee.
    Ich nutze einen 4MHz Quarz an dem PIC18F442.
    So, ich glaube ich habe alles wichtige erzählt. Ich hoffe ihr könnt mir helfen... Danke!

    Achja, weil es nicht funktioniert habe ich sehr viel rumprobiert mit den Registern um mich meinen Werten anzunähern... kann sein dass dies jetzt totaler Bullshit ist aber ich wusste nicht mehr weiter
    Angehängte Dateien Angehängte Dateien
    Geändert von ruNN0r (22.02.2012 um 01:33 Uhr)

Ähnliche Themen

  1. ATMega32 UART problem --> Problem gelöst
    Von ChristophB im Forum C - Programmierung (GCC u.a.)
    Antworten: 3
    Letzter Beitrag: 12.03.2010, 18:45
  2. Problem mit Atmega644P Erkennung (Bascom-Versions-Problem)
    Von Rohbotiker im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 3
    Letzter Beitrag: 11.08.2008, 18:52

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

fchao-Sinus-Wechselrichter AliExpress