mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik [PIC12F675] AD-Wandler zu ungenau


Autor: Max K. (Firma: TU Berlin) (maxk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin mit einem Freund kürzlich in die Mikrocontrollerprogrammierung 
eingestiegen, d.h. wir sind noch ziemlich frisch auf diesem Gebiet... 
Beim Verwenden des AD-Konverters am PIC12F675 stehen wir jedoch vor 
einem Messproblem.

Am Analogeingang hängt zur Zeit ein Spannungsteiler, der konstante 2,5V 
auf den PIN legt. Die Referenzspannung soll der ADC vom Vdd (5V) holen. 
Das Programm sieht so aus:
#define __12f675
#include"pic/pic12f675.h"
 
typedef unsigned int config;
config at 0x2007 __CONFIG = _CP_OFF &
 _WDT_OFF &
 _BODEN_OFF &
 _PWRTE_OFF &
 _INTRC_OSC_CLKOUT &
 _MCLRE_OFF;

int Zeichen;

/* Schnipp */

void main(void) {
 CMCON  = 0x07; // 0000 0111
 TRISIO = 0x09; // 0000 1001
 GPIO   = 0x00; // 0000 0000

 ADCON0 = 0x01; // 0000 0001
 ANSEL  = 0xF1; // 1111 0001

 Zeichen = 0;
 while (1)
 {
  langsamAlles();

  ADCON0 = 0x03; // 0000 0011
  sende();

  while (ADCON0 == 0x03) {
   _asm
   nop
   _endasm;
  }

  Zeichen=ADRESH;
 }
}
Der ADC soll also einen Wert holen, der anschließend über die serielle 
Schnittstelle in den Computer gelangt. Von den 10-Bit werden nur die 8 
höhsten Stellen verwendet. langsamAlles() bewirkt eine Verzögerung von 
etwa 104 µs, sende() übertragt das Zeichen über einen digitalen Ausgang.

Problem
Die Werte liegen zwar bei etwa 128, schwanken jedoch sehr stark, d.h. 
einen brauchbaren Wert erhalten wir erst indem wir den Median von 100 
Werten verwenden, was natürlich sehr viel Zeit kostet. Geht es nicht 
genauer/schneller?
Ist es ein Denkfehler nur die ersten 8-Bits zu verwenden? Im Prinzip 
wollen wir nur die Übertragung vereinfachen und "Kommastellen" 
abschneiden ;-)

Wir sagen schonmal Danke für die Antworten!



PS: Auf diesem Weg auch ein herzliches Dankeschön an dieses Forum :-) 
Das hat das Lösen von Anfängerfehlern sehr erleichtert!

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Am Analogeingang hängt zur Zeit ein Spannungsteiler, der konstante 2,5V
>auf den PIN legt. Die Referenzspannung soll der ADC vom Vdd (5V) holen.

Sind beide Spannungen von Vdd abgeleitet?

Autor: morph (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich hab das gleiche problem mit dem pic18.

leider geht bei mir die median-methode auch nicht, da die signale min 
40-mal / sekunde berechnet werden müssen.

ich hab mir das einer art hysterese gelöst, aber ideal erscheint mir das 
auch nicht.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe mal eine Vereinfachung für das messen:
#define __12f675
#include"pic/pic12f675.h"
 
typedef unsigned int config;
config at 0x2007 __CONFIG = _CP_OFF &
 _WDT_OFF &
 _BODEN_OFF &
 _PWRTE_OFF &
 _INTRC_OSC_CLKOUT &
 _MCLRE_OFF;

int Zeichen;

/* Schnipp */

void main(void) {
 CMCON  = 0x07; // 0000 0111
 TRISIO = 0x09; // 0000 1001
 GPIO   = 0x00; // 0000 0000

 ADCON0 = 0x01; // 0000 0001
 ANSEL  = 0xF1; // 1111 0001

 Zeichen = 0;
 while (1)
 {
  langsamAlles();
  sende();

  GO = 1;        // Messung starten.
  while(GO);     // Warten bis Messung beendet.

  Zeichen=ADRESH;
 }
}

Also ich habe den PIc16F690 und auch den Sensor und den PIC an einer 
Spannungsquelle und hatte noch keine Probleme mit den Werten. Hab 
allerdings nur kurz mal mit dem 12F675 zu tun gehabt. Hast du vielleicht 
in der Umwandlung des Messsignals oder in der Softwarelösung der RS232 
ein Problem?

NACHTRAG: Es ist vielleicht nicht so gut die Messung genau vor dem 
senden einzuschalten.

Autor: Gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich kenne mich mit PIC's nicht aus, aber Sprut.de ist zimlich gut 
(glaube ich)

schaut mal hier:
http://www.sprut.de/electronic/pic/grund/adc.htm
Stichwort -->> acqisition time  und   ADC-Geschwindigkeit

das ist auch beim Atmel so, daher der Tipp.

Geuß

Autor: Max K. (Firma: TU Berlin) (maxk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Danke für die Gedankenanstöße. Ich geh mal der Reihe nach:

> Sind beide Spannungen von Vdd abgeleitet?
Ja, beide Spannungen kommen von Vdd, hängen allerdings an einer sehr 
konstanten Spannungsquelle. Wir haben es auch schon mit einer separaten 
Versorgung versucht, aber das Ergebnis war das selbe.

> NACHTRAG: Es ist vielleicht nicht so gut die Messung genau vor dem
> senden einzuschalten.
Stimmt, das war ein Denkfehler, den ich gerade korrigiert habe. Die 
Messwerte sind trotzdem noch sehr gestreut.

> Stichwort -->> acqisition time  und   ADC-Geschwindigkeit
Diese Seite ist wirklich super! Allerdings scheinen wir alles beachtet 
zu haben. Mit ist aufgefallen, dass langsamere Messungen genauer werden 
(was mir auch irgendwie sinnvoll erscheint). Ich verwende nun 16µs für 
die Messung und durch das Senden (knapp 1ms) sollte der interne 
Kondensator auch genug Zeit haben sich zu erholen.

Merkwürdig
Ich habe den ADC-Pin jetzt auf Vss (liegt direkt auf Masse) gelegt und 
kriege die gleiche Streuung wie vorher. Ein Screenshot dieser Messung 
liegt bei. Der Graph ist Wert[0;255] über Zeit. Er sollte eigentlich 
fast gerade am unteren Fensterrand verlaufen!

Einen Programmierfehler beim "Empfänger" schließen wir aus, da auch ein 
Hexdump von /dev/ttyS0 die ungenauen Werte aufweist.

Autor: Andreas Riegebauer (blackpuma)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du vielleicht den falschen Kanal gewählt? Kannst du mal den 
Schaltplan Posten?

LG
Andreas

Autor: Max K. (Firma: TU Berlin) (maxk)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Der Schaltplan liegt bei!

Wir werden es morgen mal mit einer galvanischen Trennung zwischen PIC
und serieller Schnittstelle versuchen. Wir benötigen für das nächste
Projekt sowieso bald einen Optokoppler ;-)

Autor: peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Da fehlen aber überall die Kondensatoren.
ca. 100 nF am Referenzeingang(natürlich auch an Vcc).
Einen anständigen Tiefpass am Analogeingang, Grenzfrequenz und 
Abtastfrequenz in einem vernünftigen Verhältniss zueinander.
Kurze Leitungen und ein ein sorgfältiges Layout im Analogteil.
Manche AD-Wandler reagieren Zickick wenn der Innenwiderstand der 
Treiberstufe (hier das Poti) zu hoch ist, mal im Datenblatt nach 
Hinweisen suchen.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.