Konfiguration des ADC

Gast #3434513
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
}
Gast #3434526
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.
Gast #3451919
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.
Angehängte Dateien:
#3451970
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?
Gast #3451993
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.
Angehängte Dateien:
#3452010
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?
Gast #3452021
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren