Forum: Mikrocontroller und Digitale Elektronik ROLOMotorsteuerug mittels optokoppler (MEGA8)


von Lowtzow .. (lowtzow)


Lesenswert?

Hallo ne FRage zu einem kleinen projekt und zwar möchte ich mit einen
mega8 meine rolos rauf und runter fahren lassen!

zur hardware 4 Motoren (12V) die hinten einen optokoppler obensitzen
haben d.h. bei jeder drehung kann man messen wo der motor steht.

mein problem: wie sag ich das dem mega8?!

also die motoren könnt ich jeweils mit einen transistor bzw relais auf
+12 bzw -12V ziehen jenachdem obs rauf oder runter gehn soll, aber wie
sag ich dem mega8 das er angenommen nach zb 800impulsen vom optokoppler
stehen bleibt (also in meinem fall optokoppler auf der rückseite sind
gleichzeitig endwertschalter)
hat wer nen tipp?!

mfg piri

von Hubert.G (Gast)


Lesenswert?

L293 oder ähnliches zur Motorsteuerung, die Impulse zählen damit man die
Rollos zu einem definierten Punkt fahren kann, die Endschalter sind ja
klar. Wenn du L293E nimmst ist ein Shunt bereits vorgesehen zur
Auswertung falls ein Rollo mal klemmt damit der Motor nicht abbrennt.
Der Hardwareaufwand hält sich da in Grenzen und die Software ist ohne
zeitkritische Punkte. Fallst du Anfänger bist etwas viel aber mit etwas
Geduld und einigen Übungsbeispielen aus dem Tutorial doch zu schaffen.
Am besten in Teile zerlegen, z.B. Endschalter auswerten, Impulse
zählen, Motor ansteuern, Shunt auswerten usw. und dann zusammenfügen.

von Frank Schuessler - fs0001 (Gast)


Lesenswert?

@Alex Piri

>aber wie
>sag ich dem mega8 das er angenommen nach zb 800impulsen vom
optokoppler
>stehen bleibt

du koenntest z.B den Input Capture Pin des Atmel benutzen; in Deinem
Programm dann eine passende Interrupt-Routine erstellen und dort eine
Variable hochzählen. Du kannst über Register einstellen wann der
InputCapture Interrupt aktiv werden soll (steigende, fallende Flanke);
so kannst Du dann z.B. bei jedem positiven Flankenwechsel Deine
Variable hochzählen --> bei 800 bleibt der Motor stehen .....

Beim Atmega8 wäre dies PIN PB0 (ICP1)
Mehr dazu Atmega8 Datenblatt (complete) S.81
-fs-

von Hannes L. (hannes)


Lesenswert?

Mit welcher Frequenz kommen denn die Signale vom Motor?
Sind die Signale garantiert prellfrei?
Das entscheidet nämlich darüber, auf welche Art die Impulse gezählt
werden können.

...

von Lowtzow .. (lowtzow)


Lesenswert?

danke für die tipps, der l293 schaut schon mal gut aus, hab mir eh schon
gedanken gmacht wenn irgendwas blockiert oder so das dürfte dann mit dem
ic kein problem sein.

die frequenz vom optokoppler is immer gleich da die scheibe genau
hinterm motor sitzt und der mit konstanter drehzahl dreht;
entprellt?! kann ich nicht sagen is ein optokoppler wo so eine
reasterscheibe durchläuft (einmal schwarz dann durchsichtige
(20fenster)) und der motor dreht in 10sek einmal .
also dürft das so ca ne frequenz von 0,5 haben; eventuell irgendsoeinen
bauteil der die signale glättet (weiß jetzt nimmer genau wie das heißt
integrator oder so) oder direkt auswerten vom optokoppler?! weiß leider
nicht ob sie eintprellt sind oder nicht

hab mir das mal im datenblatt angeschaut mit INPUT CAPTURE UNIT. also
wenn ich das richtig verstanden hab dann is das so ne art zähler der
dann bis zu einer definierten variablen zählt, ohne zusätzlich externe
beschaltung, da is das datenblatt leider ein bissi zu konfus für mich
;-)
das problem mit dem input capture unit is eventuell dass ich insgesamt
4 rolos hab die teilweise unterschiedlich lang laufen d.h. entweder 4
MEGA8 oder ne lösung wie ich jeden Motor einzel messen kann.

ziel wäre es
alle rolos einzel zu betätigen
alle rolos gemeinsam zu betätigen
eventuell nen knopf wo die rolos zur hälfte fahrn (das is aber das
kleinste problem-- softwaremäßig)

bin offen für jeden tipp, weil ich bin schon seit längerem an dieser
idee dran und motoren und mega8 hab ich schon nur wären da nicht diese
kleinen oder auch großen hürden ;-))

mfg
piri

von Hannes L. (hannes)


Lesenswert?

Na wenn die Impulse so langsam kommen, dann kannst du sie im
Timer-Interrupt pollen oder besser noch mit der PeDa-Entprellung (im
Wiki nach "entprellung" suchen). Damit stehen dir Flags zur
Verfügung, mit denen du ganz einfach Softwarezähler steuern kannst.

ICP ist dafür eher ungeeignet, ICP ist mehr dazu da, Impulsdauer bzw.
Periodendauer zu messen und nicht um Ereignisse zu zählen.

...

von Lowtzow .. (lowtzow)


Lesenswert?

ich hab mir das ganze mal angeschaut:

1. da der mega8 2 interrupts hat könnt ich höstens 2 rolos mit einem
mega8 betreiben, bzw nur eines da wenn 1 interrupt ausgelöst ist der
zweite nicht verarbeitet wird da schon ein interrupt läuft -- hab ich
das so richtig verstanden

2. wenn jetzt der interrupt läuft könnt ich gleich über INT0 also PD2
(pin4) die Impulse vom optokoppler auslesen und nach 800 impulsen sagen
jetzt is stopp für den motor -- bis jetzt noch richtig?!

3. aber wie kann man jetzt die impulse zählen, immer 1 impuls in ein
register dazuaddieren und gleichzeitig abfragen ob das register schon
bei 800 ist?!

4. ist es ein problem das ganze in bascom zu programmieren oder is es
ratsamewr asembler oder c zu verwenden?!

danke für antworten

mfg
alex

von Hannes L. (hannes)


Lesenswert?

1. Falsch... Denn bei der geringen Frequenz kann man die Lichtschranken
pollen. Das gescheiht am besten mit der Entprellroutine von PeDa (Peter
Dannegger), aif die ich dich schon weiter oben aufmerksam gemacht habe.
Diese Routine entprellt so im Vorbeigehen innerhalb weniger Takte bis
zu 8 Eingänge und stellt Flags zur Verfügung, die einen neuen Impuls
melden. Daraufhin kann die Mainloop sehr einfach die Impulse zählen.
Diese Routine ist eigentlich für das Einlesen und Entprellen von
Tastern gedacht, macht dies aber so effizient, dass man auch andere
Aufgaben damit erschlagen kann.

2. Falsch... Während eines Interrupts einen Interrupt abfragen? Damit
kann ich nicht viel anfangen. Um diese Aufgabe (dein gesamtes Projekt)
zu lösen, brauche ich einen Timer-Interrupt.

3. Im Prinzip ja, aber trotzdem falsch, denn ein Register (oder eine
SRAM-Zelle) kann nur bis 255 zählen, nach 255 kommt wieder Null. Das
ist halt so, wie man mit einem zweistelligen Dezimalzähler auch nur bis
99 zählen kann, danach kommt wieder 0.

4. Für mich wäre das in BASCOM oder C ein Problem, in Assembler aber
nicht. Das liegt aber nicht an BASCOM oder C, sondern an mir.

...

von Hubert.G (Gast)


Lesenswert?

Das ganze ist absolut zeitunkritisch.
1. Man arbeitet in einem Interrupt nichts ab, man setzt ein Flag oder
dergleichen, verlässt den Interrupt und arbeitet das in der
Main-Schleife ab
2. Du kannst sicher jeden Optokoppler aus der main-Schleife abfragen
ohne in Zeitprobleme zu geraten.
3. genau so und der Endschalter stellt immer auf 0 oder 800
4. was du am besten kannst, wobei dir hier im Forum bei Assembler und C
am schnellsten geholfen werden kann.

von Lowtzow .. (lowtzow)


Lesenswert?

ich hab mir die routine einmal angeschaut
http://www.mikrocontroller.net/forum/read-4-20549.html#new

nur nochmal zum verständnis

ich drück angenommen eine taste , in meine fall zb die taste "rollo
rauf" gleichzeitig mit diesem tastendruck fährt der motor an also rauf
und 2. die interrupt routine zählt die impulse vom optokoppler bis 3.
die routine sagt gnug impulse motor aus

aber komisch find ich das du meinst die impulse werden in der
mainroutine gezählt

oder verdreh ich da jetzt was?!

von Lowtzow .. (lowtzow)


Angehängte Dateien:

Lesenswert?

damit ihr mal sehts von welchem motor mit rückseitiger drehscheibe
inklusiver optokoppler ich arbeiten möchte hier mal ein foto.

wenn sich der motor dreht, dreht sich auch die drehscheibe und fährt
die ganze zeit durch den optokoppler, d.h. ich kann die impulse zählen
die dann den motor nach x impulsen zum stopp bringt.

mfg
alex

von Hubert.G (Gast)


Lesenswert?

Ich meinte damit das man keine langen Abläufe in der Interruptroutine
durchführt, einen Zähler inkrementieren ist schon OK, die Auswertung
des Zählers und eine eventuelle Aktion erfolgt jedoch sinnvoller Weise
schon wieder in der mainroutine.

von Hannes L. (hannes)


Lesenswert?

Diese Routine zählt garnix. Sie stellt dir nur Flags (key_press) und
Status (key_state) der entprellten Tasten zur Verfügung, die du in der
Mainloop in aller Ruhe auswerten kannst.

Deine Fragen zeigen mir aber, dass das alles absolutes Neuland für dich
ist. Vielleicht solltest du erstmal ein paar kleinere Projekte
realisieren. Fang am besten mit dem Tutorial auf dieser Seite an
(zweiter Link oben links). Das ist jetzt nicht bös gemeint, aber ich
habe den Eindruck, dass wir aneinander vorbei reden.

...

von Hannes L. (hannes)


Lesenswert?

Hubert, wir meinen beide das gleiche. Ich glaube aber nicht, dass Alex
das momentan nachvollziehen kann, er denkt noch zu
"objektorientiert". Meim AVR sollte man aber etwas dichter an der
("real existierenden") Hardware denken...

...

von Lowtzow .. (lowtzow)


Lesenswert?

ja ich weiß selber das ich noch nicht so ein avr wissen hab

kann aber schon kleine projrekte aufweisen
ausgabe auf ein 2x16 lcd diplay
und so standard sachen wie ein blink led, jedoch die mit warte funktion
also zeitverschwendung in der rechenroutine.
ich denk jedoch ich hab nicht soviel ahnung von c oder asembler hab das
bis jetzt mit bascom gelöst . . .

----------

aber zu meinem projekt was mir eigentlich gar nicht so schwer
vorstell:
zähler inkrementieren und auswertung in der hauptroutine sagt mir schon
mehr.
also der befehl/tastendruck "rauf" löst (motor und) einen
interrupttimer aus und der zählt bis x und gibt es weitrer an die
hautroutine die dann daraufhin sagt motor aus

-----------

habt ihr vielleicht tipps für übungsbeispiele die mir eventuell den
projektaufbau erleichtern

von Hannes L. (hannes)


Lesenswert?

BASCOM ist ein Baukasten. Solange deine Hardware von diesen Bausteinen
unterstützt wird, siehst du den schnellen Erfolg. Unterm Strich hast du
aber nicht viel gelernt, da dir BASCOM keine hardwarenahe Programmierung
erlaubt. Interrupts kannst du fast vergessen, durch das Sichern aller
Register wirds arg langsam.

Ich programmiere auf anderen Systemen auch in BASIC (QBASIC, VB,
Commodore-BASIC 3.5), beim AVR aber nur in Assembler. Mit BASCOM kann
ich mich nicht anfreunden.

> habt ihr vielleicht tipps für übungsbeispiele die mir eventuell den
> projektaufbau erleichtern

Das hättest du nicht fragen sollen, bist also selbst schuld. Wenn du
ein paar ASM-Programme analysieren willst, dann schau mal hier rein:
www.hanneslux.de

Mit einer Rollosteuerung kann ich (noch) nicht dienen, aber eine
Rolladensteuerung für 12 Rolläden mit Display und Schaltuhr ist in
Arbeit (Mega32).

...

von Hubert.G (Gast)


Lesenswert?

Ich habe es schon anfangs geschrieben, zerlege dein Projekt in einzelne
Teile.
Beginne mit Taste drücken, entprellen, LED leuchtet, ein Zähler zählt
langsam hoch bis zu einem Wert, LED geht dann aus und so weiter bis du
alle Teile beisammen hast.
So kannst du dir alle Übungsbeispiele Projektnahe selbst
zusammenstellen und wenn alles funktioniert zusammenfügen.
Das ganze lässt sich sicher auch in Bascom lösen, allerdings kann ich
dir dabei dann nicht helfen, es wird sich aber sicher jemand finden.

von lowtzow (Gast)


Lesenswert?

so hab mich noch ein bisschen informiert und nach einiger zeit auch
einen halbwegs vernüftigen code zusammengebracht der in bascom
fehlerfrei compeliert wird

wollt mal eure meinung dazu hören?!

$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000

Config Pinb.1 = Input
Config Pinb.2 = Output
Dim Irq0 As Word


Irq0 = 0
On Int0 Irq0
Enable Int0
Config Int0 = Rising
Enable Interrupts


Do

Abfrage:                 'hier wird abgefragt ob eine taste gedrückt
ist
If Pinb.1 = 1 Then   ' wenn pinb.1 gedrückt dann in die Rauf routine
Goto Rauf
Else
Reset Pinb.2
Goto Abfrage
End If

Rauf:
Set Pinb.2                                                  'motor
fährt rauf
Incr Irq0
If Irq0 > 800 Then
Reset Pinb.2                'wenn 800 impulse ereicht sind dann stop
TIMER0
Else
Goto Rauf
End  IF

Loop

mfg
alex p

ps mir is es bewusst das ich anfangs sehr blöd gefragt hab, aber ich
denk ich schau schon langsam durch die ganzen sachen ;-)

von Hannes L. (hannes)


Lesenswert?

Ich bin zwar BASCOM-Muffel, aber schau dir mal den Befehl debounce an.

Unabhängig davon stellt sich die Frage, wie das Ding wieder runter
fährt...

;-D

...

von lowtzow (Gast)


Lesenswert?

befehl debounce, versteh ich nicht ganz?!

ja ich weiß runterfahrn tut es noch nicht
hab mir mal dacht ein programm das mal nur rauf fahrt is mal ein
anfang.
kann man sich ja dann so in module zamstopseln

raufabfrage
runterabfrage
interruptabfrage

von lowtzow (Gast)


Lesenswert?

so hab das ganze nochmal überarbeitet

der inc irq0 is aus der abfrage geflogen, weil irq0 ja sowieso immer
ausgelöst wird wenn was anliegt! (denk ich halt mal so war das vorher
gemeint)

also eigene "routine" für irq0

$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000

Config Pinb.1 = Input
Config Pinb.2 = Output
Dim Irq0 As Word



Irq0:
Incr Irq0
Return




Do

Abfrage:                         'hier wird abgefragt ob eine taste
gedrückt ist
If Pinb.1 = 1 Then           ' wenn pinb.1 gedrückt dann in die Rauf
routine
Goto Rauf
Else
Reset Pinb.2
Goto Abfrage
End If

Rauf:
Set Pinb.2                                                  'motor
fährt rauf
If Irq0 > 800 Then
Reset Pinb.2                'wenn 800 impulse ereicht sind dann stop
TIMER0
Else
Goto Rauf
End  IF

Loop

mfg

von lowtzow (Gast)


Lesenswert?

so hab das programm wieder leicht geändert und mit bascom getestet und
es schaut so aus als würde alles funktionieren.
werd demnächst das ganze zamschließen und in echt testen.

natürlich fehlt die erweiterung noch für runter ;-)

mfg
alex p

danke für eure mithilfe ;-))

von Hannes L. (hannes)


Lesenswert?

Du hast weiter oben geschrieben, dass sich der Motor mit einer festen
Drehzahl dreht und dass die Frequenz der Lichtschrankenimpulse (unter
Optokoppler verstehe ich was Anderes) konstant ist. Daher erübrigt sich
die Zählung der Impulse, es genügt, wenn man die Zeit misst.

...

von Roland (Gast)


Lesenswert?

Die Zeitmessung reicht bei den Rollos völlig aus, bei meinen Rolladen
mache ich es auch so, wobei die Zeit die der Motor des Rollos zum
Hochziehen benötigt etwas länger ist als die beim Runterfahren, das
kann man aber dem entsprechend anpassen.

von lowtzow (Gast)


Lesenswert?

hab vorher das programm vergessen

----------------------------------------------
$regfile = "m8def.dat"
$baud = 9600
$crystal = 8000000

Config Pinc.1 = Input
Config Pinc.2 = Output
Config Pind.2 = Input

Dim Irq0 As Word





'' Interrupt Int0 config
On Int0 Irq0

Config Int0 = Rising
Enable Int0
Enable Interrupts


Do

''abfrage ob taste gedrückt & Kontrolle ob irq0 noch nicht über 800
Abfrage:
If Pinc.1 = 1 Then
Gosub Rauf
Else
End If


If Irq0 > 5 Then
Gosub Halt


End If


Loop


'' bei Int0 wird irq0 um 1 erhöht
Irq0:
Incr Irq0
Return




'' wenn 800 impulse ereicht dann motor stopp
Halt:
Reset Pinc.2
Irq0 = 0
Return

'' wenn 800 interruptimpulse noch nicht erreicht sind motor läuft
weiter
Rauf:
Set Pinc.2
Return
------------------------------------------------------

der motor dreht relativ langsam also müsste prinziepell beides
funktionieren!
stimmt mit zählen wärs eigentlich einfacher gewesen ;-)

mfg
piri

von Wegstabenverbuchsler (Gast)


Lesenswert?

Hier mal meinen Senf zum Thema Gurtwickler (ich hab grade meinen
repariert)

schau mal unter Rollotron 9600 (z.B. bei ebay). Die Beschaltung ist wie
folgt:

Sicherung, Eingangsbrücke (4*1N4007), Entstörkondensatoren,
Gleichstrommotor (230V). Der Wickler "zieht" im Lastbetrieb ca. 100
Watt. Ein ziemlich starkes Überstzungsgetriebe bringt die Kraft und
Drehzahl auf ein erträgliches Maß. Die Richjtungsumkehr erfolgt durch 2
kleine Print-Relais (12V) welche dann die Spannung geeignet auf den
Motor durchschalten. Die Stromversorgung des Prozessors und des Relais
erfolgt über einen kleinen print-Trafo (Ruhelast ca. 2 Watt)

Nun meine Anmerkungen:

Je nach Jalousiengewicht dreht der Motor natürlich schneller oder
weniger schnell. Darüber hinaus: Rauf hat der Motor ordentlich zu
schaffen, und runter muß er abgebremst werden, damit er nicht zu
schnell runterrasselt.

An der Umlenkrolle ist ein kleiner Magnet, dahinter (Platine) 2
Hallsensoren. Sie messen ob sich da überhaupt was dreht (kann ja auch
grade jemand seine Finger irgendwo zwischen haben) und stoppt
eventuell.




Mir ist nun nicht klar bei der Anordnung des Ursprungsposters:
Wieso 4 Motoren
wieso 12 Volt
welchen Strom soll denn das Teil ziehen, und wie kommt der an den
Motor
Welches Getriebe
Wie erfolgt die Richtungsumkehr

von lowtzow (Gast)


Lesenswert?

hy

also
dans ganze ist eine nachrüstung
es geht um rolos in den scheiben die mit einen seilzug zu betätigen
sind also per hand, dranziehn und festbinden damit sie oben bleiben
d.h. relativ wenig kraft!

4 rolos da ich 4 fenster habe.

12V da der motor 12V betriebsspannung hat
bei dem schon das getriebe eingebaut ist! der hat so ne welle drinnen,
damit er ohne spannung nicht zurückrollt! und mit viel power, den kann
man nicht mal mit der hand stopen!
aja und auf dem motor is hinten so ne rasterscheibe
(inkrementierscheibe) für nen optokoppler, die die ganze zeit durch nen
gabellichtschranke läuft.
wieviel strom, was der strom zieht weiß ich nicht genau, is daweil am
2a netzteil glaufen .
angsteuert wird das ganze über nen l293 muss ich mir noch überlegen bzw
relais. ich weiß das keine treiberstufe daweil in mein programm
eingebaut! naja mit nen 5V/12V relais müsst zumindest das aktuelle
programm funktionieren.

oder hast du eine andere idee für mein projekt.

von Hannes L. (hannes)


Lesenswert?

> der motor dreht relativ langsam also müsste prinziepell beides
> funktionieren!
> stimmt mit zählen wärs eigentlich einfacher gewesen ;-)

Zählen von Impulsen benötigt aber zusätzliche I/O-Pins. Zeitmessung
erreicht man ganz einfach, indem man sich mit einem Timer ein
Zeitnormal schafft. In dieser ISR können dann die Bedientaster
entprellt werden, mehrere Software-Timer behandelt werden usw... Das
Intervall legt man sinnvollerweise so, dass man mit dem Wertebereich
eines Bytes die Zeit zum Öffnen oder Schließen zählen kann. Genauer ist
nicht erforderlich.
Dein "Engpass" ist dann aber die begrenzte Anzahl I/O-Pins des Mega8.
Daher solltest du entweder auf einen 40-Pinner AVR ausweichen oder über
Porterweiterung mittels Schieberegister nachdenken. Denn ich habe hier
irgendwo gelesen, dass du mit einem AVR mehrere Rollos steuern willst.
Das schafft ein Mega8 mit 1MHz spielend, nur mit den I/Os wird es
schnell knapp, denn jedes Rollo erfordert 2 Eingänge für die Taster und
2 Ausgänge für die Relaistreiber. Die Eingänge sollten möglichst auf
einen Port geführt werden, das erleichtert die Entprellung.

...

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.