ACI Interrupt verhält sich willkürlich (BLDC BEMF mit Komparator)

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Aufgrund technischer Veränderungen ist der Mailverkehr innerhalb des Forums (Private Nachrichten) nur noch eingeschränkt möglich. Die Einschränkung ist notwendig, um zusätzliche Betriebskosten für das Forum zu vermeiden. Näheres zu den Hintergründen im Thread "Aktuelles zum Forum".Wir bitten um Verständnis.

    Hinweis kann nach Kenntnisnahme deaktiviert werden!

    • Bastlbeda schrieb:

      Oder vielleicht eine Tastlücke einbauen, so dass die Spulen kurz mal den Rotor frei laufen lassen bis er über den Punkt drüber ist?
      Die Grundvoraussetzung überhaupt etwas zum kommulieren zu bekommen.

      Bastlbeda schrieb:

      der knattert da so richtig als wie wenn er plötzlich umdrehen würde
      Genau das passiert ihm ja auch.
      Irgendwie fehlt etwas was eine Wunschdrehzahl vorgibt . Ein Tacho kann nicht die Drehzahl bestimmen, nur mitteilen wie weit sie abweicht. Andersherum hätte man Vollgas oder Vollbremsung.
      Wie läuft er denn wenn die Anlaufphase nicht beendet würde? Brauchbar ruhig oder rauh heiß laufend?
    • Pluto25 schrieb:

      irgendwie fehlt etwas was eine Wunschdrehzahl vorgibt
      Es gibt für diese Motoren Steuerungen, die arbeiten aber mit einem Sensor. Diese Sensoren sterben aber gerne und der Motor (inkl. Sensor) ist in einem geschlossenen Metallgehäuse. Für den einen, den ich hier fotografiert habe, habe ich das Gehäuse aufgeflext.
      Bei der ursprünglichen Steuerung wird einfach nur durch den Sensor gesteuert Block-kommutiert. Kein PWM, nichts. Und das ergibt eine Drehzahl von 2500 U/min.
      Da ich einige der Motoren habe, bei denen der Sensor defekt ist, will ich ihn sensorlos steuern. Ich habe aber auch einen mit funktionierendem Sensor und daran habe ich die Drehzahl ermittelt.
    • Wie wäre dann folgender Ansatz: Hochfahren bis 2500 Upm danach langsam die Pulsbreiten verringern (so das die Drehzahl erhalten bleibt und schauen welches brauchbare Signal sich ergibt. Dieses dann auswerten um die Pulsbreite der Last anzupassen. Oder wenn die Energieeffizienz nicht so wichtig ist um eine Warmeldung herauszugeben bzw wenns zu stark wird ganz abzuschalten.
      Die einseitige Taktung macht mir noch Sorgen. Werden die laufenden Motoren auch mit nur einseitigen Halbwellen betrieben?
    • Bastlbeda schrieb:

      Da ich einige der Motoren habe, bei denen der Sensor defekt ist, will ich ihn sensorlos steuern.
      Das wird mit dieser Art Motor nicht klappen, die Position des Sensors bestimmt auch die Drehrichtung.

      Bei der Darstellung des Spannungsverlaufes an der nicht angesteuerten Spule (zur Kommutierung) sollte die Kurve von Beitrag #89 abgebildet sein.
    • Pluto25 schrieb:

      Ja, aber niemals Phasex=-1.
      Schau dir die Schaltung aus Beitrag #1 und die AVR440 an, der "Sternpunkt" hängt an +12V

      Michael schrieb:

      Das wird mit dieser Art Motor nicht klappen, die Position des Sensors bestimmt auch die Drehrichtung.

      In der AVR440 geht es ja auch. Drehrichtung ist bei einer Kolbenpumpe egal. Den Anlauf kriege ich ja auch hin. Jetzt muss er die Kommutierung nur noch fortführen.

      Was mir aber jetzt gerade auffällt: Der Sensor ist exakt 90° zu den Wicklungen angeordnet. Liegt darin der Unterschied?

      Das sieht man auch am Blockschema:
      SchemaMotor.jpg

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Bastlbeda ()

    • Wie wäre es, wenn du den Motor so ansteuerst wie beim Anlauf. Also von Hand Kommutierst.
      Den AC-Interrupt erst mal aus. Aber die Abschaltung der Phase mit Timer zur Sicherheit drin lassen.

      So beschleunigst du den Motor auf eine vernünftige Drehzahl. Z.B. auf 1000 Ump oder viellicht auch mehr.

      Und nun Oszillographierst du das Signal am Drain (CH1) und das daraus gewonnene Signal am Komparator (CH2).

      Vielleicht musst du bisschen mit dem Timer spielen, also die Einschaltdauer einer Phase etwas anpassen.

      Man sollte dann auf dem Oszillogramm eine Mischung aus den Oszillogrammen sehen von Post #89 und #184.
      Also man sollte sehen, wie die induzierte Spannung überlagert ist.

      Wie gesagt du musst dafür den AC-Interrupt ausschalten und wie beim Anlauf von Hand die Spulen abwechselb bestromen und so eine Drehzahl von 1000 Ump und mehr erreichen.
      Du hast ja gesagt, der Motor würde dann drehen. Und das ist auch wichtig wegen der Induktionsspannung vom Magneten.
    • @Bastlbeda jetzt lass doch den Motor nach der Hochlaufphase einfach mal weiterlaufen

      BASCOM-Quellcode

      1. '************** 2-Phasen-BLDC-Motorsteuerung Zwangskommutierung ********************
      2. $regfile = "attiny44.dat "
      3. $crystal = 1200000
      4. $hwstack = 32
      5. $swstack = 32
      6. $framesize = 32
      7. 'Variablen:
      8. Dim Lauf_flag As Bit
      9. Dim Aktivephase As Bit '1= Phase 1, 0 = Phase 0
      10. Dim Trigger As Bit 'ACI Interrupt setzt dieses Bit zur Kennzeichnung einer Kommutierung
      11. Const Timer0_preload = 115
      12. '********************************************************************************************
      13. Config Pina.6 = Input 'Laufbefehl "T"-Signal an (Pin 7)
      14. Run Alias Pina.6
      15. Config Porta.5 = Output 'Ausgang Phase1 (Pin 8)
      16. Phase1 Alias Porta.5
      17. Config Portb.0 = Output 'Ausgang Phase0 (Pin 2)
      18. Phase0 Alias Portb.0
      19. Config Portb.1 = Output 'LED (Pin 3), Ersatzphase1
      20. Ersatzphase1 Alias Portb.1
      21. Config Portb.2 = Output 'LED (Pin 5), Ersatzphase0
      22. Ersatzphase0 Alias Portb.2
      23. Config Timer0 = Timer , Prescale = 256
      24. On Timer0 Timer0_interrupt '‹berlauf alle xxx ms
      25. Enable Timer0
      26. Stop Timer0
      27. 'Acsr.acbg = 1 'Bandgap-Referenzspannung einschalten
      28. Adcsra.aden = 0 'ADC is switched off (zur Mux-Nutzung f¸r Comparator)
      29. Adcsrb.acme = 1 'Analog Comparator Multiplexer Enable
      30. Config Aci = On , Trigger = Falling
      31. On Aci Kommutiere
      32. Enable Aci
      33. Enable Interrupts
      34. '*********
      35. 'Programm
      36. '*********
      37. Do
      38. Anfang:
      39. Phase1 = 0
      40. Phase0 = 0 'stoppt den Motor
      41. Aktivephase = 0
      42. '*****************************************************************************************
      43. Do
      44. 'Abfrage Start
      45. Lauf_flag = Run
      46. Gosub Anlauf
      47. Enable Aci 'Kommutierung per Interrupt (ACI)
      48. Do
      49. Lauf_flag = 1
      50. If Trigger = 1 And Aktivephase = 0 And Lauf_flag = 1 Then 'wenn Trigger=1 und Lauf_flag=1 und AktivePhase =0
      51. Disable Aci
      52. Phase1 = 1
      53. Phase0 = 0
      54. Ersatzphase1 = 1 'LED als Ersatz f¸r kommutierte Phase 1
      55. Ersatzphase0 = 0 'LED als Ersatz f¸r kommutierte Phase 0
      56. Timer0 = Timer0_preload
      57. Aktivephase = 1
      58. Trigger = 0
      59. Admux = 4
      60. Waitms 10
      61. Enable Aci
      62. Elseif Trigger = 1 And Aktivephase = 1 And Lauf_flag = 1 Then 'wenn Trigger=1 und Lauf_flag=1 und AktivePhase =1
      63. Disable Aci
      64. Phase1 = 0
      65. Phase0 = 1
      66. Ersatzphase1 = 0 'LED als Ersatz f¸r kommutierte Phase 1
      67. Ersatzphase0 = 1 'LED als Ersatz f¸r kommutierte Phase 0
      68. Timer0 = Timer0_preload
      69. Aktivephase = 0
      70. Trigger = 0
      71. Admux = 2
      72. Waitms 10
      73. Enable Aci
      74. End If
      75. Loop
      76. Loop
      77. '*****************************************************************************************
      78. Loop
      79. End
      80. Kommutiere:
      81. Trigger = 1
      82. Return
      83. Timer0_interrupt: 'wenn Timer0_Preload ¸berschritten, also xx ms
      84. Phase1 = 0
      85. Phase0 = 0
      86. Ersatzphase1 = 0
      87. Ersatzphase0 = 0
      88. Return
      89. Anlauf:
      90. '*********** Kommutierung f¸r Anlauf **************************
      91. Phase1 = 0 'Positionierung
      92. Phase0 = 1
      93. Waitms 70
      94. Phase1 = 0
      95. Phase0 = 0
      96. Waitms 95 'Ruhezeit f¸r Positionierung
      97. '___________________________________________________________________
      98. Phase0 = 0
      99. Phase1 = 1
      100. Waitms 70
      101. Phase0 = 1
      102. Phase1 = 0
      103. Waitms 70
      104. Phase0 = 0
      105. Phase1 = 1
      106. Waitms 60
      107. Phase0 = 1
      108. Phase1 = 0
      109. Waitms 60
      110. Phase0 = 0
      111. Phase1 = 1
      112. Waitms 50
      113. Phase0 = 1
      114. Phase1 = 0
      115. Waitms 50
      116. Phase0 = 0
      117. Phase1 = 1
      118. Waitms 45
      119. Phase0 = 1
      120. Phase1 = 0
      121. Waitms 45
      122. Phase0 = 0
      123. Phase1 = 1
      124. Waitms 40
      125. Phase0 = 1
      126. Phase1 = 0
      127. Waitms 40
      128. Phase0 = 0
      129. Phase1 = 1
      130. Waitms 35
      131. Phase0 = 1
      132. Phase1 = 0
      133. Waitms 35
      134. Phase0 = 0
      135. Phase1 = 1
      136. Waitms 25
      137. Phase0 = 1
      138. Phase1 = 0
      139. Waitms 24
      140. Phase0 = 0
      141. Phase1 = 1
      142. Waitms 23
      143. Phase0 = 1
      144. Phase1 = 0
      145. Waitms 22
      146. Phase0 = 0
      147. Phase1 = 1
      148. Waitms 18
      149. Phase0 = 1
      150. Phase1 = 0
      151. Waitms 18
      152. Phase0 = 0
      153. Phase1 = 1
      154. Waitms 16
      155. Phase0 = 1
      156. Phase1 = 0
      157. Waitms 16
      158. Phase0 = 0
      159. Phase1 = 1
      160. Waitms 16
      161. Phase0 = 1
      162. Phase1 = 0
      163. Waitms 16
      164. Phase0 = 0
      165. Phase1 = 1
      166. Waitms 16
      167. Phase0 = 1
      168. Phase1 = 0
      169. Waitms 16
      170. Phase0 = 0
      171. Phase1 = 1
      172. Waitms 16
      173. Phase0 = 1
      174. Phase1 = 0
      175. Waitms 16
      176. Phase0 = 0
      177. Phase1 = 1
      178. Waitms 16
      179. Do
      180. Phase0 = 1
      181. Phase1 = 0
      182. Waitms 16
      183. Phase0 = 0
      184. Phase1 = 1
      185. Waitms 16
      186. Loop
      187. Phase1 = 0 'stoppt den Motor
      188. Aktivephase = 0
      189. Admux = 2
      190. Enable Aci
      191. Start Timer0
      192. Return
      Alles anzeigen
      durch die Zeilen 248 und 256
      und dann mit dem Oszi an drain und von mir aus an 12V. Das man endlich mal die Abschaltinduktion und die Induktion durch das Drehen der Rotors sieht. Wenn der nur zappelt, wird das nix, da einen Nulldurchgang zu sehen.

      ok, @Mitch64, du hast das auch schon erkannt, was mal wichtig wäre :thumbup:
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • Und nicht vergessen im Code von @tschoeatsch in Zeile 48 den Comparator-Interrupt zu deaktivieren.

      An den Schaubildern kann man schön die Wickelrichtung und auch die technische Stromrichtung (plus nach minus) erkennen.
      Mit der rechten Hand Regel kann man nun schön feststellen, wo beim Bestromen der Nord und wo der Südpol ist.

      Wie die rechte Hand Regel funkltioniert ist auf der Seite beschrieben, auch ein Video gibts, wer nicht lesen mag.

      Hier eine Erklärung. Etwas nach unten scrollen.

      Und hier das Video direkt.

      Zu beachten ist die technische Stromrichtung und man muss die rechte Hand nehmen.

      Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Mitch64 ()

    • Also, der Motor hat doch eine Sensorspule integriert. Da brauchst du doch nicht den Umweg über die synchronisation über die gerade nicht bestromte Wicklung nehmen. Hänge doch mal das Oszi an diese Sensorwicklung und schau dir den Verlauf an. Nutze die Spannung zum triggern und du brauchst nichts hin und herschalten. Der Motor hat einen Sensor und du nutzt ihn nicht :?:
      Hör doch auf mit der hin und herschalterei des Komparators. Der Motor ist nun mal gebaut für den Sensorbetrieb, was willst du mehr :D
    • @Mitch64 der aci stört nicht, weil der code garnicht so weit abgearbeitet wird. Ich würde ja auch direkt am drain messen, um dann, wenn man was erkennt, die Spannungsteiler neu berechnen, dass man den für ain0 mit den 5V betreibt und nicht mit den wackligen 12V.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------
    • oscar schrieb:

      Der Motor hat einen Sensor und du nutzt ihn nicht
      Mir geht es um die Motoren, bei denen die Sensorspule durchgebrannt ist

      So, jetzt habe ich die Do-Loop-Schleife eingebaut und ihn damit weiterdrehen lassen.
      Graph Drain (blau) und BEMF der Gegenphase am Pin des Tiny (gelb):
      D_B.jpg

      und hier Drain (blau) und die 12V-Versorgung (gelb):
      D_12v.jpg

      Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von Bastlbeda ()

    • Bastlbeda schrieb:

      Mir geht es um die Motoren, bei denen die Sensorspule durchgebrannt ist
      Tut mir leid, wie kann so eine Sensorspule "durchbrennen" . Willst du mir hier was vom Pferd erzählen? a_45_132ca9f5
      Das die Auswerteelektronik dahinter kaputtgeht kann ich mir noch vorstellen, aber eine einfache Spule, welche nichts weiter macht als eine Induktionsspannung durch die vorbeidrehenden Rotormagnetpole der Auswerteelektronik (z.B.Komparator) als Positionssignel zur Verfügung zu stellen....
      Außerdem hätten die Infos zum Motor(das das ein sensorgesteuerte Konstruktion) ist schon ganz am Anfang kommen können. Was soll diese Salamitaktik?
    • Also am Oszibild sieht man an der schräg abfallenden Flanke einen leichten Buckel. Ich denke das ist die Induktion von dem Magnet, wenn der an der Spule vorbei läuft.

      Ich sehe da schlechte Chancen das zur Kommutierung zu verwenden.

      Bringt mich aber auf eine neue Idee.

      Es geht doch darum, dass der Motor wieder läuft. Und ganz ohne Sensor läuft der doch jetzt rund nehme ich an.

      Kannst also auf den Schnickschnack mit dem Comparator und dem Interrupt ganz verzichten. Und einfach den Motor im Grunde wie du es jetzt hast auf Drehzahl bringen und halten.

      Motor läuft und Pumpe pumpt.

      Damit wäre dich dein Problem gelöst, oder?
    • An der Markierungslinie Schaltet der fet aus, an der nächsten senkrechten, blauen Linie der fet wieder ein. Zwischen den senkrechten Linien schaltet der 2. fet. Der soll schalten, wenn ein Nulldurchgang stattfindet. Das könnte dann in dem leichten Knick der blauen Kurve zu finden sein. Anfangs ist die Kurve steil, beide Induktionen addieren sich, im Knick nur die Abschaltinduktion, Nulldurchgang der 'Drehinduktion', und danach subtrahiert sich die schwache 'Drehinduktion' von der ausklingenden Abschaltinduktion. Wie man jetzt den Zeitpunkt dieses Knicks erwischt, puh, keinen Plan.
      Raum für Notizen

      -----------------------------------------------------------------------------------------------------

      -----------------------------------------------------------------------------------------------------