Forum: Mikrocontroller und Digitale Elektronik ADC Wandlung mit Atmega32


von asdffdsa (Gast)


Lesenswert?

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!

von Karl H. (kbuchegg)


Lesenswert?

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

von Thomas H. (hambone)


Lesenswert?

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

von asdffdsa (Gast)


Lesenswert?

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!

von Kurzer Stapel (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Juergen R. (stumpjumper)


Lesenswert?

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.

von asdffdsa (Gast)


Lesenswert?

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

von asdffdsa (Gast)


Lesenswert?

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!

von Juergen R. (stumpjumper)


Lesenswert?

Viel Erfolg.

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.