Analog/Digital Wandler PIC 16F877A
Mittwoch, 23. Mai 2012
 
 

PIC Mikrocontroller Forum  |  PIC Mikrocontroller  |  PIC Mikrocontroller Allgemein  |  AD-Wandler (Allgemein)  |  Analog/Digital Wandler PIC 16F877A « vorheriges nächstes »
Seiten: [1] Nach unten Drucken
Autor Thema: Analog/Digital Wandler PIC 16F877A  (Gelesen 2112 mal)
 
problem
Gast
« am: Dezember 22, 2009, 08:56:11 »

Hallo,

für ein Projekt ist es notwendig diverse Sensoren einzusetzen und auszulesen. Das wären einmal ein Drucksensor (Flexiforce) und ein LDR. Um eine geeignete Spannung zu bekommen habe ich die beiden Sensoren jeweils in einen Spannungsteiler eingebaut mit einem Widerstand von 10MOhm für den Druck und 47kOhm für den LDR. Die Messwerte werden dann über die RS 232 Schnittstelle an ein GUI übertragen.
Allerdings kommt nur Mist raus. Es könnte entweder an der Wandlung liegen oder an dem GUI, das ich in VB .net geschrieben habe.
Im Datenblatt hab ich den Hinweis gefunden, dass die Impedanz der Analogquelle nicht höher als 10kOhm betragen sollten. Könnte das das Problem sein? Was könnte ich stattdessen machen? Ich würde gerne auf einen Messverstärker verzichten. Ansonsten würde mich noch interessieren, ob meine Variante die Werte zu übertragen die Sinnvollste ist.
Hier ist mein Code:

Code:
void main()
{
   //pin io setting
set_tris_a(0xff);
    set_tris_b(0xfe);
    set_tris_c(0x80);

    //set interrupt timer
set_rtcc(0);
    setup_counters(RTCC_INTERNAL, RTCC_DIV_1);
    enable_interrupts(int_rtcc);
enable_interrupts(int_rda);
    enable_interrupts(GLOBAL);

//set a/d converter
setup_adc_ports( ALL_ANALOG );
setup_adc(ADC_CLOCK_INTERNAL );


while(k <5)
{
buf[k]=20;
force[k]=0;

k++;
}

    do
    {

for(a=0; a<5; a++)
{
set_adc_channel(a);
force[a] = read_adc();


delay_ms(100);
}
printf(force[0], force[1],  force[2], force[3],force[4]);

}while(1);

Besten Dank und bis denn,
Kolja.
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #1 am: Dezember 22, 2009, 11:20:39 »

Hallo.

Zitat
Allerdings kommt nur Mist raus.
Das bedeutet?

Zitat
Es könnte entweder an der Wandlung liegen oder an dem GUI, das ich in VB .net geschrieben habe.
Es könnte auch noch an allen möglichen anderen Dingen liegen, die man auf Grund der dünnen Imformationslage nur erahnen kann.
z.B.: welchen Datentyp hat 'force'? Dir ist schon klar, dass der A/D-Wandler einen 10-Bit Wert ausspuckt? Wie ist das ADFM-Bit im ADCON1-Register konfiguriert? Wird der Wert rechts- oder linksbündig ausgegeben?
Es könnte aber auch an einer inkompatiblen RS232-Schnittstelleneinstellung beim PIC bzw. PC liegen.
Am meisten frage ich mich allerdings, was die Zeile
Code: (c)
printf(force[0], force[1],  force[2], force[3],force[4]);
tun soll? Ich habe es zwar nicht ausprobiert, aber ich bezweifle, dass diese Zeile das tut, was Du erwartest. Bitte schau Dir mal im Compiler Reference Manual des CCS C das Kapitel zu printf an.

Ob es nun an der Wandlung oder an Deinem VB.net-Programm liegt, das kannst Du ja wohl am ehesten selber testen. Wenn Du schon eine serielle Schnittstelle am PIC verwendest, dann lass Dir doch einfach mal die A/D-Werte (ich würde vorschlagen zunächst klein anzufangen und nur einen A/D-Kanal zu betrachten) als String in einem Terminalprogramm anzeigen.
Zitat
printf("%Lu \n\r",read_adc());
Wenn das soweit funktioniert und tatsächlich Zahlen im Terminalfenster auftauchen, dann kannst Du die A/D-Wandlung überprüfen, indem Du (ohne die Sensoren) mal 5V bzw. 0V an den A/D-Eingang legst.

Zitat
Ansonsten würde mich noch interessieren, ob meine Variante die Werte zu übertragen die Sinnvollste ist.
Äh...vermutlich nicht. Aber da ich nicht weiß, wie Dein VB-GUI die Daten erwartet, kann man sich dazu schlecht äußern.

Gruß
Daniel

Gespeichert
problem
Gast
« Antworten #2 am: Dezember 23, 2009, 05:57:16 »

Erstmal besten Dank für die schnelle Antwort.
Habe das jetzt mal getestet, bei 5V bekomme ich 63 und bei 0V 0. Wie kann ich das ADCON1 Register denn konfigurieren? Ich verwende MPLAB mit dem CCS Compiler.

Also das GUI erwartet ein Array mit 5 Elementen. Ist es irgendwie möglich force() vom PIC aus komplett zu verschicken?
Gespeichert
slowslo
Gast
« Antworten #3 am: Dezember 23, 2009, 09:22:51 »

Hast Du Dich schon mal mit dem Prozessor und dem zugehörigen Datenblatt beschäftigt?
Gespeichert
problem
Gast
« Antworten #4 am: Dezember 23, 2009, 10:17:20 »

Ja klar. Allerdings habe ich da keine befriedigende Lösung für den C-Compiler gefunden und wenn ich diesen Post hier betrachte (http://www.fernando-heitor.de/component/option,com_smf/Itemid,121/topic,3230.0/), bin ich wohl auch nicht der einzige. Die genannte Lösung dort konnte ich leider nicht nachvollziehen.
Gespeichert
Holzwurm
Gast
« Antworten #5 am: Dezember 23, 2009, 10:33:40 »

Hallo,

kann es ein das du nach dem set_adc_channel etwas warten musst?

Du musst im CCS den AD-Umsetzter auf 10 Bit setzen.

Der

  Holzwurm
Gespeichert
Coltfisch
Sr. Member
****
Offline Offline

Beiträge: 496



Profil anzeigen WWW
« Antworten #6 am: Dezember 23, 2009, 18:46:50 »

Ich frage nochmals:
Zitat
welchen Datentyp hat 'force'?

Offensichtlich reagiert der aus dem ADC gelesene Wert schonmal auf extern angelegte Pegel. Das ist doch hervorragend!  L&#228;chelnd
Nur der Wert selber sieht offensichtlich nicht wie erwartet aus. Ich tippe ja immer noch auf einen Datentyp, der mit dem 10 Bit-ADC-Ergebnis überfordert ist.


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.039 Sekunden mit 18 Zugriffen.
 
Top! Top!