PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : VREF- funktioniert nicht



theodrin
09.07.2007, 19:26
Hallo Leute!

Meine Frage bezieht sich auf den A/D-Converter. Ich würde gerne eine Analoge Spannung digitalisieren. Und da hab ich zu Übungszwecken ganz einfach nen Spannungsteiler aufgebaut. Der geht von 0,5V - 5V. Na und dann hab ich den Code (in C) geschrieben. Hab auf die Parameter geachtet und na ja, das ganze läuft einmal. Aber blöderweise funktioniert VREF- nicht. Also ich kann schon den Analogwert digitalisieren, aber halt nicht von 0-1023. Da müsst ich halt VREF- auf ca. 0,5V legen. Das tu ich auch. Nehm nen Spannungsteiler mit etwas weniger als 0,5V (man ist ja vorsichtig) und häng ihn an den VREG- PIN. Nur Blöderweise ist die Spannung wenn ich am Pin messe 0V. Wenn ich den Draht wieder wegnehme, hab ich an meinem Spannungsteiler wieder meine ca. 0,5V. Jetzt frag ich mich halt, wieso am PIN 0V anliegen, obwohl ich eh 0,5V anlege. Ich versteh das nämlich nicht ganz.

Also ich schicke noch den Programmcode mit



/** I N C L U D E S ************************************************** ********/
#include <p18cxxx.h>
#include <adc.h>
#include <pwm.h>
#include <timers.h>
#include <stdlib.h>
#include "delays.h" // für die Warteschleife


/** Configuration ************************************************** ******/
#pragma config FOSC = INTOSC_XT //Ich verwende interne Clock (HS für 20MHz, allerdings sind 22pF Kondis nötig)
#pragma config PWRT = ON
#pragma config BOR = OFF
#pragma config WDT = OFF //Watchdog Timer
#pragma config LVP = OFF //Low Voltage ICSP
//#pragma config PBADEN = OFF

/** D E C L A R A T I O N S **************************************************/
#pragma code



void main(void)
{
int result;
unsigned int pwmwert=0;

LATB = 0; // Port B wird 0 gesetzt
TRISB = 0; //Port B wird als Ausgang gesetzt
PORTC = 0; //PORT C wird 0 gesetzt
TRISC = 0; //PORT C wird als Ausgang gesetzt
TRISA = 1; //PORT A wird als Eingang gesetzt

OpenTimer2(TIMER_INT_OFF & T2_PS_1_1 & T2_POST_1_1);
OpenPWM1(255);


while(1)
{

OpenADC(ADC_FOSC_RC & ADC_RIGHT_JUST, ADC_CH0 & ADC_INT_OFF & ADC_VREFPLUS_VDD & ADC_VREFMINUS_EXT, 15);

Delay10TCYx(5);
ConvertADC();
while( BusyADC() );
result = ReadADC();
CloseADC();

pwmwert=result;

SetDCPWM1(pwmwert);
SetOutputPWM1(SINGLE_OUT,PWM_MODE_1);

}//end while

ClosePWM1();
CloseTimer2();

}//end main



So ich hoffe da weiß wer Rat. Ich weiß nämlich nicht mal obs am Code liegt oder nicht.

Gock
10.07.2007, 10:08
Hi!
Wenn die Spannung zusammen bricht klingt das schwer nach zu großer Quellenbelastung, entweder durch das Board, oder aber im µC. Da ich weder auswendig weiß, wie viel Strom Vref zieht noch, wie Dein Spannungsteiler aussieht, kann ich Dir nicht weiter helfen.
Gruß

theodrin
10.07.2007, 18:49
Hallo!

Nein, es liegt nicht an der Versorgung, aber ich denke, ich kann den Fehler schon mal ein "wenig" eingrenzen. Es liegt glaub ich an der Software. Weil es sieht so aus, als ob ich am Pin VREF- Masse habe. Also vielleicht ist der Pin intern auf Masse geschalten worden. Aber ich hab keine Ahnung wie oder warum. Ich meine ich weiß nicht. Ich verwende ja C und zwar die C18 von Microchip. Und von dort eben die Funktionen. Aber ja was soll ich machen, die geht anscheinend nicht, oder ich bin zu dumm. OK, es wird das zweitere sein, aber findet war einen Fehler bei dem was ich geschrieben habe?
Bitte, bitte, sagt ihn mir!!

lg
Norbert

theodrin
10.07.2007, 19:33
So ich packs nicht. Ich hab mich jetzt schon viel zu lange herumgespielt. Ich hab mir die Sourcefiles von den Funktionen angesehen und ja, was soll ich sagen. Es müsste funktionieren.
So aus. Jetzt muss das mal ne Zeit ruhen, sonst hau ichs noch weg.

lg,
Norbert

kalledom
10.07.2007, 20:06
Hallo,
den PIC18... kenne ich nicht, kann mit "#include <p18cxxx.h>" auch nicht raten, was für einen PIC18 Du hast.
Beim PIC16F877 muß ich mit 4 Bits im Register ADCON1 angeben, welcher Eingang digital, analog, Vref+ und Vref- ist.
Wenn das richtig angegeben ist, kommt Vref+ an +5V und Vref- an 0,5V.
Dann sollte es funktionieren, wenn .... der PIC18 so was auch hat :-)

theodrin
10.07.2007, 20:32
Hallo Kalledom!

Also ich verwende den PI18F4550. Das kann man nur so im Code schreiben, weil ich ein spezielles LinkerScript-File habe. Aber da kennst du dich wahrscheinlich eh aus.
Und das was du gemacht hast hab ich eh ausprobiert. Also ich denke es liegt an der Funktion OpenADC(). Also ich mache das nächste mal Step by Step den Einschaltvorgang vom ADC also mit Registerbeschreiben und so weiter. Aber eigentlich hab ich das eh schon gemacht. Egal, vielleicht verträgt sich beides miteinander nicht.
@ kalledom: OK, könntest du mir vielleicht noch den Code von deinem Versuch schicken, bitte.

lg
Norbert

kalledom
10.07.2007, 21:38
Ich programmiere nur in Assembler.
Hier ist der Link zur Initialisierung des ADC: http://www.domnick-elektronik.de/picasm.htm#Init

theodrin
11.07.2007, 19:33
Hallo!

Also jetzt ist bald Schluss! Es funktioniert nicht. Aber ich denke ich hab den Fehler. Es muss an meiner Spannungsquelle liegen. 100%-ig. Weil ich hab jetzt alles ohne den C-Code programmiert, also direkt mit Registerbeschreiben. Und es geht nicht, aber ich hab auch meine VREF+ verwendet. Da hab ich ganz einfach die 5V vom Netzgerät angehänt und die kommen auch am PIN direkt an. Also ja ich schaue drauf, dass ich ne besseres Spannungsquelle herkrieg und dann schreib ich noch mal

lg
Norbert

theodrin
11.07.2007, 20:04
Hallo!

So ich hab jetzt das ganze mit nem Spannungsregler versucht. Und ich sag euch was. Ich hab halt ohne µC den Spannungswert eingestellt und dann angeschlossen. Und am Pin lagen die 1,25V Referenzspannung des Spannungsreglers. Hm, ich versteh das ganze jetzt noch weniger, aber jetzt denke ich dass das Problem Hardwaremäßig aber wieso tötet mir der PIN meine Spannung? Weiß da wer Rat, vielleicht aus der Elektronikabteilung wer. Weil da hats ja was. Die fixen Spannungen nimmt er, aber die ich ich mit meiner Widerstandsbeschaltung mache nimmt er nicht. Was hats da bitte?

lg,
Norbert

theodrin
12.07.2007, 19:35
Hallo!
Heast Burschen, hauts ma eine runter, wie man so schön sagt. Ich Idiot hab den dümmsten Fehler gemacht dens gibt. Wissts eh ich hab alle Softwareteile durchkontrolliert bis auf das TRISA Register. Und genau das, hab ich falsch. Bin ich gut oder was. So aber jetzt funktionierts endlich. Also wirklich, hätte mir das keiner sagen können. :-) Stand ja im Code :-)
Nein, Scherz, ich freu mich das ich draufgekommen bin. ;-) *happy*
So dann mal fröhliches programmieren wünsche ich.

Aber ich bin noch nicht ganz fertig, also vielleicht gibts bei meiner VREF- noch ein paar Probleme. :-)

lg
Norbert