Forum: Mikrocontroller und Digitale Elektronik digitalfunke mit PIC und ADC


von Kall H. (kned)


Lesenswert?

Hi Leute

Da digitale Funken (zum steuern von rc cars) recht teuer sind, dacht ich 
mir - mach ich selbst!

Jetzt hab ich eine alte funke bei ebay bestellt, den analogkram 
rausgeschmissen und nurnoch die potis drin gelassen

Ich möchte mit dem ADC meines pic16f877a die spannung an den potis 
ablesen, um damit die Knüppelstellung ermitteln zu können, allerdings 
schwanken die werte des ADC verdammt stark:

2,316 V
2,402 V
2,379 V
2,346 V
2,468 V

laut multimeter sinds 2.31V

Die Schaltung sieht so aus:

LF 33 CV (3.3v festspannungsregler) -> microchip
              |                          |
              |                         ADC
              |                          |
              1k ----------------------------- poti (2k-3k) ---- | GND
                                         |                    |
                                          ------| |-----------
                                                100nF
quellcode mit CCS C:

         setup_adc_ports( ALL_ANALOG );
         setup_adc(ADC_CLOCK_INTERNAL );
         set_adc_channel( 0 );
         delay_us(20);
         value = read_adc();

sitzte jetzt schon 3 std dran, aber die schwankungen werden nicht 
weniger ... hat wer ne idee?

von Matthias L. (Gast)


Lesenswert?

>delay_us(20);

Da scheinst du ganz schön zittrige Hände zu haben.

Wie wäre es mit:
- eine kleinen C parallel zur Ref-Spannng?
- ein kleines Mittelwert/Tiefpassfilter in der Software?
- langsamere Abtastung? oder brauchst du 50'000 Samples pro Sekunde?

von Kall H. (kned)


Lesenswert?

schonmal danke für die antwort :D

hier nochmal der ganze QT


         setup_adc_ports( ALL_ANALOG );
         setup_adc(ADC_CLOCK_INTERNAL );
         set_adc_channel( 0 );
         delay_us(20); // warten bis adc bereit

         value = read_adc(); // 4 mal lesen
         value += read_adc();
         value += read_adc();
         value+= read_adc();

         value/=4;

         value=(value*33)/10;

         printf("%Ld \n\r", value);
         delay_ms(500);

Als Vref nutz ich VDD vom PIC, die sollte ja eigentlich durch den 
festspannungsregler recht stabil sein ?

von Matthias L. (Gast)


Lesenswert?

>recht stabil sein
poste mal die komplette Schaltung, mit allen Bauteilen (Block-Cs)

von Kall H. (kned)


Lesenswert?

mehr is nich dran an der schaltung ><

von chris (Gast)


Lesenswert?

Durchdem daß du vcc als VREF nimmst, glättest du die automatisch mit
dem Kondensator des uC, das dir dann warscheinlich die wechselnden Werte 
verursacht. Versuch es mal, Vref extern zu beschalten.

von Matthias L. (Gast)


Lesenswert?

Da kann ja nichts glätten. An JEDES Betriebsspannungs-Masse-Pin-Paar 
gehört ein 100nF Kondensator. Direkt an den µC

von Kall H. (kned)


Lesenswert?

Matthias Lipinsky wrote:
> Da kann ja nichts glätten. An JEDES Betriebsspannungs-Masse-Pin-Paar
> gehört ein 100nF Kondensator. Direkt an den µC


eingebaut, Vref extern verschaltet, keine verbesserung :\

von holger (Gast)


Lesenswert?

>LF 33 CV

Wie wird der am Eingang versorgt?

von Kall H. (kned)


Lesenswert?

5v geregeltes netzteil...

hab mal die verschiedenen spannungen am PIC gemessen:
am ADC pin, an dem der poti hängt ist die spannung konstant 2.31V
an den nicht angeschlossenen ADC pins schwankt die spannung: 0.17V-0.20V
am VDD pin vom PIC ist die spannung auch konstant 3.30V

von Matthias L. (Gast)


Lesenswert?

>konstant 3.30V

Hast du das mit einem Multimeter oder einem Oszi gemessen?
Ein Multimeter ist für solche Betrachtungen nämlich ungeeignet...

von Kall H. (kned)


Lesenswert?

hab leider kein oszi ;\

von Kall H. (kned)


Lesenswert?

hmm .. bischen komisch

mit dem QT:

         setup_adc_ports(ALL_ANALOG);
         setup_adc(ADC_CLOCK_INTERNAL );
         set_adc_channel( 0 );
         delay_us(20);
         value=0;
         for(i=0;i<64;i++) {
            value += read_adc();
         }
         value/=64;
         setup_adc( ADC_OFF );

         value=((value*33)/10)>>2;
         value*=4;

         printf("%Ld \n\r", value);
         delay_ms(500);

(64 messungen und letzten 2 bits weggeschmissen)

gibts einigermaßen gute werte...

2,372 V
2,384 V
2,372 V
2,376 V

aber da muss doch mehr gehen ><

von Olli R. (xenusion)


Lesenswert?

Kein Oszi, und da nimmst Du Dir so ein Projekt vor?

Abgesehen davon, das Ganze ist sowieso akademisch, da Du die "Funke" - 
sollte sie irgendwann funktionieren - ohnehin nie in Betrieb nehmen 
darfst.

von Mätte (Gast)


Lesenswert?

wieso willst du für ein ferngesteuertes Auto das Poti genauer 10mV 
auslesen, brauchts das so genau ?

von Master S. (snowman)


Lesenswert?

vielleicht liegts auch einfach daran, dass du den PIC ausserhalb der 
spezifikation betreibst:
PIC16F877  braucht 5.0V
PIC16LF877 kannst du mit weniger betreiben (glaub so bis 2V)

ps: digitale "Funke" (ich nehme an, damit meinst du fernsteuerungen), 
senden das signal für die servos eben digital und nicht analog. was du 
das machen willst - soweit ich verstanden habe - ist die poti-stellung 
mit dem PIC auslesen und dann wie versenden? der empfänger müsste dann 
auch ein digitaler empfänger sein, oder hat dein auto noch einen 
analogen?

von Kall H. (kned)


Lesenswert?

soo .. stimmt schon, die 10mv genauigkeit reichen eigentlich vollkommen.
nachdem ich heute morgen den vorwiderstand etwas modifiziert hatte war 
der spannungsunterschied zwischen min und max stellung größer 
ausgefallen als erwartet

ich werfe jetzt die letzten 3 bits weg und komm damit auf eine 
genauigkeit von 100 LSB von min zu max, wenn sich ne fliege auf den 
knüppel setzt zeigt er 1 an O.O xD

zum funken werde ich die zigbit amp 2.4 ghz von meshnetics benutzen die 
vor mir liegen 8)  - die haben mit 10mW ausreichende reichweite

später kommt noch ein S65 lcd dran und das ding ist besser als die 
meisten gekauften xD

von morph (Gast)


Lesenswert?

was ähnliches hab ich meiner funke spendiert, allerdings nur ein 
RFM12B868 für einen rückkanal vom modell :)

solange man den HF-teil fertig nimmt seh ich kein problem beim betrieb

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.