www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik 1Q Endstufe für Inenn=30A


Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

vielleicht kann mir einer von euch einen Tip geben, wo ich einen
fertigen Schaltungsentwurf für folgende Anwendung finde:

Ich wíll eine Endstufe für einen 12V DC Motor (1Q PWM) bauen, womit ich
den Motor in unterschiedlichen Drehzahlen fahren kann. Dabei möchte ich
weiter, dass ich (z.b. mittels Poti) eine Pendeln zwischen verschiedenen
Geschwindigkeiten erreiche.
Ich stelle mir das etwa so vor:
1 POti für die Maximalgeschwindigkeit (Ueff=0..12V)
1 Poti für die Minimalgeschwindigkeit
1 POti für die Zeit zwischen dem Pendeln von langsam nach schnell
1 weiters Poti, daß kurzzeitig zufällige Pulse bis zur doppelten
Maximalgeschwindigkeit einstellt.

Das ganze hat folgenden Hintergrund. Bin begeisteter Boots Angler. Habe
mir einen 50A DC Motor für meine kleines Angelboot gekauft. Ich mache
viel Schleppfischen, das heißt künstliche Ködern hinterm Boot ziehen.
Hierbei ist mir aufgefallen, daß ich die besten Fangergebnisse erziele,
wenn ich die Geschwindigkeit ständig variiere. Hierzu muss ich dann
ständig zwischen den Fahrstufen 1..3 umschalten.
Kurze Pulse mit bis zu 50A (Fahrstufe 5) sind dabei auch oft
erfolgreich. Der Köder ändert dadurch ständig seine Geschwindigkeit und
Tiefe.

Habe mir selber schon eine kleine SChaltung mit einer 1Q PWM und
mehreren OP's überlegt.
Das ganze ist jedoch analog. Vielleicht wäre ein uP oder kleines
CPLD/FPGA besser?
Das ganze muß an 12V Versorgungsspannung laufen.
Freue mich über Tips eurerseits.
Eine 1Q Endstufe bis 30A kostet bei Conrad bereits über 200€.


Grüße
Daniel

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tiny15 -> TLP250 -> IRFR064N -> MOtOr.

Freilaufdiode nicht vergessen.
Ich hatte mir mal eine Schaltung ausgedacht. Da Du "nur" mit 12Volt
arbeitest, kannst Du auf dicke MOSFETs zurückgreifen.

http://www.mikrocontroller.net/forum/read-1-194331...

AxelR.

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sehr kompetetente Antwort. Danke


warum selbermachen wenns schon was gibt...

Danke

Autor: Daniel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Alex,

sieht erstmal einfach aus.
Hab da aber noch n paar Fragen. Habe (außer auf der Uni) noch nicht
viel mit uP gemacht. Mein Fachgebiet sind FPGA's derzeit.

Was benötige ich um den Tiny15 zu programmieren? Sind die Tools frei?
Welchen Adapter brauche ich?
Geht die Programmierung in C oder Assembler?
Wenn Assembler, gibt es fertige Codebeispiele für das Mappen von AD,
PWM etc..?

Freue mich über weitere Tips und Links.
Werde mir gleich ein paar der Bister bestellen.


Danke Daniel.

Autor: Axel R. (axelr) Flattr this
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Tiny15 war jetzt nur so ein Vorschlag.
ich würde es wahrscheinlich mit einem Mega48 im DIL gehäuse auf
Lochraster aufbauen. Dann kommt man überall besser ran, wenn man ändern
muss. In diesem Fall lieber etwas größer bauen!

Wie Du im "Gokart" Thread sehen kannst, habe ich den Tiny15 in
Assembler programmiert. Die Tools sind alle frei. Den
Programmieradapter hatte ich mir mal "geleistet". Ist in meinem Fall
ein STK500. Heir gibt es sicher auch div. Anleitungen im Netz, wie man
sowas selbser stricken kann. Da ich mit dem STK500 zufrieden bin, habe
ich mich nicht um Alternativen gekümmert.

Vlt. kann Dir jemand anderes hier aus dem Forum einen Hinweis geben,
wie das mit PonyProg funktioniert.

Die paar Assembler Befehle sind von der Logik her sehr schnell zu einem
Gesamtgerüst zusammengestrickt. Konsequente Nutzung des Datenblatts des
jeweiligen Controllers und natürlich etwas Erfahrung vorausgesetzt.

Das ganze läuft am besten Interruptgesteuert:
alle paar Millisekunden den ADC anschubsen. Der ADC "meldet sich" mit
einem Interrupt, wenn er fertig gewandelt hat. man kann die 10Bit gleich
auf 8Bit "abrunden" und den Wert etweder direkt der PWM Section
zuweisen (am einfachsten), oder den aktuellen Stand der PWM auslesen
und mit dem Vorgabewert aus dem ADC vergleichen und langsam an diesen
heranfahren. Da der Motorpower nicht linear mit dem aktuell
vorliegenden Dutycycle steigt, habe ich mir eine kleine Tabelle im
Flash angelget, über dessen Index dem Motor im unteren Bereich mehr
Leistung zugewiesen wird, als im oberen Bereich. Muss man
ausprobieren.
Da Du in deinem Fall mehr als nur ein Poti anschliessen willst, musst
Du noch zusätzlich nach jeder Wandlung wissen, welches Poti gerade
abgefragt wurde, den Wert entsprechend weglegen und einen Kanal weiter
schalten. Der AVR hat nur einen AD Wandler. Die Eingänge werden über
einen integrierten Multiplexer umgeschaltet.
Ich habe mir gerade nochmal meinen Quelltext vom Tiny15 angesehen und
festgestellt, das die KOmmentare etwas spärlich ausfielen. Hat sich
zwar niemand beschwert - aber naja...
http://www.mikrocontroller.net/forum/read-1-194331...

Du brauchst also 3Potis:
1.Poti Geschwindigkeit
2.Poti Wobbelhub Geschwindigkeit
3.Poti Wobblefrequenz des Wobbelhubs

Hmm: denk ich mal drüber nach.

Du kannst das ganze natürllich auch in "C" programmieren. Habe ich
mich in letzter Zeit auch mit angefreundet. Ist dann etwas flexibler,
wenn man später den Controller wechselt und es kann auch mal jemand
anders draufsehen - machmal sehr hilfreich.
Hat bei mir allerdings etwas gedauert, mich mit dem Makefile und der
WinAVR installation zu beschäftigen.

Hier haben sicher noch viele Leute tolle Ideen, wie man das am besten
umsetzt.

Viele Grüße
AxelR.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also bei einem Tiny15 mit seinem 1KB entsprechend 512 Befehlen kann ich
nur zur puren Assemblerprogrammierung raten. Zumal das Teil kein RAM
hat.

Ich hab mit dem Ding mal einen 1Q-RC-Motorsteller gebaut - war hartes
Brot, aber möglich. Die Amperes der Endstufe sind übrigens kein Thema,
es sei denn, die sollen noch überwacht werden.

Gruß
Johannes

Autor: Axel R. (axelr) Flattr this
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe das mal grob geschnitzt.
Bin eigentlich Hardwaremensch, in C habe ich auch erst das eine oder
andere zusamengetippt, der eine oder andere möge bitte mal drüber gehen
und verbessern - danke!

Du hast drei Potis.
1. Maximale Geschwindigkeit (ADC0)
2. Minimale Geschwindigkeit (ADC1)
3. Geschwindigkeit des Auf-und Abfahrens zwischen diesen beiden.(ADC2)

Steht das 3.Poti auf Null, fährt der Motor NICHT auf und ab, Du kannst
Ihn mit dem ersten Poti reglen. Hier werden 64 Fahrstufen aus dem Flash
gelesen und die aktuelle Motorgeschwindigkeit fährt an die jeweilige
Vorgabe heran. Die Auslesegeschwindigkeit hängt wieder vom Timer0 ab.
Der Reload steht bei werten kleiner 10 fest auf 10.
Prescaler usw. muss man testen, wie es sich in Real verhält.
Aber vom Ablauf sollte das so gehen.
Quelltext im Anhang.

+++
Size after:
AVR Memory Usage
----------------
Device: atmega168

Program:     638 bytes (3.9% Full)
(.text + .data + .bootloader)

Data:         16 bytes (1.6% Full)
(.data + .bss + .noinit)
+++

Da wäre auch was kleineres gegangen, hatte jetzt aber nur einen 168er
hier...

Um Kommentar wird gebeten - ist zwar hier weder die GCC-Runde, noch die
Codesammlung, aber ich will ja hier bei dem Spass schliesslich noch was
lernen.
Ich brauch sowas in der Art nächte Woche sicher auffa Arbeit.

Gruß

AxelR.

Autor: Johannes (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Axel,
also ich bin auch eigentlich Hardwaremensch, und deshalb: Warum so
kompliziert, wenn es auch einfach geht...
In diesem Fall: Wozu die vielen Stufenwerte im Flash, mit dem ganzen
Gedöns drumherum?

Nimm doch einfach zwei Variablen - die eine mit dem Zielwert, und die
andere für die Annäherung in irgendeiner Stufung, die zu Deinem Timing
passt und pro Timer-Intervall in Richtung Zielwert um einen jeweils
angemessenen Betrag hoch- oder heruntergezählt wird und den jeweiligen
PWM-Wert darstellt.

Der Timer bestimmt dann die Rampenanstiegs- oder
-abfallgeschwindigkeit, und wenn sich der Zielwert zwischendurch
ändert, ist das auch nicht weiter tragisch.

In C formuliert, liest sich das etwa so:

if (timer_fuer_ausgabe_abgelaufen)
{
 if (zielwert >= aktuellerwert)
 {
  aktuellerwert += stufung_hoch;
  if (aktuellerwert > zielwert) aktuellerwert = zielwert);
 }
 else /* zielwert < aktuellerwert */
 {
  aktuellerwert -= stufung_runter;
  if (aktuellerwert < zielwert) aktuellerwert = zielwert);
 }
 ausgabe = aktuellerwert;
}

und fertig aus. Wenigstens dieser Teil des Programms.

Was brauchst Du sonst noch?

Gruß Johannes

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.