Forum: Mikrocontroller und Digitale Elektronik PIC 16F ADC1 beeinflusst ADC2 Lehrer weiß auch nicht weiter bitte um Hilfe. Code beiliegend. DANKE


von Christian K. (boehseronkel)


Angehängte Dateien:

Lesenswert?

Hallo PICfreunde.

Ich möchte für eine Projektarbeit eine BLDC Steuerung mit PIC
realisieren.
Benutze dazu 2PIC's 16F877A, einer fürs schalten der 3phasen
MOSFET-Brücke der mit dem TimingWert des anderen gefüttert wird und nur
fürs umschalten zuständig ist.
Der 2te Pic soll den Speed (TimingWert für ersten ausgabe an PortD; für
anzeige am BCD 7 Segmentdisplay Port B und E) aus der ADC1 an RA0
machen. Motor läuft, nimmt aber zu viel Strom, daher eine 2te ADC(2)an
RA1 für eine PWM erzeugung mit der die MOSFETS im 20khz Takt bei
unterschiedlicher DutyCycle gepulst werden. Funktioniert mit externer
PWM super...nun soll dies auch der PIC übernehmen.

Problem: ADC1 (SPEED) alleine geht, ADC2 PWM alleine geht
sobald beide zusammen kommen, werden keine korrekten werte ausgegeben.
PWM DCycle 0-100% geht nur wenn ADC1 FF hat, ansonsten wird PWM ca auf
50% reduziert. ADRESH nach ADC2 ist falsch müsste eigentlich ebenfalls 
FF liefern,
da beide Potis auf Endanschlag stehen...(ADC1 wird nicht mitgemacht) nur 
ein "sinnloser" Befehl wie CLRF/BSF im Zusammenhang mit ADCON reicht aus 
und nicht geht mehr.

Beim In-Cercuit Debugging geht alles (Einzelschritt und langsamer
testlauf (>>) aber im RUN-Modus (>) kein Erfolg.
Normalerweise hat eins mit dem anderen nichts zu tuen, weiß mir keinen
Rat mehr, der Lehrer leider auch nicht...

habe alles mögliche probiert, von größerer Zwischenzeit, andern Analog
Ports incl. E, anderer PIC....sobald für die ADC1 der ADCON beschrieben
wird (die mit ";" gekennzeichneten commands oberhalb
ADC1-RA0)funktioniert ADC2 nicht mehr. Habe im Quelltext die komplette
ADC1 nicht mehr mit ";" stillgelegt, wurde aber getestet.

Wäre super wenn mir jemand einen Tip geben könnte, habe leider nicht
mehr viel zeit bis zur abgabe...

von morph1 (Gast)


Lesenswert?

man muss nach dem umschalten eine gewisse zeit warten bevor man wieder 
messen darf, berücksichtigst du die?

von Jadeclaw D. (jadeclaw)


Lesenswert?

Zum einen das, zum anderen ist es auch denkbar, daß das erste 
Wandlungsergebnis nach dem Umschalten des Eingangsselektors schlicht 
Müll ist. Ich weiß nicht, wie genau das bei den PICs gelöst ist, bei 
AVR-Controllern ist es so. Da hilft dann nur umschalten, wandeln, 
wegwerfen, wandeln, nutzen.

Gruß
Jadeclaw.

von Christian K. (boehseronkel)


Lesenswert?

danke für deine schnellen antworten...
@morph1
wie meinst du das mit der zeit? die erholzeit für die ADC2 nach 1 
beträgt ca. 2ms, das sollte ausreichend genug sein... oder meinst du 
noch eine Umschalt-Erholzeit?

@jadeclaw...
was bedeutet dies konkret? ich müsste als eine schleife machen, wo die 
ADC2 zweimal nacheinander abgefragt wird und derst die zweite 
hoffentlich sinnvolle zum weiterverarbeiten nehmen???

Was ich nur nicht verstehe -rein vom Logischen- was hat eine "sinnloser" 
erster befehl mit der ADC2 zu tuen? nur weil ich den ADCON0 vorher 
schonmal aufrufe bzw ihn bearbeite spinnt die ADC2 rum???? wenn ich alle 
vorhergehenden ADCON0 commands rausnehme gehts...unverständlich

THX

von morph1 (Gast)


Lesenswert?

also:

nach einem adc-kanal-wechsel MUSS man eine pause von etlichen takten 
machen bevor man eine messung starten kann, sonst kommt müll raus, 
wielange genau steht im datenblatt, also wenn du zeit zum warten hast, 
erst umschalten, dann warten.

das mit den messungen verwerfen kommt mir grad sehr bekannt vor, kann 
aber auch sein das ich das irgendwo bei einem avr-projekt gelesen hab.

schaden kanns wohl nicht :) also einfach 2x direkt hintereinander (am 
gleichen adc-kanal) messen und nur die 2. messung werten.

von morph1 (Gast)


Lesenswert?

wenn du übrigens soviel zeit hast, dann schau mal beim begriff 
"oversampling" nach, das is auch ne gute sache :)

von Sven S. (stepp64) Benutzerseite


Lesenswert?

sprut sagt dazu:

"Wichtig, und oft vergessen: die "acqisition time"

Nach der Wahl des Eingangs wird der interne Kondensator am ADC-Eingang 
mit der am analogen Pin anliegenden Spannung geladen. Gemessen wird 
später die
Spannung in diesem Kondensator. Deshalb muß man dem PIC nun genügend 
Zeit einräumen, den Kondensator komplett auf die neue Spannung 
aufzuladen, bevor man die eigentliche Messung auslöst. Wie lange diese 
'aquisition time' dauern sollte, hängt von mehreren Parametern ab (z.B. 
vom Innenwiderstand der zu messenden Spannungsquelle). Typischerweise 
reichen 40 µs Pause aus. Wer es genau wissen will, findet in der 
Dokumentation zum PIC-Typ eine Formel zur Berechnung dieser Wartezeit."

Von einem Verwerfen der ersten Messung habe ich bei PICs bisher noch 
nichts gelesen und es auch nie so programmiert. Die acqisition time 
sollte aber beachtet werden.

Sven

von Peter D. (pdiener) Benutzerseite


Lesenswert?

Soweit ich mich erinnere ist die Taktfrequenz des ADC bei den PICs ein 
recht kritischer Parameter. Hier kann normalerweise ein interner ADC 
RC-Oszillator verwendet werden oder der CPU-Takt runtergeteilt werden. 
Wenn man den Wandler übertaktet, können solche Effekte auftreten.

Grüße,

Peter

von Christian K. (boehseronkel)


Lesenswert?

ich benutze den interen RC-Oszi für die ADC... werde das die nächsten 
Tage mal ausprobieren und hoffe das es klappt...

Vielen Dank nochmal für die zahlreichen antworten... :-)

von Christian K. (boehseronkel)


Lesenswert?

Vielen Dank für die zahlreichen Beiträge....

In der Tat, das problem konnte mit mind. 39 NOP's nach dem Wechsel von 
RA0 auf RA1 im ADCON behoben werden. Als ich dies meinem Lehrer sagte 
hat er nicht schlecht geschaut... aber man kann ja nicht alles wissen...

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.