Hallo alle zusammen
ich habe auf www.ulrichradig.de unter Homepage » AVR » AVR BLMC den
Regler für Brushless Motoren gefunden und will den nach/umbauen.
Nachdem ich die letzten 3 Tage intensiv die Tutorials zum AVR hier
gelesen habe und den Code
studiert und denke nun, dass ich halbwegs verstehe, was was macht.
Die Schaltung habe ich auf nem Breadboard nachgebaut, jedoch ohne
Steuerung per I2C.
Generell will ich den Regler umbauen, dass er per PPM (also Modellbau
Standard) geregelt werden kann, aber das komtm erst noch.
Jetzt will ich erst mal meine Schaltung testen.
Hierfür habe ich im Code den Interrupt ISR (TWI_vect) als auch das I2C
Init gelöscht und in der void main den timeout entfernt. Soweit ich das
sehe, wird die Geschwindigkeit des Reglers bzw. die PWM über die
Variable
volatile unsigned char rx_pwm = 0 geregelt, und um die Schaltung zu
testen habe ich es abgeändert in volatile unsigned char rx_pwm =
0b10000000, also Mitte des 8Bit Bereichs, um die Schaltung zu testen und
der Motor mal mittelschnell dreht.
Der neue Code sieht dementsprechend so aus
Den Code ab ich im aktuellen AVRStudio 6.2 als C Projekt erstellt und
buildet, ohne Fehler.
Dann Tools->Device Programming hab ich mein AVRDragon ausgewählt, wird
auch problemlos erkannt. Signature und Target Voltage wird ohne Probleme
ausgelesen.
Da die Schaltung von U. Radig mit 12 MHz läuft und bei ISP Clock steht
"lower than 1/4 of", habe ich hier 2,5MHz eingegeben.
Unter Oszillation calibration kann ich nur 8MHz einstellen.
Dann habe ich die Hex File ins Flash kopiert, was auch wunderbar
geklappt hat, und auch auslesbar ist.
Allerdings, wie Ihr richtig vermutet, der Motor dreht nicht :(
Ich benutz zum testen einen DIAMAND AL2730, den ich noch rumliegen hab,
und angetrieben wird das ganze mit einem 12V Bleiakku.
Aber nach dem Resetten nichts. Lediglich die P-Kanal Mosfets werden
SAUHEISS!
Meine Vermutung ist, dass ich entweder die char rx_pwm falsch
interpretiert bzw. gesetzt habe, oder ich beim rauslöschen der I2C was
falsch gemacht habe.
Kann mir jemand helfen, dass der Motor zumindest mal mit fester Drehzahl
läuft?
Danke im voraus
Morgy
Ach ja
Wenn sich jemand fragt warum ich das nich einfach debugge:
Ich arbeite zum ersten mal mit dem Dragon, und das Studio meinte, dass
dieses Board debugging nich unterstützt.
Stimmt das???
Oder hab ich da was falsch eingestellt?
Ich sach mal, schlechtes Kama...
Du möchtest, das dir jemand Code eines Dritten repariert, den du
kaputt-verändert und dann noch sinnloserweise komplett in den Beitrag
kopiert hast?
Viel Erfolg...
Oliver
Nicht jeder verwendet I2C zur Ansteuerung, und ich habe lediglich das
externe auslesen gegen einen festen Wert getauscht, ich denke das kann
man nachvollziehen, wenn man kurz drüberschaut.
Alternativ könnte man sagen, wie man ein AVRDragon zum Debuggen
verwendet.
Wenn man keine Lust hat zu helfen oder es nicht kann, wäre es nice, wenn
man einfach NIX schreibt, statt dauernd solche Kommentare.
Ich hab mir 3 Tage Mühe gegeben und Tutorials studiert, andere hauen den
Code rein und heulen "macht mal"
Der "dumme" Beitrag gibt dir aber vielleicht Hinweise, warum du keine
Hilfe bekommst.
Aber du hast recht. Früher war es hier besser. Da hätte ein
Hilfesuchender die Kritik angenommen und nicht als dumm abgetan.
Warum setzt Du micht einfach mal die Brenngeschwindigkeit runter, prüfst
das Brenne und lässt erst mal eine LED auf dem Board blinken, um zu
prüfen dass der uC richtig und mit der richtigen Geschwindigkeit (fuses
richtig gesetzt?) läuft?
Danke asdf für die Idee, mit der ich rausgefunden habe, dass der Pin 17
am uC vermutlich am Arsch ist, da die anderen 5 Ausgänge blinken, dieser
aber komplett leuchtet. Daher wird der N Kanal an U dauernd geschaltet.
@ Carsten ja aber das warum ist wohl jetzt auch gefunden.
Und danke an Schimanski, ich hab mich schon gefragt wie man das am
besten macht.
Die letzten 3 Beiträge waren einfach, hilfreich und die Autoren mussten
vermutlich nicht mal den Code anschauen dazu.
FETTES FETTES DANKE!!!
Und @ Name(Gast)
Ich hätte anders reagiert, wenn das das erste mal gewesen wäre, dass so
n Kommentar zurückkommt.
Aber ich bin seit Jahren in dem Forum und wie ich sagte, früher hat man
wesentlich mehr Kommentare im Stil der letzten 3 Beiträge erhalten, die
kurz und hilfreich sind.
Wenn ich aber in den letzten 2 Jahren um Hilfe gebeten habe, waren die
ersten 5 Beiträge IMMER unhilfreich, weil die Leute, die helfen wollen
und können, nach den Witzbolden in einen Beitrag schauen.
Ich will nicht undankbar sein, ehrlich nicht.
Aber wenn jemand nichts dazu sagen möchte, soll ers lassen.
Und wenn jemand helfen möchte, aber nicht kann, soll er nach mehr Infos
fragen.
Jedenfalls danke an die letzten 3 Beitragsersteller
Ich muß aber zugeben, daß ich bei dem Eingangsbeitrag auch fast
Augenkrebs bekommen habe. ;-)
Also mach Dir einen Knoten ins Taschentuch für die Zukunft.
Quellcode als Anhang.
Das erhöht die Übersichtlichkeit allgemein. Den Quellcode, besonders
wenn er länger ist, schaut man sich ohnehin am Besten mit anderen
Werkzeugen als einem Browser an. Also wozu erst in den Browser kopieren
um es dann in eine IDE zurück zu kopieren. Das tut sich keiner an.
Wünsche Dir noch viel Erfolg mit der Gerät ;-)
Carsten R. schrieb:> Also mach Dir einen Knoten ins Taschentuch für die Zukunft.> Quellcode als Anhang.
und wenn man schon Quellcode in den Post schreiben will, darf man auch
gerne die richtigen Tags verwenden, wie sie in der Überschrift des
Textfeldes beschrieben werden - das sieht einfach besser / leserlicher
aus.
ich wäre weiter gegangen und hätte alle relevanten Dateien des Projekts
gezippt und angehangen. Dann mus man sich nicht mit fehlenden Includes
oder so rumärgern.
BTT:
ist denn nun alles In Ordnung, nachdem Du feststellen musstest, das dein
IC im Eimer ist, hast Du sicher einen neuen eingelötet? gehts denn nun?
Da ja der TO anscheinend vollständig auf selber denken verzichtet, dann
doch noch ein Hinweis in Form einer Frage:
WARUM ist der Pin kaputtgegangen?
(Wenn er denn überhaupt kaputt ist)
Oliver
@oliver
what the .... hab ich dir getan???
ich hab nur gesagt dass ich auf solche kommentare dankend verzichten
kann,
da sie NULL zum erfolg beitragen, da wird mir wohl JEDER recht geben
Einen neuen IC hab ich eingelötet ja und dank den LEDs hab ich auch noch
einen kaputten NPN gefunden.
Jedoch rauchen mir nach wie vor die p Kanäler ab.
Ich werde allerdings hier nicht rum heulen "macht mal", genauso wenig
wie ich nicht von anfang an gefragt hab " kann mir mal wer erklären was
der Code macht"
Ich hab versucht soweit wie möglich allein voran zu kommen und werd das
jetzt auch machen.
Im Vergleich zu den meisten Forennutzern (nicht nur dieses Forum) finde
ich bin ich relativ unfaul, warum das bei manchen nicht auf Anklang
findet ist mir ein Rätsel.
Wie gesagt dank den LED bin ich gut voran gekommen und weiss jetzt auch
was falsch ist.
Mir hat ein langjähriger Elektrotechniker, vermutlich im Halbschlaf, auf
Anfrage nach P-Kanal-Mosfets eine Ladung IRF540PBF ausgehändigt.
Nachdem ich nun die Datenblätter konsultiert habe, weiss ich warum die
immer abrauchen...
Werd jetzt neue P-Kanäler holen und mich melden
Soooo ok hab jetzt richtige P-Kanal Mosfets
Jetzt raucht nix und die LED an den Gates blinken bunt.
An den Ausgängen der Brücken mess ich aber konstant 12V und der Motor
dreht nicht. Wenn ich an den U,V,W Ausgängen LEDs gegen VCC schalte,
müsste ich ja, wenn die N-Kanal Mosfet gegen Masse schalten, die LED
blinken sehen, aber sie bleiben dunkel. Daher vermute ich, dass die
N-Kanaler nicht schalten. An Gate kommt ja Spannung an(LED gegen Masse
blinkt wunderschön) und an Drain is Masse, wenn er schaltet sollte sich
ja was tun.
Wenn ich btw eine Phase des Motors direkt auf GND leg gibts Action, also
die P Mosfets schalten wie geplant.
Laut Original Schaltplan werden IRFR1205 verwendet, ich habe aber
momentan P55NF in Verwendung, sind ja auch locker bei 12V betreibbar und
haben sogar eine geringere Kapazität zum Schalten, sprich der
Vorwiderstand von 33 Ohm sollte unproblematisch sein, aber kein
Schalten.
Spasshalber hab ich auch mal die IRF540PBF (sind ja N Kanal) getestet,
die brauchen aber mehr Ladung zum Schalten und bin deshalb auf 27 Ohm
runtergegangen, aber auch da keine Reaktion.
Ums zusammenzufassen:
Am Mosfet kommt ein Rechtecksignal vom AVR über 33 / 27 Ohm ans Gate, an
Source liegt Masse, aber an Drain kommt nix an.
Hat wer ne Idee was da los sein könnte?
Schalten die Fets denn, wenn Du sie manuell mit Spannung versorgst?
Ist der Schaltplan, abgesehen von den anderen Fets, 100 % identisch mit
dem Original?
Also wenn ich mit dem 33 Ohm am Gate auf Vcc geh passiert gar nix, was
mich wundert weils ja a) Gleichspannung ist und b) nagelneue N Kanal
Mosfets sind.
Der Schaltplan unterscheidet sich nur in 2 Dingen 1. Die Widerstände an
SCK und SDL fehlen und die Pins sind unbelegt und 2. ich hab den DIP
Atmega328 genommen und die Pins entsprechend getauscht, da SMD aufm
breadboard immer doof ist.
Und wie erwähnt halt andere Mosfets mit niedrigerer Eingangskapazität
Wenn zwischen VCC und dem Source des Fets wirklich Spannung anliegt
müßte er schalten, es sei denn er ist irgendwie seltsam angeschlossen
oder alle sind defekt (unwahrscheinlich).
Du hast ja schon Vcc gegen Gnd getestet. War das beim Source des N-Fets
oder an einer anderen Stelle abgegriffen?
Tja vieleicht haben dir die Dauerleitenden P-Kanäler halt die N-Kanäler
kaputtgemacht, denn wo ist denn der Strom Langgeflossen, wenn nicht über
die N-Kanäler?!
Wenn die FETs bei aktiviertem Gate nicht niederohmig werden sind sie
entweder nicht korrekt angeschlossen (verkehrt oder gar nicht, z.B.
schlecht gelötet, schlechter Kontakt, Leitung unterbrochen) oder defekt.
Letztere ist aber etwas merkwürdig. Ich hätte bei mehreren defekten Fets
angenommen, daß wenigstens einer davon dauerleitend wird und nicht alle
dauerhaft hochohmig sind.
Mein Vorschlag wäre:
Einen Fet auszubauen und separat zu testen.
OK Leute
gute Nachrichten
Motor dreht sich nach Austausch sämtlicher FETs, Transistoren und eines
verbratenen Widerstandes.
Jetzt liegts an der Software
Ich sag schon ma grosses Danke und ich meld mich wenns Probleme gibt
greetz
Björn
OK schon gehts los xD
Ich will den Regler ja umbauen auf PPM Regelung.
Geplant war, am ICP das Signal anzulegen, und bei Zustandsänderung den
Timerwert zu speichern und den grösseren vom kleineren suptrahieren.
Jetzt stellt sich mir nur die Frage, welcher Timer? Timer0, Timer1 und
Timer2 sind ja schon in Verwendung, 0 und 2 für die PWM der Ausgänge und
Timer1 für den Anlauf bzw Signalverlust. Beide werden mit prescaler = 1
und Modus 3 also von 0...255 betrieben, macht bei 12MHz meiner Rechnung
nach 12000000/255= 47kHz und ne Laufzeit von 0,02ms. Da das PPM Signal
aber zwischen 1 und 2 ms lang ist, läuft mir der Timer in der Zeit ja
50-100 mal über und die gespeicherten Werte sind schrott.
Kann ich den Timer1B mit einem anderen Prescaler verwenden als Timer1A?
Oder wäre es besser, für den Anlauf Timer2B zu verwenden und Timer1 für
die PPM Erkennung?
"Bau" dir doch deinen eigenen Soft-timer. Benutze den Überlaufinterrupt
einer der schnellen Timer zusätzlich um eine Variable hochzuzählen.
Diese Variable bildet dann das Herzstück deins Soft-Timers. Der braucht
dann halt etwas Rechenzeit. Aber da er langsam "tickt", ist das nicht
sooo das Problem.
Nun benutzt du entweder andere Interrupts, z.B.Pin Change für dein
Eingangssignal sofern die passenden Pins frei (zu bekommen) sind
(Schaltplan?), die sich mit dem Soft-Timer abgleichen, oder emulierst
Hardwarefunktionen des Soft-Timers beim Hochzählen, bzw. kombinierst
beides.
Der Soft-Timer ist natürlich langsamer im Takt. Das begrentzt deine
Meßgenauigkeit ein wenig. Bei Bedarf ließe sich das eventuell teilweise
dadurch beheben, daß man beim Capture auch lesend auf den Hardwaretimer
zugreift und somit die Soft-Ticks wieder feiner auflöst. Diese
Möglichkeit ist aber nicht immer so einfach gegeben. Dazu bedarf es
eines Hardwareinterrups zwischen den Soft-Ticks.
Ich hab spasshalber mal versucht, die Geschwindigkeit über ein Poti zu
regeln.
Ich hab also zwischen 5V und GND ein 100k Poti angeschlossen und den
Abgriff an Pin 28 (ADC5)
ADC hab ich meines Wissens nach aktiviert mit
ADCSRB |= (1<<ACME);
ADCSRA |= (1<<ADEN);
DIDR1 |= (1<<AIN0D);
ACSR |= (1<<ACIE);
ADMUX |= (1<<ADLAR);
Wobei die 1., 3. und 4. Zeile vom Originalcode sind und nur wichtig für
die Rückkommutierung
Auslesen tu ich dann die Variable ADCH, aber die ist unabhängig von der
Potistellung immer 5.
Auch ein Setzen des Multiplexers
ADMUX = 5;
hilft nichts.
Hat jemand kurz ne Idee?
Soll generell Übung sein bevors an PPM geht.
Poti richtig angeschlossen? Ausgangsspannung des Potis mit eimen
Multimeter Prüfen.
Zum Code:
Es zählt nicht nur das Fragment, sondern wie dieses in den bestehenden
Code eingebunden ist und auch wo. Du hast nur einen ADC. Und der der
Teilt sich den Multiplexer mit dem Comparator. Der Multiplexer schaltet
den Comparator mit den Phasen der Ausgangsstufe synchronisiert auf die
freilaufende Phase. Wenn Du da den ADC zwischendurch nutzen willst mußt
Du das mit dem Rest des Codes abstimmen.
Aus dem Handbuch des Atmega48/88/168
"It is possible to select any of the ADC7..0 pins to replace the
negative input to the Analog Comparator.
The ADC multiplexer is used to select this input, and consequently, the
ADC must be
switched off to utilize this feature."
Und genau das macht der Regler, da er die Phasen abwechselnd überwacht.
Für das Umschalten benötigt er den Multiplexer.
Poti is richtig angeschlossen und mit MM geprüft.
In der void main wollte ich ja mit ADMUX = 5 umschalten, dass er den PIN
5 analog einliesst.
Aber wenn er gegen AIN prüft und nicht gegen Masse (so hab ichs
verstanden) hab ich ja das Problem dass, solang der Motor dreht und die
Flanken auswertet, dort immer eine Spannung anliegen wird, die des
Sternpunktes oder?
Wie lang braucht den der ADC bis er einen Wert ermittelt?
Wäre es möglich, den Bezugspunkt kurzfristig in der void main auf Masse
zu setzen, den Analogwert einzulesen, und dann wieder auf
Flankenerkennung zu setzen?
Oder ist der zu langsam dafür?
Bei einem Motor mit (Beispiel) 1800 rpm dauert eine Umdrehung 1/30s und
es wird 6 mal umgeschaltet, sprich zwischen den Schaltschritten liegen
5,5ms. Wenn ich direkt nachdem der commutation state geändert wurde den
Analogwert einlese, müsste es doch gehen oder?
Morgy schrieb:> die des> Sternpunktes oder?
Sternpunkt zuzüglich BEMF an der freilaufenden Spule.
Morgy schrieb:> Wie lang braucht den der ADC bis er einen Wert ermittelt?
Steht im Datenblatt. Es wird Zeit daß du Dich selbst mal damit gründlich
befaßt, auch oder gerade weil es eine ziemliche Lektüre ist. Wenn Du dir
alles vorkauen läßt wird das nichts mit dem Lerneffekt bzw. dann kannst
Du dir auch ein Gerät kaufen.
Morgy schrieb:> Bei einem Motor mit (Beispiel) 1800 rpm dauert eine Umdrehung 1/30s und> es wird 6 mal umgeschaltet,
Das hängt von der Bauart der Motors ab (siehe Polpaarzahl). Pro
Umdrehung können mehrere vollständige Kommutierungszyklen erforderlich
sein.
Klar die Frage war generell ob man zwischen den Schritten den Modus
umschalten kann oder ob der Modus nur einmalig gesetzt werden kann.
Und vorgekaut hab ich ja noch nix bekommen ^^
OK ich mach mir mal Gedanken wie man das zwischenrein setzt
CU Later
Von der Programlogik wäre es am Einfachsten:
Der Komparatorinterrupt wechselt auch den Kanal. Stattdessen kannst Du
da die ADC-Messung veranlassen und beim ADC-Interrupt wieder Auf
Komparator und den korrekten Kanal zurückschalten. Aber ob die Zeit
reicht hängt vom Motor bzw seiner Drehzahl ab.
Allerdings sind da einige Details zu bachten bei der Umschalterei. Dazu
mußt du die entsprechenden Kapitel im Datenblatt durchkauen.
Bei jedem Overflow des Timer2 wird die Variable "softtimer" hochgezählt.
Da Timer2 kein Prescaler hat und bis 255 zählt, ist die Frequenz meines
Softtimers 12MHz / 255 = 47,058 kHz.
Am INT0 leg ich jetzt mein Signal an, der INT0 Interrupt wird so
justiert, dass sowohl steigende als auch fallende Flanken erkannt
werden. Bei steigender Flanke wird der Softtimer resettet, bei fallender
Flanke wird die Periodendauer berechnet. Da der Softtimer in 1ms von 0
auf 47 zählt, rechne ich lediglich die Variable "softtimer" / 47.
Jetzt hab ich nur das Problem, dass meine ISR ja so wie sie da steht
nicht weiss, ob die Flanke steigend oder fallend ist. Es wird lediglich
die Variable "messung" jeweils gesetzt oder auch nicht, wodurch es aber
auch möglich wäre, dass die LOW Phasendauer gemessen wird.
Mein Gedanke wäre jetzt, den INT0 Interrupt am Programmstart so zu
initialisieren, dass er nur auf fallende Flanken reagiert, und dann,
sobald eine fallende Flanke gekommen ist, bei der ISR den Modus
umzustellen. Dadurch wäre sichergestellt, dass nur die HIGH Phase
gemessen wird.
Jetzt wäre aber meine Frage, ob das auch einfacher geht (z.B. ob es
einen Befehl in der ISR gibt,case oder so, der erkennt, ob es eine
steigende/fallende Flanke ist? Oder gibt es verschiedene ISR für den
INT0 für jeweils steigende und fallende Flanken?
Ausserdem die Frage:
Laut Wikipedia und mehreren Modellbauseiten wird bei der Ansteuerung
eines Servos die HIGH Flanke ausgewertet.
Letzt hat mir jedoch jemand gesagt, dass beim Regler die LOW Phase
gemessen wird.
Ist da was dran?
Gruss
Björn
> Jetzt hab ich nur das Problem, dass meine ISR ja so wie sie da steht> nicht weiss, ob die Flanke steigend oder fallend ist.
Was hindert dich denn daran in der ISR nachzugucken was für ein Pegel am
INT0 Pin anliegt, wenn 1 im PIN Register stehet muß ja wohl ne steigende
Flanke den IRQ ausgelöst haben.
Also
Jetzt funzt alles, Motor rennt und PPM Steuerung auch
Aufm Breadboard konnt ich auch super proggen/debuggen, wenn ich per
debugwire reingeh
Jetzt hab ich ne Platine geätzt und alles aufgelötet, geht auch, aber
ich kann jetzt weder auf den AtMEGA schreiben noch debuggen.
Dass bei debugwire der Kondensator am Reset zwingend raus muss, weiss
ich, aber kann es auch sein, dass der beim normalen ISP stört?