Forum: Mikrocontroller und Digitale Elektronik Atmel 328P: ADC-Messung beeinflusst Komperator


von Jan (Gast)


Lesenswert?

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...

von Veit D. (devil-elec)


Lesenswert?

Hallo,

beim Wechsel einen analogen Eingangs muss man den ersten Messwert 
verwerfen.

von Jan (Gast)


Lesenswert?

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?

von Rosetta (Gast)


Lesenswert?

Es heißt KomArator

von Erwin D. (Gast)


Lesenswert?

Rosetta schrieb:
> Es heißt KomArator

Wieder falsch! Vielleicht klappts beim nächsten Versuch? :-D

von Sven B. (scummos)


Lesenswert?

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.

von Sebastian R. (sebastian_r569)


Lesenswert?

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.

von S. Landolt (Gast)


Lesenswert?

> 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.

von Wilhelm M. (wimalopaan)


Lesenswert?

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.
von c-hater (Gast)


Lesenswert?

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...

von Huh? (Gast)


Lesenswert?

c-hater schrieb:
> Wenn das nötig ist, dann stimmt etwas mit der Schaltung nicht

Aha, dann kennt ATMEL ihre eigenen µC nicht. Interessant!

von c-hater (Gast)


Lesenswert?

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!

von Sebastian R. (sebastian_r569)


Lesenswert?

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...

von Huh? (Gast)


Lesenswert?

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.

von Jan (Gast)


Lesenswert?

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?

von c-hater (Gast)


Lesenswert?

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...

von Huh? (Gast)


Lesenswert?

c-hater schrieb:
> Nunja, es gibt auch Profis...

Mal sehen, ob sich hier einer findet.
Einer, der es besser weiß als der Hersteller. ;-)

von Jan (Gast)


Lesenswert?

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...

von Wilhelm M. (wimalopaan)


Lesenswert?

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.

von Sven B. (scummos)


Lesenswert?

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.

von Jan (Gast)


Lesenswert?

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...

von Jan (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.