Konfiguration des ADC

Gast #3434513
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
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?
Gast
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
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.
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?
Gast
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:
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
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:
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
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.
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 12 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.