Motortreiber

Wer etwas bestimmtes sucht, kann es hier bekannt geben

Moderator: Tim Sasdrich

Motortreiber

Beitragvon Nachthimmel » 16.02.2012, 19:27

Hallo Forum,

ich suche einen Motortreiber für einen 12V - Motor. Ich habe eine Maximalstromaufnahme von 1,5A gemessen, einen 2A Sicherungsautomaten hätte ich hier => der Motortreiber sollte also bei den 12V Eingangsspannung auch 12V Ausgangsspannung mit mindestens 2A Belastbarkeit an den Motor liefern. Ich möchte auch die Geschwindigkeit regeln können, dies sollte über PWM geschehen. Die PWM-Frequenz sollte jedoch über 20kHz liegen, damit man es nicht hört. Zudem soll der Motor in beide Richtungen gesteuert werden können. Der Motor-Treiber sollte zudem selbst leise sein (keine Relais etc.) und einen geringen Eigenstromverbrauch haben. Die Ansteuerung soll über einen µC erfolgen, bei dem bereits alle PWM-Ausgänge belegt sind. I²C wäre mir am liebsten.

Kennt da jemand etwas entsprechendes?
Philosoph: Sein oder nicht sein? - Elektroniker: Das ist Wahr.
Benutzeravatar
Nachthimmel
 
Beiträge: 93
Registriert: 06.09.2010, 19:35
Wohnort: Villingen-Schwenningen

Re: Motortreiber

Beitragvon eggbert » 16.02.2012, 19:42

den link gabs letztens schonmal vom Dussel

da sollte was bei sein, soweit ichs in erinnerung hatte, hat RN im Shop auch fertige boards, teilweise mit schnittstellen...
aber bedenke, dass du dabei arm werden wirst...
eggbert
 

Re: Motortreiber

Beitragvon Nachthimmel » 16.02.2012, 21:04

Danke, das mit dem "MOTCTRL" ist schonmal etwas, ich vermute jedoch, dass dort nur ein einfacher ATmega8 dahinter stecht => das bekomme ich auch selbst hin. Am liebsten wäre mir ein IC, wo auch schon der Leistungsteil mit drin steckt. Am besten mit einer Stromaufnahme < 1mA (auch wenn das dann nur im Stand-Bye).

Die Kosten sollten < 20 € liegen.
Philosoph: Sein oder nicht sein? - Elektroniker: Das ist Wahr.
Benutzeravatar
Nachthimmel
 
Beiträge: 93
Registriert: 06.09.2010, 19:35
Wohnort: Villingen-Schwenningen

Re: Motortreiber

Beitragvon Nachthimmel » 19.02.2012, 00:17

Ich hab mir nun selbst einen gebaut. Der basiert auf einem ATmega8. Über 3 Steuerleitungen gibt nun der Steuer-µC an den Motortreiber-µC die Befehle und empfängt über 2 weitere Leitungen Fehlermeldungen. Da ich gerne Strom sparen möchte und der Motor beim hochziehen des Rollladens bei einer langsamen Geschwindigkeit fast genauso viel Strom benötigt wie bei einer hohen Geschwindigkeit, verzichte ich dort auf die geringe Lautstärke, somit ist nun ein Relais zum umpolen und hochfahren da (Relais aktiv => Rolladen fährt hoch; Relais nicht aktiv => Rolladen fährt über PWM-Steuerung nach unten).

Über 2 Steuerleitungen kommen dann die Signale (binär übertragen):
0 = Aus (Relais aus; PWM = 0)
1 = langsam runter (Relais aus; für PWM wird hier ein Drehsensor am Motor ausgewertet. Dreht sich der Motor zu schnell, wird der PWM-Wert verringert, dreht er sich zu langsam oder gar nicht wird der PWM-Wert erhöht. Somit läuft der Motor langsam und ist Leise)
2 = schnell Runter (Relais aus; PWM auf höchster Stufe)
3 = Hoch (Relais an)

Über die 3. Steuerleitung kommt der Befehl zum Übernehmen. Dieser muss mindestens alle 1,5 Sekunden wiederholt werden, wenn der Motor an sein soll. Fehlt dieses Signal für länger und der Motor ist aus, geht der µC in den Standbye-Modus und wird aufgeweckt, wenn dieses Signal wieder kommt.
Fehlt jedoch das Signal und der Motor ist an, stoppt ihn der Regler und gibt eine Fehlermeldung aus (Port aktiv), bis der Wert 0 (Aus) für den Motor übertragen wurde. Zudem wird so lange, allerdings maximal 10 mal, ein Ton über den Motor wiedergegeben.

Sollte der Impulsgeber am Motor für etwa 0,75 Sekunden kein Signal bringen, obwohl der Motor an ist, geht der µC auch wieder in die Schutzschaltung, aktiviert einen anderen Port und gibt auch wieder 10 Töne über den Motor aus, allerdings in einer anderen Tonhöhe.
Philosoph: Sein oder nicht sein? - Elektroniker: Das ist Wahr.
Benutzeravatar
Nachthimmel
 
Beiträge: 93
Registriert: 06.09.2010, 19:35
Wohnort: Villingen-Schwenningen

Re: Motortreiber

Beitragvon Nachthimmel » 20.02.2012, 02:53

Hier stelle ich mal mein Programm vor, für den Fall, dass es jemanden interessiert.

An Portb.0 kommt über einen 1 kOhm Widerstand ein Transistor, der die Minusleitung des Relais schaltet.
Das Relais hat zwei Wechlser. An die gemeinsamen Anschlüsse kommt der Motor.
Die Motorversorgungsspannung kommt bei Wechsler 1 an den Anschluss, der bei eingeschaltetem Relais mit dem Motor verbunden ist und bei Wechsler 2 an den Anschluss, der eingeschaltetem Relais mit dem Motor verbunden ist.
An den anderen Anschluss von Wechsler 1 kommt ein Leistungs-NPN-Transistor gegen GND, der von Portb.1 über einen 1 kOhm Widerstand gesteuert wird.
An den übrigen Anschluss von Wechsler 2 kommt GND.

Portd.0 ist Datenleitung 1
Portd.1 ist Datenleitung 2
Portd.2 ist die Taktleitung (fallende Flanke)
Portd.3 ist der Drehgeber
Portd.5 ist der Fehlerausgang "Kein Signal"
Portd.6 ist der Fehlerausgang "Blockiert"
Der µC sollte einen 16-MHz-Takt bekommen (am besten Quarz)

Ausgelegt ist das Programm für die Mechanik dieses Rolladengurtwicklers.
Ausgewertet wird der Drehgeber direkt am Motor, Motorversorgungsspannung ist bei mir 12 V (auch wenn es eigentlich ein 24 V - Motor ist). Die 12 V stehen eben schon zur Verfügung.

Programm:
Spoiler: show
Code: Alles auswählen
$regfile "m8def.dat"                                        'Contorller
$crystal = 16000000                                         'Taktfrequenz

Config Timer1 = Pwm , Compare A Pwm = Clear Down , Prescale = 1       'PWM

'Timer-Interrupt
Config Timer0 = Timer , Prescale = 1
Enable Timer0
On Timer0 Timer_interrupt

'Int0 (Takt für Übergabe)
On Int0 Int0_isr
Config Int0 = Falling
Enable Int0

'Int1 (Motordrehgeber)
On Int1 Int1_isr
Config Int1 = Falling
Enable Int1
Enable Interrupts

'Pullups
  'Für Test mit Tastern
    Portd.0 = 1                                             'Datenleitung 1
    Portd.1 = 1                                             'Datenleitung 2
    Portd.2 = 1                                             'Takt
  'Für Motordrehgeber
    Portd.3 = 1                                             'Drehgeber

'Ein-/Ausgänge
Ddrb.0 = 1                                                  'Relais für Hoch     => Ausgang
Ddrb.1 = 1                                                  'Transistor für PWM  => Ausgang
Ddrd.0 = 0                                                  'Datenleitung 1      => Eingang
Ddrd.1 = 0                                                  'Datenleitung 2      => Eingang
Ddrd.5 = 1                                                  'Fehler: Kein Signal => Ausgang
Ddrd.6 = 1                                                  'Fehler: Blockiert   => Ausgang
Portb.0 = 0

'Variablen
Dim Pwm As Word                                             'Geschwindigkeit für langsam runter
Dim Move As Byte                                            'Bewegung
Dim A As Word                                               'Für Tonausgabe
Dim B As Word                                               'Für Tonausgabe
Dim Zeit As Word                                            'Zeit bis inaktiv
Dim Messen As Word                                          'Drehgeber
Dim Messen10 As Word                                        'Drehgeber (für jeden 10. Impuls)
Dim Nr As Byte                                              'Empfangene Nummer
Dim Error As Word                                           'Fehler (Kein Signal)
Dim Blockiert As Word                                       'Messung für Blockierung
Dim Blockierung As Word                                     'Fehler (Blockiert)
Dim Pos As Word


Entry:                                                      'Startpunkt nach Standbye
If Nr = 0 Then                                              'Wenn µC aufgewacht ist und keinen Befehl zum Bewegen bekommen hat, spiele Still_Alive
  Pos = 0                                                   'Pos zurücksetzen
  Portd.5 = 1                                               'Ausgänge Error und Blockiert setzen (Teilt dem µC mit, dass gerade Still_Alive gespielt wird)
  Portd.6 = 1
  Do                                                        'Spiele Still_Alive
    Nr = Lookup(pos , Still_alive)                          'Ton laden
    If Nr > 100 Then                                        'wenn Ton halten
      Waitus 100                                            '  warten
      Move = Nr - 100                                       '  Ton ausgeben
    Else                                                    'sonst
      Move = 4                                              '  keinen Ton ausgeben
      Waitus 100                                            '  warten
      Move = Nr                                             '  Ton ausgeben
    End If
    Waitus 900                                              'warten
    Incr Pos                                                'nächster Ton
  Loop Until Nr < 4
End If


Do
  Incr Zeit                                                 'Zeit bis inaktivität hochzählen
  If Zeit = 100 And Move <> 0 Then Error = 12               'Fals kein Signal und Motor an, Fehler "Kein Signal" auf 2 + 10 Signaltöne setzen
  If Error > 2 Then                                         'Signaltöne für Kein Signal ausgeben
    Move = 0
    Waitms 100
    Move = 100
    Waitms 1
    Move = 0
    Decr Error
  End If

  If Move <> 0 And Move < 4 Then Incr Blockiert Else Blockiert = 0       'Zeit für Blockierung hochzählen, falls Motor an ist
  If Blockiert > 50 Then Blockierung = 12                   'Fals Blockiert, Fehler Blockiert auf 2 + 10 Signaltöne setzen
  If Blockierung > 2 Then                                   'Signaltöne für Blockierung ausgeben
    Move = 0
    Waitms 100
    Move = 25
    Waitms 1
    Move = 0
    Decr Blockierung
  End If


  If Error <> 0 Or Blockierung <> 0 Then                    'Falls Kein Signal oder blockiert war
    If Nr = 0 Then                                          '  Und empfangene Nummer = 0
      Error = 0                                             '     Fehler "Kein Signal" zurücksetzen
      Blockierung = 0                                       '     Fehler Blockiert zurücksetzen
    End If
    Zeit = 0                                                '  Wechsel in Standbye verhindern
    If Error <> 0 Then Portd.5 = 1                          '  Falls Kein Signal, Portd.5 aktivieren
    If Blockierung <> 0 Then Portd.6 = 1                    '  Falls Blockiert, Portd.6 aktivieren
  Else                                                      'sonst
    Portd.5 = 0                                             'Portd.5 zurücksetzen
    Portd.6 = 0                                             'Portd.6 zurücksetzen
    Move = Nr                                               'Empfangene Nummer für Motor nutzen
    Waitms 10                                               'ca. 10 ms warten
  End If
Loop Until Zeit > 100                                       'Wiederholen bis inaktivität


Config Int0 = Low Level                                     'Interupt auf Low Level setzen (sonst wird µC später nicht mehr wach)
Mcucr = Mcucr And &B10101111                                'Standbye
Mcucr = Mcucr Or &B10100000
sleep
Config Int0 = Falling                                       'Interrupt auf Falling zurücksetzen (sonst wird nicht erkannt, wenn sich der Steuer-µC aufhängt))

Goto Entry                                                  'vor die Schleife springen
End

Timer_interrupt:                                            'Timer Interrupt
    Select Case Move
      Case 0                                                'Aus
        Portb.0 = 0                                         'Relaus aus
        Compare1a = 0                                       'Motor aus
        Pwm = 100                                           'PWM für langsam runter auf standardwert
      Case 1                                                'langsam runter
        Portb.0 = 0                                         'Relais aus
        Compare1a = Pwm                                     'Motorgeschwindigkeit
        Incr Messen                                         'Messen erhöhen
        If Messen > 5000 And Pwm < 255 Then                 'Falls messen > 5000 und PWM noch < 255 :
          Incr Pwm                                          '  Motordrehzahl erhöhen
          Messen = 0                                        '  Messen zurücksetzen
        End If
      Case 2                                                'schnell Runter
        Portb.0 = 0                                         'Relais aus
        Compare1a = 255                                     'Motordrehzahl auf höchste Stufe
        Pwm = 255                                           'PWM für langsam runter auf höchstwert
      Case 3                                                'Hoch
        Portb.0 = 1                                         'Relais an
        Compare1a = 0                                       'Kein PWM
        Pwm = 100                                           'PWM für langsam runter auf standardwert
      Case 4                                                'Keine Tonausgabe, selbe Verzögerung
        Incr A                                              'A erhöhen
        Portb.0 = 0                                         'Relais aus
        B = Move / 10                                       'Motor mit 1/10 Leistung betreiben
        B = B * 9
        If A > B Then
          Compare1a = 0
        Else
          Compare1a = 0
        End If
        If A > Move Then A = 0                              'A zurücksetzen, falls zu groß
        Pwm = 100                                           'PWM für langsam runter auf standardwert
      Case Else                                             'Tonausgabe
        Incr A                                              'A erhöhen
        Portb.0 = 0                                         'Relais aus
        B = Move / 10                                       'Motor mit 1/10 Leistung betreiben
        B = B * 9
        If A > B Then
          Compare1a = 255
        Else
          Compare1a = 0
        End If
        If A > Move Then A = 0                              'A zurücksetzen, falls zu groß
        Pwm = 100                                           'PWM für langsam runter auf standardwert
    End Select
Return


Int0_isr:                                                   'Takt
  Zeit = 0                                                  'Zeit bis inaktivität zurücksetzen
  Nr = Pind.1 * 2                                           'Datenleitung 2 auslesen
  Nr = Nr + Pind.0                                          'Datenleitung 1 auslesen
Return

Int1_isr:                                                   'Drehgeber
  If Messen = 0 Then Incr Messen10                          'Impulse bei zu schneller drehzahl messen
  If Messen10 > 10 And Pwm <> 0 Then                        'bei 10 davon
    Decr Pwm                                                '  Drehzahl verringern
    Messen10 = 0                                            '  Zähler zurücksetzen
  End If
  Messen = 0                                                'Messen zurücksetzen
  Blockiert = 0                                             'Blockierung zurücksetzen
Return

Still_alive:
'Strophe 1
Data 25 , 30 , 35 , 35 , 30 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 25 , 30 , 35 , 35
Data 135 , 30 , 4 , 4 , 40 , 140 , 35 , 55 , 155 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 35 , 135 , 30 , 25 , 125 , 125 , 35 , 45
Data 145 , 40 , 140 , 140 , 35 , 135 , 55 , 55 , 155 , 30 , 130 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 25 , 30 , 35 , 35
Data 30 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 25 , 30 , 35 , 35 , 4 , 4 , 30 , 40 , 4 , 4 , 35 , 55
Data 155 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 35 , 135 , 30 , 25 , 125 , 35 , 45 , 145 , 145 , 40 , 35 , 4 , 55 , 40 , 35
Data 28 , 35 , 40 , 42 , 4 , 4 , 55 , 52 , 45 , 145 , 30 , 130 , 35 , 40 , 40 , 45 , 40 , 45 , 45 , 145 , 45 , 145 , 55 , 52
Data 45 , 145 , 30 , 130 , 25 , 30 , 35 , 40 , 40 , 35 , 30 , 130 , 30 , 130 , 25 , 22 , 20 , 20 , 22 , 122 , 25 , 125 , 30 , 25
Data 22 , 22 , 25 , 125 , 30 , 130 , 40 , 45 , 40 , 30 , 30 , 35 , 135 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4 , 4 , 4 , 4

'Strophe 2
Data 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 25 , 30 , 35 , 35
Data 135 , 30 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 25 , 30 , 35 , 35 , 135 , 135 , 30 , 40 , 140 , 35 , 135 , 55
Data 155 , 4 , 4 , 4 , 4 , 4 , 4 , 35 , 135 , 30 , 25 , 125 , 125 , 35 , 135
Data 45 , 145 , 40 , 35 , 135 , 135 , 55 , 55 , 155 , 30 , 130 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 25 , 30 , 35 , 35
Data 30 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 25 , 30 , 35 , 35 , 4 , 4 , 30 , 40 , 4 , 4 , 35 , 55
Data 155 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 35 , 135 , 30 , 25 , 125 , 35 , 135 , 45 , 145 , 40 , 35 , 4 , 55 , 40 , 35
Data 28 , 35 , 40 , 42 , 4 , 4 , 55 , 52 , 45 , 145 , 30 , 130 , 35 , 40 , 40 , 45 , 40 , 45 , 45 , 145 , 45 , 145 , 55 , 52
Data 45 , 145 , 30 , 130 , 25 , 30 , 35 , 40 , 40 , 35 , 30 , 130 , 30 , 130 , 25 , 22 , 20 , 20 , 22 , 122 , 25 , 125 , 30 , 25
Data 22 , 22 , 25 , 125 , 30 , 130 , 40 , 45 , 25 , 30 , 30 , 35 , 135 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4 , 4 , 4 , 4

'Strophe 3
Data 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 25 , 30 , 30 , 35 , 35
Data 135 , 30 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 55 , 25 , 30 , 35 , 35 , 4 , 4 , 30 , 40 , 4 , 4 , 35 , 55
Data 155 , 4 , 4 , 4 , 4 , 4 , 4 , 35 , 135 , 30 , 25 , 125 , 125 , 35 , 135
Data 45 , 145 , 40 , 35 , 135 , 135 , 55 , 55 , 155 , 30 , 130 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 25 , 30 , 35 , 35
Data 135 , 30 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 25 , 30 , 35 , 35 , 4 , 4 , 30 , 40 , 4 , 4 , 35 , 55
Data 155 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 35 , 135 , 30 , 25 , 125 , 35 , 135 , 45 , 145 , 40 , 35 , 4 , 55 , 40 , 35
Data 28 , 35 , 40 , 42 , 4 , 4 , 55 , 52 , 45 , 145 , 30 , 130 , 35 , 40 , 40 , 45 , 40 , 45 , 45 , 145 , 45 , 145 , 55 , 52
Data 45 , 145 , 30 , 130 , 25 , 30 , 35 , 40 , 40 , 35 , 30 , 130 , 30 , 130 , 25 , 22 , 20 , 20 , 22 , 25 , 25 , 125 , 30 , 25
Data 22 , 22 , 25 , 125 , 30 , 130 , 40 , 45 , 40 , 30 , 30 , 35 , 135 , 35 , 28 , 28 , 128 , 128

'Outro
Data 4 , 4 , 4 , 4 , 22 , 22 , 20 , 22 , 30 , 40 , 140 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4
Data 22 , 22 , 22 , 20 , 22 , 30 , 40 , 140 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4
Data 22 , 22 , 22 , 20 , 22 , 30 , 40 , 140 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4
Data 4 , 22 , 22 , 20 , 22 , 30 , 40 , 140 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4
Data 22 , 22 , 22 , 20 , 22 , 30 , 40 , 140 , 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4
Data 35 , 28 , 28 , 128 , 128 , 4 , 4 , 4
Data 35 , 40 , 40 , 140 , 140 , 4 , 4 , 4

Data 0                                                      'Ende der Melodie


Da der µC so unterfordert war, habe ich ihm GLaDOS Audiospur aus einem Teil der Credits von Portal Still Alive einprogrammiert. Dies wird abgespielt, sobald der µC strom bekommt oder sinnlos aufgeweckt wird. Die Melodie wird dann über den Motor bei 1/10 Leistung wieder gegeben. Dies ist der Teil:

der µC trifft die Töne leider nicht ganz, aber man kann es erkennen.
Hintergrund: Ich finde es eben toll, wenn ich das System einschalte und es mir sagt, dass es noch lebt.
Philosoph: Sein oder nicht sein? - Elektroniker: Das ist Wahr.
Benutzeravatar
Nachthimmel
 
Beiträge: 93
Registriert: 06.09.2010, 19:35
Wohnort: Villingen-Schwenningen


Zurück zu Suche

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast