Forum: Mikrocontroller und Digitale Elektronik Konfiguration des ADC


von Martin (Gast)


Lesenswert?

Hallo ich habe ein Problem mit meinem ADC.
Ich habe ein Programm geschrieben wo ich ein Poti aufdrehe und nach 
einem bestimmten Wert soll eine LED nicht mehr leuchten.
Ich habe das Problem, dass mein Poti sich nicht linear verhaltet wenn 
ich das Programm laufen lasse. Es sich aber so verhalten sollte.

Das Poti kann ich von 0° bis 270° drehen. Ich habe kontrolliert welchen 
Wert ich habe und es ist so, dass ich bei 0° Potiwinkel einen Wert von 
~0 habe, das passt, bei ~250° habe ich ~11000 und bei ~255° habe ich auf 
einmal 61000.

Darum frage ich mich wo der Fehler liegt.

PS: Das Poti ist nicht kaputt
1
#include <33FJ256MC710A.h>
2
#include <stdio.h>
3
#include <stdlib.h>
4
5
#fuses XT,NOWDT
6
#use delay(clock=8000000)
7
8
#define LED11 PIN_E1
9
10
void main()
11
{
12
    unsigned int x;
13
14
    set_tris_e(0);                  //PORT E Ausgang
15
    set_tris_b(1);                  //PORT B Eingang
16
    setup_adc(ADC_CLOCK_INTERNAL);  //Takt des ADC
17
    setup_adc_ports(sAN8);          //PIN32 wird ein analog PIN
18
    set_adc_channel(8);             //muss mit der Adresse des PINs
19
                                      übereinstimmen
20
    delay_ms(10);
21
22
    while(1)
23
    {
24
        x=read_adc();               //liest den Wert ein
25
        if(x<511)
26
        {
27
            output_high(LED11);
28
        }
29
        else
30
        {
31
            output_low(LED11);
32
        }
33
        delay_ms(100);              
34
    }
35
}

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Ich kenne diese CPU nicht, aber wenn bei einem ADC mit 12bit ein Wert 
von 61000 rauskommt dann stimmt wirklich etwas nicht.

Woher kennst du den wert der Rauskommt?

von Steffen (Gast)


Lesenswert?

Martin schrieb:
> Das Poti kann ich von 0° bis 270° drehen. Ich habe kontrolliert welchen
> Wert ich habe und es ist so, dass ich bei 0° Potiwinkel einen Wert von
> ~0 habe, das passt, bei ~250° habe ich ~11000 und bei ~255° habe ich auf
> einmal 61000.
>

Zum einen kann es ein logarithmisches Poti sein, zum anderen der Wert 
des Potis ist zu hoch.

von Martin (Gast)


Lesenswert?

Es ist ein lineares Poti.
Ich verwende einen 10bit ADC also müsste doch unsigned int reichen oder?

von Peter II (Gast)


Lesenswert?

Martin schrieb:
> Ich verwende einen 10bit ADC also müsste doch unsigned int reichen oder?

ja, aber da kann NIEMALS ein wert >= 1024 raukommen

von Holger M. (Gast)


Lesenswert?

Konnte man bei den PICs nicht über ein Bit wählen ob das Ergebnis 
rechts- oder linksbündig im 16bit Register gespeichert wird? Könnte die 
abstrusen Werte erklären.

von Peter P. (nuppel)


Lesenswert?

Hi Martin,

Hab zwar noch nie nen PIC angefasst aber die kochen ja auch nur mit 
Wasser.
Ist "read_adc()" ne selbst geschriebene Funktion?
Post mal pls.

Hört sich so an alswenn da was mit den Werten verwürfelt wird.
Oder werden mehrere Werte geholt und nicht richtig gemittelt?

von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Nein read_adc() ist keine selbst geschriebene Funktion.

Jetzt  habe ich einen Zahlenbereich von 0-1023, dass passt (10bit).
Aber ich habe noch immer das Problem, dass das Poti nicht linear ist 
(ist aber nicht kaputt -> es muss ein Programmfehler bzw 
Konfigurationsfehler sein).
Wie man beim Bild, das ich hinzugefügt habe sieht man wie sich das Poti 
ungefähr verhält.

Hier ist der aktuelle Code.
1
#include <33FJ256MC710A.h>
2
#device ADC=10
3
#include <stdio.h>
4
#include <stdlib.h>
5
#fuses XT,NOWDT
6
#use delay(clock=8000000)
7
8
void main()
9
{  
10
    int16 x;
11
12
    set_tris_e(0);                  //PORT E Ausgang
13
    set_tris_b(1);                  //PORT B Eingang
14
15
    setup_adc_ports(sAN8);          //PIN32 wird ein analog PIN
16
    set_adc_channel(8);             //muss mit dem PIN übereinstimmen
17
    setup_adc(ADC_CLOCK_INTERNAL);  //Takt des ADC
18
   
19
    delay_ms(20);
20
    
21
    while(1)
22
    {       
23
        delay_us(100);
24
        x=read_adc();
25
        }
26
    }

Ich hoffe jemand kann mir bei diesem Problem helfen. Falls noch etwas 
unklar ist werde ich gerne noch weiter Details angeben.

: Bearbeitet durch User
von Karl H. (kbuchegg)


Lesenswert?

Deine Grafik sieht aus, wie ein Poti mit einer verschlissenen 
Widerstandsbahn.


Das ist nicht zufällig ein logarithmisches Poti?
Wie ist das Poti überhaupt angeschlossen?

In deiner Grafik sind mV angegeben. Wo kommen die her? Hast du die mit 
einem Voltmeter gemessen oder sind die zurück gerechnet? Kannst du mal 
mit einem Voltmeter messen?

: Bearbeitet durch User
von Martin (Gast)


Angehängte Dateien:

Lesenswert?

Das habe ich mir zuerst auch gedacht, dass das Poti kaputt ist. Ist es 
aber nicht, wenn ich kein Programm in den µC lade und dann die Spannung 
messe ist sie linear.
Nein es ist ein lineares Poti, wie es angeschossen ist siehsts du am 
Bild.
Ja ich habe es mit einem Voltmeter gemessen, die Spannung ist von 0 bis 
3,3V, ich habe nur die Achse in mV angegebn damit man sieht das es sich 
davor nur im mV Bereich ändert.

von Karl H. (kbuchegg)


Lesenswert?

Martin schrieb:

> Ja ich habe es mit einem Voltmeter gemessen,

dann würde ich mir mal die Pinkonfigurationen genauer ansehen.
Ich kenn leider deinen konkreten µC nicht.
Aber irgendwo ist da noch was faul.

Ist das hier
1
    set_tris_e(0);                  //PORT E Ausgang
2
    set_tris_b(1);                  //PORT B Eingang
3
4
    setup_adc_ports(sAN8);          //PIN32 wird ein analog PIN
alles was notwendig ist, um den Pin für eine ADC Messung frei zu 
schaufeln?

von Martin (Gast)


Lesenswert?

Ich verwende einen dsPIC33FJ µC und einen CCS Compailer.

Ich glaube schon.
Ich lege das Port als Eingang fest und sage das der PIN ein Analogpin 
ist, in allen Beispielen die ich gefunden habe, hat dies gereicht.

von Martin (Gast)


Lesenswert?

Danke für eure Hilfe, ich habe den Fehler gefunden und behoben.
Der Fehler war:

set_tris_b(1);

Richtig ist:

set_tris_b(0x100);

damit NUR der PIN 8 auf PORT B ein Eingang wird

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.