PIC 16F88 Referenzspannung einstellen
Montag, 21. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  CCS Compiler  |  AD-Wandler (CCS)  |  PIC 16F88 Referenzspannung einstellen « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: PIC 16F88 Referenzspannung einstellen  (Gelesen 3348 mal)
 
axel
Newbie
*
Offline Offline

Beiträge: 24


Profil anzeigen
« am: April 23, 2007, 20:23:09 »

Hallo zusammen!

ich will mit einem PIC 16F88 Drucksensordaten von analog nach digital wandeln, was leider nur ansatzweise klappt. Ich bekomme zwar Werte ausgegeben, allerdings bin ich mit der Auflösung unzufrieden. Wenn ich den Sensor maximal belaste bekomme ich Werte um die 150 ausgegeben, bin also weit von den möglichen 1024 entfernt (bei 10 bit).
Hab daher versucht das comparator voltage reference module von Hand folgendermaßen zu setzen:

#BYTE CVRCON = 0xA4

Das hat aber leider keine (merkliche) Verbesserung gebracht.
Betrieben wird mein PIC mit 3,3 V und da alle PINs belegt sind kann ich mir eine externe Referenzspannung "nicht leisten"...

Hat jemand eine Idee, wie man das mit dem comparator module hinbekommt? Hab ich das Register falsch gesetzt? Kommt man nicht drum herum die Referenzspannung an einen extra Pin zu legen? (was ich ja vermeiden will) Oder ist der Ansatz, die Referenzspannung zu ändern sowieso der falsche für das oben geschildertes Problem?



Gespeichert
Schoasch
Sr. Member
****
Offline Offline

Beiträge: 343



Profil anzeigen
« Antworten #1 am: April 23, 2007, 22:05:53 »

Zitat
Hab ich das Register falsch gesetzt?

Dafür müsstest du uns deinen Code zeigen Augen rollen

Hast du etwas genauere Daten zum Drucksensor? Hast du eine Schaltung?

mfg Schoasch
Gespeichert
Stampede
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 969



Profil anzeigen WWW
« Antworten #2 am: April 23, 2007, 23:16:08 »

Hallo,

benutzt du den ADC zum Wandeln oder die Softwarelösung über den Komparator? Denn mir ist sonst der Zusammenhang von Komparator und ADC nicht verständich.
Wie Schoasch schon gesagt hat, sind mehr Infos, v.A. zum Sebsor nötig.

Zitat
Betrieben wird mein PIC mit 3,3 V und da alle PINs belegt sind kann ich mir eine externe Referenzspannung "nicht leisten"...
Externe Referenz ist bei sauberer Vdd auch nicht zwingend nötig.
Möglicherweise brauchst du aber noch einen Messverstärker, um brauchbare Ergebnisse zu erhalten.

Gruß Stampede
Gespeichert

axel
Newbie
*
Offline Offline

Beiträge: 24


Profil anzeigen
« Antworten #3 am: April 24, 2007, 11:37:08 »

Hallo!

Hier ist mal der Code:


Code:
#include "16F88.h"
#device *=16
#use delay(clock= 11059200)
#fuses HS,NOWDT,NOPROTECT,NOBROWNOUT,NOPUT
#use rs232(baud=9600,parity=N,xmit=PIN_B5, rcv=PIN_B2, stream=RS232, bits=8)
#BYTE CVRCON = 0xA4 // Referenzspannung einstellen

int16 counter=0;
int16 DATA1 = 0;
int8 channel=6; // variable für chanel-wahl
int16 msec = 0;
int16 min = 0;



#INT_TIMER2
timer_routine(void)
{

//+++++++++++++++++++++++++++Chanel 1-6 benötigt++++++++++++++++++++++++++++++++++++++++++++++++++

channel++;
if (channel == 7)
{
channel = 1;
}

//+++++++++++++Port für Abfrage bei AD Wandlung angeben++++++



set_adc_channel(channel);

delay_us(10);


//+++++++++++++++++++++++++Zeitstempel+++++++++++++++++++++++++++++++++++++++
msec++; //Zählen der Zykluszahl, entspticht nur dann ms Zahl wenn timer auf 1ms eingestellt ist
if (msec ==60001)
{
msec = 1; //zeitstempel wird nach einer Minute wieder auf eins gesetzt
min++;
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

DATA1 = read_adc(); //Digitalen Wert nach Wandlung einlesen und in DATA1 speichern


printf("%D_%04lu_%05lu\n\r",channel,DATA1,msec); //Daten ausgeben
DATA1=0;


}



void main()
{


setup_adc_ports (sAN6|sAN5|sAN4|sAN3|sAN2|sAN1|sAN0); //activate the used analog chanels

setup_adc(ADC_CLOCK_DIV_32); //divide Fosc by 32 to get below clock maximum


delay_ms(3000);


//setup_timer_2(T2_DIV_BY_1, 173, 16); //Timer2 set to 1ms
setup_timer_2(T2_DIV_BY_16, 173, 2); //Timer2 set to 2ms
//setup_timer_2(T2_DIV_BY_16, 247, 7); //Timer2 set to 10ms

enable_interrupts(INT_TIMER2); //timer2 interrupt zulassen
enable_interrupts(GLOBAL); //interrupts allgemein zulassen

do {} while(1);

}


...Wie bereits gesagt, es macht leider keinen unterschied, ob ich #BYTE CVRCON = 0xA4 drin hab oder nicht.

Die Infos zum Sensor hab ich leider gerade nicht hier, liefere ich aber nach...
Ich werde nachher auch mal versuchen ihn mit anderen Vorwiderständen zu betreiben, vielleicht hilfts was....

Vielen Dank derweil!

Edit: Bitte Code-Tags verwenden.
Bernd
« Letzte Änderung: April 24, 2007, 16:48:33 von Bernd » Gespeichert
axel
Newbie
*
Offline Offline

Beiträge: 24


Profil anzeigen
« Antworten #4 am: April 24, 2007, 17:21:26 »

Der Sensor schimpft sich FlexiForce (von Tekscan). Ist ein resistiver Sensor. Ich habe ihn noch mit einem 100k Widerstand versehen. So liefert er Spannungen von 0 - 0,6V (bei max. Druck).
Wie bekomme ich das mit dem PIC schön aufgelöst??? Würde Messverstärker zwengs Platz - und Stromverbrauch gerne vermeiden...

@Bernd: Sorry, kommt nicht wieder vor...
Gespeichert
Bernd
Globaler Moderator
Hero Member
*****
Offline Offline

Beiträge: 3815



Profil anzeigen
« Antworten #5 am: April 24, 2007, 17:33:02 »

1)

Zitat
Code:
#BYTE CVRCON = 0xA4 // Referenzspannung einstellen

Mit dieser Zeile wird nicht die Referenzspannung eingestellt. Sie sagt dem Compiler lediglich, daß sich ein Byte mit dem Namen CVRCON an der Adresse 0xA4 befindet. Die korrekte Adresse laut Datenblatt für CVRCON ist aber 0x9D.

Um überhaupt an CVRCON etwas zu verändern, müßtest Du also schreiben:

Code:
#BYTE CVRCON = 0x9D

...

void main (void)
{
   ...
   CVRCON = 0xA4;    // schreibt 0xA4 in CVRCON (also an Adresse 0x9D)
   ...
}


2)

Die Komparator-Referenz hat mit dem AD-Wandler überhaupt nichts zu tun, d.h. sie hat keinen Einfluß auf den AD-Wandler. Man kann sie zwar über den VREF- Pin herausführen, aber das ist nicht das, was Du benötigst (VREF+). Außerdem ist die Komparator-Referenzspannung viel zu hochohmig, um sie als Referenzspannung für den AD-Wandler einsetzen zu können (OP als Impedanzwandler zwingend benötigt).

Wie bereits vorgeschlagen, gibt es nur zwei sinnvolle Möglichkeiten:
  • eine externe Referenz verwenden (muß bei 3,3V-Versorgung mindestens 2V sein)
  • Meßverstärker

Die Verwendung der Komparator-Referenz ist überhaupt nicht sinnvoll, da sie zwei Portpins benötigt (VREF+ als Eingang für den AD-Wandler und VREF- als Quelle der Referenzspannung) und auch noch einen OP erfordert, mit dem man schon den Meßverstärker realisieren könnte.

Zitat
So liefert er Spannungen von 0 - 0,6V (bei max. Druck).

Mit einer externen Referenz von 2,0V kommst Du dann auf eine Auflösung von etwas mehr als 8 Bit. Wenn Du eine höhere Auflösung benötigst, führt kein Weg an einem Meßverstärker vorbei.



Viele Grüße

Bernd
Gespeichert

axel
Newbie
*
Offline Offline

Beiträge: 24


Profil anzeigen
« Antworten #6 am: April 25, 2007, 14:53:15 »

...wieder was dazu gelernt.

Die Variante Meßverstärker hat gerade beim Testen gute Resultate geliefert.

Vielen Dank!
Gespeichert
Seiten: [1] Nach oben Drucken 
« vorheriges nächstes »
Gehe zu:  

Powered by MySQL Powered by PHP Made for Mozilla (Firefox) Made for Internet Explorer
Seite erstellt in 0.042 Sekunden mit 18 Zugriffen.
 
Top! Top!