Hallo,
Ich bin gerade dabei eine Drehzahlregelung für einen DC Getriebemotor zu
enwickeln. Die Drehzahlregelung soll über den Laststrom vom DC Motor
laufen. Als Motortreiber werde ich einen L298N Treiber verwenden. Ich
habe im Datenblatt gelesen, dass man hier direkt über einen Widerstand
auf Masse den Laststrom vom Motor messen kann. Ich möchte nun diesen
Strom(Spannung) mit einem Atmega32 über einen ADC Channel messen und
dann dementsprechend das PWM Signal für den L298N nachregeln.
Nun zu meinem eigentlichen Problem:
Ich dachte mir, ich löse immer einen Interrupt aus wenn die ADC
Conversion von diesem ADC Channel fertig ist und lese dann den Wert vom
Kanal ein.
Da sich der Laststrom ständig ändern wird und ich ein möglichst gutes
Ergebnis vom Regler erzielen möchte, denke ich das der Weg über den
Interrupt der bessere ist. (andere Möglichkeit wäre zB immer nach einer
bestimmten Zeit den ADC Wert zu lesen)
Es ist aber so dass ich später vermutlich für irgendwelche anderen
Sensorsignale auch noch ADC Werte einlesen möchte, die aber nicht so
hochprior sind wie das Signal des aktuellen Laststromes vom DC Motor.
ich bin mir jetzt nicht sicher wie ich das einlesen mehrerer ADC Signal
sinnvoll implementieren soll. Der Interrupt wird ja immer ausgeführt
wenn eine ADC Conversion fertig ist, egal von welchem Kanal.
Ist das richtig oder hab ich hier etwas falsch verstanden?
Ich möchte jetzt nur den Kanal der den Laststrom misst Interrupt
gesteuert einlesen und zB alle anderen Signale im 5ms Zeitraster
einlesen.
Im datenblatt habe ich vom "Free running mode" oder "Auto triggered
mode" gelesen aber für scheinen diese Ansätze nicht wirklich die
richtigen zu sein.
Hat hier jemand eine Vorschlag wie ich dieses Problem am sinnvollsten
lösen kann oder welchen Ansatz ich verfolgen soll?
Kann ich einen Interrupt "ADC Conversion complete" auch nur für einen
bestimmten ADC Kanal auslösen lassen? wenn ja wäre mein Problem ja
eigentlich gelöst :-)
vielen Dank schom im Voraus!
> Kann ich einen Interrupt "ADC Conversion complete" auch nur> für einen bestimmten ADC Kanal auslösen lassen?
Nein, kannst du nicht.
Macht auch keinen Sinn, weil du ja nur 1 ADC hast.
Aber nichts und niemand hindert dich daran, in der ISR die
Kanalumschaltung durchzuführen und anstelle des Free Running Modus den
ADC in der ISR selbst wieder zu starten.
ISR( ADC_COMPLETE )
{
ADC Ergebnis holen und abspeichern
ADC auf den nächsten Kanal einstellen
den ADC loslegen lassen
}
Hi,
über den Motorstrom die Drehzahl zu regeln geht nur bei absolut
konstanter Last. Sollte der Motor belastet werden, geht der Strom hoch
und die Drehzahl runter. Bei konstanter Last ist höherer Strom auch
höhere Drehzahl. Der Strom ist proportional zum Dehmoment und somit eher
geeignet eine Momentenregelung aufzubauen.
Die Drehzahl würde ich über Impulse von der Welle abnehmen.
Hambone
Hallo,
erstmal danke für eure Antworten!
@Karl Heinz Buchegger:
Ja da hast du allerdings recht :-) da hatte ich wohl einen Denkfehler.
Was mir aber noch nicht ganz klar ist, wie ich sinnvoll 2 analog Signale
einlesen soll. Also Zb: 2 Signale ADC1 und ADC2
ADC1 soll unbedingt immer dann eingelesen werden wenn sich der Wert
ändert
-> Interrupt gesteuert bei "ADC Conversion Complete"
dh.: Ich muss ja eigentlich ständig den ADC1 als Kanal der gelesen
werden soll auswählen.
alle 10ms soll ADC2 gelesen werden.
Dh Ich konfiguriere mir einen Timer der alle 10ms einen Interrupt
auslöst. In dieser Interruptroutine muss ich dann quasi den ADC Channel
auf ADC2 ändern und die Conversion neu starten. Dann wird aber wieder
der ADC_conversion_complete Interrupt eventuell durch den ADC2 und nicht
durch ADC1 ausgelöst. Wäre ja möglich das genau zu dieser Zeit sich der
ADC1 ändert.
Irgendwie steh ich glaub ich jetzt komplett auf der Leitung!! Mir geht
gerade nicht ein wie ich das am schönsten und sinnvollsten lösen soll.
@ Thomas Hauffe:
Ich möchte die Drehzahl von einem kleinen RC Fahrzeug regeln. Konstante
Lasten sind somit eher schwierig möglich da es ja sein kann, dass einmal
bergauf einmal bergab mit unterschiedliche Steigungen gefahren werden
soll. Da es sich als eher schwierig herausgestellt hat, einen Sensor an
der Chassis anzubringen um die Drehzahl zu messen, dachte ich mir, ich
versuche mal den Ansatz mit der Stromregelung. Habe allerdings nicht
daran gedacht dass es nur sinnvoll funktioniert, bei konstantem
Laststrom. Ich komme scheinbar nicht drum rum die Drehzahl abzugreifen.
Ich finde irgendwie nicht wirklihc eine Möglichkeit einen Drehgeber (zB
eine Lochplatte) an einer Welle vom Getriebe oder direkt am Motor
anzubringen ohne großen Aufwand und grobe Umbauarbeiten durchzuführen.
Hast du vlt noch eine andere Idee um relativ einfach die Drehzahl zu
messen?
Relativ leicht zugänglich wäre das Hauptzahnrad vom Getriebe. Eventuell
das ich hier mit einem Sensor Drehimpulse abfangen kann... Da muss ich
mir wohl noch was einfallen lassen. Mir ist wichtig dass die
Drehzahlmessung mit einer halbwegs brauchbaren Genauigkeit gemessen
wird...
Vielen Dank!
Nein. Dann solltest du den ADC1 und den ADC2 abwechselnd lesen. Mir
leuchtet dasd Projrkt nicht ein. Einem RC Auto den Strom reglen zu
wollen ist eher sinnfrei, denn man gibt per per Steuerknueppel jas eher
die PWM fuer den Motor vor, also die Spannung. Und der Fahrer soll
regeln.
> Da es sich als eher schwierig herausgestellt hat, einen Sensor> an der Chassis anzubringen um die Drehzahl zu messen
Ich kann mir nicht vorstellen, dass es im kompletten Antriebsstrang
eines RC-Autos keine Möglichkeit gibt, irgendwo die Drehzahl
abzugreifen. Und sei es mit Magneten und Hallsensoren in den Felgen.
Oder einer optischen Markierung und einer Reflexlichtschranke auf der
Kardanwelle. Oder .....
Wäre es denn möglich am Hauptzahnrad eine Bohrung anzubringen durch die
mittels einer Lichtschranke die Drehzahl abgefasst werden kann?
Zur Regeleung solltest Du meines erachtens eher auf eine konstante
Abtastrate achten anstatt einfach nur "dann wenn der ADC fertig ist" den
nächsten Wert zu holen. Abhängig von der Programmlaufzeit holst Du ja
dann den Messwert mal nach x und mal nach y millisec, mikrosec, oder was
auch immer.
Hallo,
erstmal Danke für eure Antworten!
Ich verwende die Chassis eines Offroad RC Autos. Soll nur als Basis
dienen.
In Zukunft soll dieses Fahrzeug autonom fahren bzw über den PC manuell
gesteuert werden können.
Ich dachte, dass ich die Drehzahlregelung über den Laststrom umsetzen
kann, da direkt am Motortreiber L298 der Laststrom abgreifbar ist. Somit
hätte ich mir einen zusätzlichen Sensor erspart. Habe aber dabei ein
paar wichtige Faktoren vergessen zu bedenken.
Ich habe auch nicht gesagt, dass es nicht möglich ist die Drehzahl
irgendwo am RC car abzugreifen. Ich habe nur gesagt, dass es nicht so
einfach ist, da irgendwo einen Sensor hinzupflanzen. Bei meiner Chassis
ist alles ziemlich knapp.
Das Fahrzeug soll auch draußen (offroad) fahren können, darum würde ich
den Sensor eher nahe am Getriebe oder direkt am DC Motor plazieren,
damit ich dann auch die Elektronik und Getriebebox und DC Motor vor
Schmutz schützen kann.
In der Felge ist nicht viel Platz da die Radhalterung so viel Platz
wegnimmt, dass ich einen Magneten nur am äußeren Rand plazieren könnte.
Da ist aber dann die Gefahr dass der Magnet durchs Gelände eventuell
heruntergerissen wird.
Ich werde mir mal Gedanken machen den Sensor am Hauptzahnrad vom
Getriebe anzubringen.
Vielen Dank für eure Infos und Gedanken!!
Bin für jeden weiteren Gedanken oder Kritik sehr dankbar!!
Hallo Juergen Roeck!
Vielen dank für deine Antwort!
ja der Gedanke ist mir auch schon gekommen.
Ein kleines Loch ins Hauptzahnrad zu bohren und dann mit einer IR Diode
und Transistor (also ein Lichtschranken, wo Sender und Empfänger
getrennte Bauteile sind) die Drehzahl zu messen. Vielleicht gibt es
sogar einen Gabellichtschranken der gesamt nicht zu groß ist, wo Sender
und Empfänger mindestens 5mm Abstand haben.
Muss mal schauen welche Bauelemente es dazu gibt und ob sich das dann
platztechnisch auch ausgehen würde.
vielen Dank!