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


von Max K. (Firma: TU Berlin) (maxk)


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:
1
#define __12f675
2
#include"pic/pic12f675.h"
3
 
4
typedef unsigned int config;
5
config at 0x2007 __CONFIG = _CP_OFF &
6
 _WDT_OFF &
7
 _BODEN_OFF &
8
 _PWRTE_OFF &
9
 _INTRC_OSC_CLKOUT &
10
 _MCLRE_OFF;
11
12
int Zeichen;
13
14
/* Schnipp */
15
16
void main(void) {
17
 CMCON  = 0x07; // 0000 0111
18
 TRISIO = 0x09; // 0000 1001
19
 GPIO   = 0x00; // 0000 0000
20
21
 ADCON0 = 0x01; // 0000 0001
22
 ANSEL  = 0xF1; // 1111 0001
23
24
 Zeichen = 0;
25
 while (1)
26
 {
27
  langsamAlles();
28
29
  ADCON0 = 0x03; // 0000 0011
30
  sende();
31
32
  while (ADCON0 == 0x03) {
33
   _asm
34
   nop
35
   _endasm;
36
  }
37
38
  Zeichen=ADRESH;
39
 }
40
}
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!

von Gast (Gast)


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?

von morph (Gast)


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.

von Andreas R. (blackpuma)


Lesenswert?

Ich habe mal eine Vereinfachung für das messen:
1
#define __12f675
2
#include"pic/pic12f675.h"
3
 
4
typedef unsigned int config;
5
config at 0x2007 __CONFIG = _CP_OFF &
6
 _WDT_OFF &
7
 _BODEN_OFF &
8
 _PWRTE_OFF &
9
 _INTRC_OSC_CLKOUT &
10
 _MCLRE_OFF;
11
12
int Zeichen;
13
14
/* Schnipp */
15
16
void main(void) {
17
 CMCON  = 0x07; // 0000 0111
18
 TRISIO = 0x09; // 0000 1001
19
 GPIO   = 0x00; // 0000 0000
20
21
 ADCON0 = 0x01; // 0000 0001
22
 ANSEL  = 0xF1; // 1111 0001
23
24
 Zeichen = 0;
25
 while (1)
26
 {
27
  langsamAlles();
28
  sende();
29
30
  GO = 1;        // Messung starten.
31
  while(GO);     // Warten bis Messung beendet.
32
33
  Zeichen=ADRESH;
34
 }
35
}

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.

von Gast (Gast)


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ß

von Max K. (Firma: TU Berlin) (maxk)


Angehängte Dateien:

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.

von Andreas R. (blackpuma)


Lesenswert?

Hast du vielleicht den falschen Kanal gewählt? Kannst du mal den 
Schaltplan Posten?

LG
Andreas

von Max K. (Firma: TU Berlin) (maxk)


Angehängte Dateien:

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 ;-)

von peter (Gast)


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.

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.