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!

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

      Hallo Gemeinde,

      ich bastle gerade an einem einfachen BLDC-Treiber für einen 2-phasigen Motor mit einem ATTINY44. Ja, er ist wirklich nur 2-phasig, Drehrichtung ist egal und ich brauche auch keine Drehzahlsteuerung (also kein PWM). Deshalb schreibe ich "einfacher" BLDC-Treiber. Er treibt nur eine Kolbenpumpe an. Drehzahl ist nur so ca. 2500 RPM, sollte also auch kein großes Timingproblem sein. Aber für mich wohl doch nicht so "einfach"

      Also, per Zwangskommutierung bringe ich ihn zum Laufen (das klappt auch). Danach will ich mit dem integrierten Komparator über die BEMF den Nulldurchgang erfassen.
      Das habe ich in sofern hin bekommen, dass ich per Interrupt 2 LEDs (als Ersatz für die Phasen) zum Wechselblinken bekomme.
      Der Motor startet per Zwangskommutierung, dann läuft er etwas nach und während dessen blinken die beiden LEDs abwechselnd.

      Wenn ich jetzt im Code zu den beiden LED-Ausgängen auch noch die beiden Phasen des Motors ansteuere, passiert nichts mehr. (Im Code einfach die auskommentierten Zeilen: "Phase1 =... und Phase0 =... aktiviert) Der Motor startet per Zwangskommutierung, dann läuft er etwas nach aber weder die LEDs blinken, noch dreht er weiter. Warum tut das Ding nicht mehr das, was es vor dem Zuschalten der beiden Phasen getan hat?

      Anbei die Schaltung und der Code:2P_BLDC.pdf
      2P_BLDC.bas
    • Musst du vielleicht!! deine Phasen wieder ausschalten, dass es zu einem interrupt kommt, oder evtl. die Phasen vertauschen?

      Edit: nach Schaltbild und Programm sollte es aber schon passen. Toggle doch mal im aci-interrupt eine Led, ob da auch hingesprungen wird.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Schalte beim Hochlaufen den aci ein und toggle im interrupt eine Led. Da sollte es ja auch blinken.

      Evtl das Config Aci = On , Trigger = Toggle auf rising oder falling umstricken. Wenn nix leuchtet, bei deinem Testlauf, dann muss ja trigger=0 sein und so bleiben.
      Raum für Notizen

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

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

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

    • Musst du nicht überhaupt den Mux einstellen, dass ein interrupt ausgelöst werden kann? Nach dem Hochlaufen schaltest du den int ein, gibst aber keinen Eingang dazu an. Nach dem Hochlaufen müsste Phase0=1 werden, also den admux auf 4 stellen.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Bastlbeda schrieb:






      Der Motor startet per Zwangskommutierung, dann läuft er etwas nach und während dessen blinken die beiden LEDs abwechselnd.

      Wenn ich jetzt im Code zu den beiden LED-Ausgängen auch noch die beiden Phasen des Motors ansteuere, passiert nichts mehr. (Im Code einfach die auskommentierten Zeilen: "Phase1 =... und Phase0 =... aktiviert) Der Motor startet per Zwangskommutierung, dann läuft er etwas nach aber weder die LEDs blinken, noch dreht er weiter.
      Also ganz schlau werde ich nicht aus Deinen Zeilen: Im ersten (Zitat) Absatz oben schreibst Du das im Nachlauf die LED blinken/leuchten - und im zweiten Absatz läuft der Motor nach und die LED blinken/leuchten nicht...

      Wie nun? Das wäre wichtig zur Hilfe...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Bastlbeda schrieb:

      Ja, der Trigger war im code falsch angegeben. Das war nur zum Herumprobieren. Auch mit falling tut sich nichts mehr. Wenn ich aber die beiden Phasen wieder auskommentiere, dann wechseln die LEDs, solange der Motor nachläuft.

      Den admux brauche ich ja, weil ich auf 2 Phasen abwechselnd überwache
      Zu dem admux kommt das Programm doch erst, wenn trigger=1 wird. Mit welcher Quelle wird vorher der int ausgelöst? Oder ist von hausaus trigger=1?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Die Variable Trigger wird nur an einer Stelle zugewiesen nach dem Programmstart, im Interrupt. Das heißt, wenn ein Interrupt ausgelöst wurde, dann bleibt die Variable immer gesetzt.

      Wenn der MUX nicht anders konfiguriert wurde, dann wird als Eingang immer AIN0 & AIN1 verwendet. (aus der Doku)

      Das passt aber irgendwie nicht - weil es ja blinkt. Nur ist die Frage ob das im Nachlaufen passiert...
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Zu tschoeatsch:
      ohne admux ist der AC immer auf AIN (admux2). Ich warte also bis da ein Interrupt ausgelöst wird.

      zu monkye:
      das mit der immer gesetzt bleibenden Variable ist interessant.
      Weil: mittlerweile geht die LED an und törggelt nicht mehr..... Das Ding tut was es will oder ich hab den Überblick verloren.

      Also muss ich in meiner If-then-elseif-Schleife am Ende dir Variable Trigger wieder auf 0 setzen????
    • @monkye durch das Umschalten (admux) toggelt ja der Ausgang vom ac, es werden ja jedesmal interrupts ausgelöst. Trigger toggelt also. Wenn trigger=0, dann wird der Eingang nicht mehr umgeschaltet, weil if nicht true wird, aber die Phase wechselt, also wird wieder ein int ausgelöst.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Probier mal im int ein flag zu setzen und in den if-Zweigen das flag zu löschen.
      Wenn jetzt eine Led an geht, sich aber nicht ändert, dann scheint eine jetzt eingeschaltete Phase den int zu stören.

      Stimmt die Polarität dann nicht mehr. Müsste man einen highside-Treiber nehmen?
      Raum für Notizen

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

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

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

    • Danke für den Tipp @tschoeatsch, hab das Trigger=Toggle nicht bedacht.

      Solange der Motor dreht müssten ja Impulse kommen... Aber wenn die induzierte Spannung dann nicht mehr reicht für einen Interrupt, dann muss alles stehenbleiben - schließlich ist die Kommutierung an die Interrupt‘s geknüpft. Was passiert wenn Du per Hand den Motor drehst?
      Aus datenschutzrechtlichen Gründen befindet sich die Kontaktdaten auf der Rückseite dieses Beitrages.
    • Es gibt doch einen interrupt, wenn die Spannung an der Phase kleiner als der am ain0 ist. Das wird durch die induktion so sein. Könnte es sein, dass bei schneller Drehung die Spannung am ain1 nicht mehr über ain0 kommt und so kein int mehr ausgelöst wird?
      Mal die Spannung am ain0 verkleinern.
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Nö, nicht durchgebrannt. Anlaufen tut er noch, er läuft auch nach, aber es wird kein int mehr ausgelöst.

      Von hand drehen ist nicht so leicht, da ist das Pumpengestänge drauf.

      Aber wenn er anläuft und auch noch ein wenig nachläuft, dann muss doch der int ausgelöst werden????

      Hab das jetzt mal zum Test geändert. Nach dem Anlauf ist ein "wait 3" drin, den int habe ich zum test auf toggle gestellt (nicht mehr falling) und in der ISR toggle ich nur eine LED.... nix passiert
    • War die Induktionsspannung nach dem Abschalten vom fet zu hoch? Hätte es noch einen Reihenwiderstand gebraucht, der mit den internen Dioden die Eingangspins schützt?
      Raum für Notizen

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

      -----------------------------------------------------------------------------------------------------
    • Hm.... möglich, aber ich hab auch einen zweiten tiny probiert... gleiches verhalten.
      Ich löt jetzt mal 2 stk 5v1 Zennerdioden dran und probiere es mit einem neuen tiny.
      Reihenwiderstand geht nachträglich schwer, deshalb Z-Dioden

      Aber wie ist das eigentlich mit den internen PullUp´s oder PullDowns? Sind die an den AC bzw ADC-Eingängen zugeschaltet? muss ich die erst abschalten?