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...
man muss nach dem umschalten eine gewisse zeit warten bevor man wieder messen darf, berücksichtigst du die?
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.
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
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.
wenn du übrigens soviel zeit hast, dann schau mal beim begriff "oversampling" nach, das is auch ne gute sache :)
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
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
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... :-)
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.