Moin zusammen, ich bastel gerade an der Ansteuerung eines sensorlosen BLDC-Motors mit drei Phasen. Probleme habe ich aber teilweise bei der Nutzung des ADC. Die Kommutierung des Motors läuft beim sensorlosen Motor ja mit Hilfe der BEMF. Zur Erkennung des Kommutierungszeitpunktes wird der Komperator genutzt. Die drei Motorphasen sind an ADC0, ADC1 & ADC2 angeschlossen. Die Motormittelpunktspannung hängt an AIN0. Über den MUXer wird immer die gerade freifliegende Phase mit AIN0 verglichen und dann der Komperator Interrupt ausgelöst. Das klappt auch. An ADC3 habe ich ein Poti angeschlossen (das dient als "Gaspedal") und an ADC4 mache ich eine Strommessung. Weiteres kommmt noch. Um den ADC zu nutzen, muss ich den Komperator Interrupt ausschalten, fix ADC3 oder ADC4 messen, dann den Interrupt wieder einschalten. Damit die ADC-Messung schnell genug läuft und ich alle Kommutierungen mitbekomme, ist der ADC ein wenig übertaktet und läuft mit 250 kHz. Das Datenblatt empfiehlt max. 200 kHz, mehr soll zu Lasten der Genauigkeit gehen, was aber für mich erstmal nicht so relevant ist. Zusätzlich habe ich einen Drehzahlbegrenzer in der SW eingebaut, damit es keine Zeitprobleme gibt. Der Motor wird über PWM und das "Gaspedal" gesteuert. 5V an ADC3 entsprechen 0% PWM, 0V bedeuten 100% PWM. Bei ca. 2,5V, also 50% PWM, läuft der Motor in den Drehzahlbegrenzer. Wenn ich jetzt weiter Gas gebe, also die Spannung über das Poti an ADC3 von 2,5 V nach 0V drehe, hat das keinen weiter Einfluss auf das Tastverhältnis am Motor, da der Drehzahlbegrenzer eingreift. Jetzt kommt endlich das eigentliche Problem... ;) Merkwürdigerweise beeinflusst das Poti anscheinend die Eingänge ADC0, ADC1 & ADC2, wenn an ADC3 etwa 0V anliegen. Die Kommutierungen werden nicht mehr erkannt und der Motor stoppt. Da ich mir das nicht erklären kann, habe ich ein zweites Poti an ADC5 angeschlossen und das als Gaspedal genutzt. Das funktioniert, solange nicht ADC3 und ADC5 nahe 0V sind. Dann stoppt der Motor wieder. Wenn nur ADC3 oder ADC5 auf 0V sind, merkt man allerdings schon einen Einfluss auf den Motorlauf. Auch ein Austausch des µC bringt keine Änderung. Hat jemand eine Idee, wieso die Spannungspegel an ADC-Pins, die nicht mal zwingend in der SW genutzt werden einen Einfluss auf ADC0-ADC2 hat? Mir gehen langsam die Ideen aus...
Hallo, beim Wechsel einen analogen Eingangs muss man den ersten Messwert verwerfen.
Ja, das habe ich auch gelesen. Die Messwerte, die ich bekomme, scheinen aber halbwegs zu passen. So genau müssen die auch nicht sein. Beeinflusst das auch den Komperator? Dabei wird ja eigentlich keine Ad-Wandlung gemacht, oder?
Schaltplan? Ich kann mir aus dem Text nur schwer vorstellen wie das verschaltet ist. Grundsätzlich gibt es durch den Multiplexer beim Umschalten ein Übersprechen, weil ja die Kapazität hinter dem Multiplexer erst aus einem Eingang geladen wird, und dann aus einem anderen. Wieviel Strom dabei fließt, hängt eben von der Spannung an den anderen Eingängen ab. Frage an den Schaltplan wäre daher, ob die Eingänge entsprechend niederimpedant beschaltet sind oder z.B. über hochohmige Spannungsteiler.
Veit D. schrieb: > beim Wechsel einen analogen Eingangs muss man den ersten Messwert > verwerfen. Äh. Nein. Der MUX kann nach Belieben verstellt werden, der erste Messwert danach ist gültig. Nur der erste Wert nach Ändern der Referenz-Spannung sollte verworfen werden. > 23.5.2 ADC Voltage Reference > The first ADC conversion result after switching reference voltage > source may be inaccurate, and the user is advised to discard this result. http://ww1.microchip.com/downloads/en/DeviceDoc/Atmel-7810-Automotive-Microcontrollers-ATmega328P_Datasheet.pdf Hier noch ein paar Links, die über Übersprechen bei den AD-Kanälen sprechen: https://www.avrfreaks.net/forum/adc-crosstalk https://www.microchip.com/forums/m301748.aspx Ansonsten ist eventuell auch die Außenbeschaltung nicht störunempfindlich genug und verursacht ein Übersprechen.
> Schaltplan?
!!
Auch wäre eine Reduktion des Problems auf ein sagen wir zwanzigzeiliges
Programm sinnvoll - eine ganze Seite freier Text schreckt eher ab. Ganz
abgesehen davon, dass man während einer solchen Reduktion oft selbst
einiges entdeckt.
So wie der text sich liest, hast Du die China-Standard-BLDC-Controller Schaltung aufgebaut. Hoffentlich nicht auf einem Breadboard? Zeig mal die Schaltung und ein Bild vom Aufbau. Ich kann Dir nur empfehlen, Dir für 5€ einen fertigen Controller zu kaufen, und darauf Deine SW zu flashen. Dann weißt Du, dass Deine HW ok ist. So habe ich auch mal angefangen ... später, wenn Deine SW einigermaßen läuft, machst Du dann Deine eigene HW.
Beitrag #6028804 wurde vom Autor gelöscht.
Veit D. schrieb: > beim Wechsel einen analogen Eingangs muss man den ersten Messwert > verwerfen. Wenn das nötig ist, dann stimmt etwas mit der Schaltung nicht (Quelle und/oder Referenz zu hochohmig). Oder das Programm ist Scheisse (ADMUX wird nicht im richtigen Moment im Messzyklus gesetzt). Oder gar beides in Tateinheit. In meinen Schaltungen (und das sind inzwischen eine ganze Menge) gibt es jedenfalls kein Problem bei der Messung mehrerer Eingänge unter Ausnutzung aller Zyklen des ADC. Der ist schon langsam genug, da kann man es sich nicht leisten, auch noch Zyklen ungenutzt zu lassen...
c-hater schrieb: > Wenn das nötig ist, dann stimmt etwas mit der Schaltung nicht Aha, dann kennt ATMEL ihre eigenen µC nicht. Interessant!
Huh? schrieb: > Aha, dann kennt ATMEL ihre eigenen µC nicht. Interessant! Wieso? Die haben niemals etwas derartiges geschrieben. Falls du anderer Ansicht bist: Quelle angeben!
Im Datenblatt des M328P steht, dass lediglich bei einem Wechsel der Referenzspannung ein Verwerfen nötig sei. In der AVR126 Application Note zum ATMega88 heißt es allerdings: > Whenever the input MUX setting or reference voltage selection is modified, > it is recommended to discard the first conversion result http://ww1.microchip.com/downloads/en/AppNotes/AN2538-ADC-of-megaAVR-in-SingleEnded-Mode-00002538A.pdf Schaden kann es also nicht...
c-hater schrieb: > Huh? schrieb: > >> Aha, dann kennt ATMEL ihre eigenen µC nicht. Interessant! > > Wieso? Die haben niemals etwas derartiges geschrieben. Falls du anderer > Ansicht bist: Quelle angeben! Nicht nur ich bin anderer Meinung, sondern auch Atmel (Beispiel aus der Appnote 2538, Seite 9):
1 | Whenever the input MUX setting or reference voltage selection is |
2 | modified, it is recommended to discard the first conversion result |
3 | |
4 | When switching to a differential channel (with gain settings), |
5 | the first conversion result may have a poor accuracy |
6 | due to the required settling time for the automatic offset |
7 | cancellation circuitry. |
8 | Thus, it is better to discard the first sample result. |
Vielen Dank schonmal an Alle für die vielen Hinweise! Die BEMF-Schaltung basiert im Prinzip auf dem Artikel über BLDC-Controller: https://www.mikrocontroller.net/articles/Datei:BLDC_BEMF_schaltung.png Das soll mal irgendwann mit 48V laufen. Daher habe 10kOhm direkt an der Motorphase verwendet und 1kOhm für alle anderen Widerstände. Die 100nF haben sich auch als bester Kompromiss erwiesen. Momentan nutze ich aber nur 15V mit einem kleinen Modellbaumotor. Könnten die 10kOhm schon zu hochohmig sein? Aufgebaut ist das Ding momentan auf einer Lochrasterplatine. Natürlich nicht so schön... Die Halbbrücken laufen mit IR2184S. Sven B. schrieb: > Schaltplan? Ich kann mir aus dem Text nur schwer vorstellen wie > das > verschaltet ist. > > Grundsätzlich gibt es durch den Multiplexer beim Umschalten ein > Übersprechen, weil ja die Kapazität hinter dem Multiplexer erst aus > einem Eingang geladen wird, und dann aus einem anderen. Wieviel Strom > dabei fließt, hängt eben von der Spannung an den anderen Eingängen ab. > > Frage an den Schaltplan wäre daher, ob die Eingänge entsprechend > niederimpedant beschaltet sind oder z.B. über hochohmige > Spannungsteiler. Gibt es dafür einen Schaltplan? Auf die Schnelle habe ich im Datenblatt nichts gefunden. Vielleicht bin ich auch nur zu blind... Ist die Kapazität hinter dem MUXer immer aktiv (also auch, wenn er nur für den Komparator genutzt wird) oder wird die nur bei der Nutzung des AD verwendet?
Huh? schrieb: > Nicht nur ich bin anderer Meinung, sondern auch Atmel (Beispiel aus der > Appnote 2538, Seite 9): > >
1 | > Whenever the input MUX setting or reference voltage selection is |
2 | > modified, it is recommended to discard the first conversion result |
3 | > |
4 | > When switching to a differential channel (with gain settings), |
5 | > the first conversion result may have a poor accuracy |
6 | > due to the required settling time for the automatic offset |
7 | > cancellation circuitry. |
8 | > Thus, it is better to discard the first sample result. |
9 | > |
Das ist ganz klar als Empfehlung(!) für all die "Entwickler" gedacht, die nicht in der Lage sind, die Impedanzen der Quellen und ihre Folgen zu berechnen... Nunja, es gibt auch Profis...
c-hater schrieb: > Nunja, es gibt auch Profis... Mal sehen, ob sich hier einer findet. Einer, der es besser weiß als der Hersteller. ;-)
Nach weiterer Forschung bin ich hierauf gestoßen: https://electronics.stackexchange.com/questions/67171/input-impedance-of-arduino-uno-analog-pins Meine Theorie: Wenn ich mein "Gaspedal" auf 0V stelle, ist die Kapazität entladen. Wenn ich dann die BEMF bestimmen will, ist mein Spannungsteiler zu hochohmig, um die Kapazität schnell genug zu laden => Kommutierungszeitpunkt wird nicht mehr korrekt bestimmt...
Deine Spannungsteiler für die Phasen sind wohl in der Größenordnung von 5-10k. Das ist niederohmig genug, da hast Du keine Probleme mit dem Umladen irgendwelche parasitärer Kapazitäten zwischen MUX und dem AC oder ADC. M.E. hast Du ein fundamentales HW-Problem auf Deiner Lochrasterplatine. Ich hatte Dir oben schon mal den Rat gegeben, einen käuflichen ESC zu nehmen, etwa die Hobby-King mit AVR oder die vom MikroCopter-Projekt mit AVR.
Wilhelm M. schrieb: > Deine Spannungsteiler für die Phasen sind wohl in der Größenordnung von > 5-10k. Das ist niederohmig genug, da hast Du keine Probleme mit dem > Umladen irgendwelche parasitärer Kapazitäten zwischen MUX und dem AC > oder ADC. Würde ich bei der Samplerate unterschreiben, das ist so in der Größenordnung 1 µA Fehler wenn man mit 100 kHz umschaltet, was bei 10k ungefähr 10 mV sind. Nicht super aber nicht dein Problem.
Vielen Dank allen für die Hilfe! Mein Problem lag in der SW bei der Initialisierung von zwei Kennlinien. Ich hatte 3 Stützstellen vorgesehen, aber dummerweise 5 initialisiert... Dabei ist wohl der Speicher durcheinander geraten. Komischerweise trat das nur auf, wenn die ADC-Pins nahe 0V waren. Sehr merkwürdig...
Jan schrieb: > Vielen Dank allen für die Hilfe! > Mein Problem lag in der SW bei der Initialisierung von zwei Kennlinien. > Ich hatte 3 Stützstellen vorgesehen, aber dummerweise 5 initialisiert... > Dabei ist wohl der Speicher durcheinander geraten. Komischerweise trat > das nur auf, wenn die ADC-Pins nahe 0V waren. Sehr merkwürdig... Nochmal ein Update: Funktioniert hat der ganze Kram mit obiger Lösung wohl nur zufällig. Später klappte es auch nicht mehr. Sicher lief es dann, wenn ich nach dem Auslesen von Werten und vor dem Umschalten auf den Komparator folgende Befehle ausgeführt habe: ADCSRA |= (1<<ADEN); ADCSRA &= ~(1<<ADEN); Alles komisch... Auch konnte ich teilweise die TCNTx nicht richtig auslesen. Ich habe bisher die Arduino IDE genutzt. Nachdem ich jetzt auf Atmel Studio 7 gewechselt habe (etwas aufwendig, aber wohl lohnenswert, wenn man ein sauberes System haben will...), sind alle komischen Sachen weg.
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.