Advertisement
DeaD_EyE

ESP32: Motor mit PWM, Strommessung, Fenster-Funktion und Timeout

Oct 22nd, 2024
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 3.59 KB | None | 0 0
  1. import time
  2.  
  3. from collections import deque
  4. from machine import Pin, I2C, ADC, PWM
  5. from ina226 import INA226
  6.  
  7.  
  8. class Poti:
  9.     def __init__(self, pin):
  10.         self._adc = ADC(Pin(pin))
  11.         self._last = None
  12.        
  13.     @property
  14.     def value(self):
  15.         current = round(self._adc.read_u16() / 65535 * 100)
  16.         if self._last is not None and self._last != current:
  17.             # print(f"Abschaltung bei {current} mA")
  18.             ...
  19.            
  20.         self._last = current
  21.         return current
  22.  
  23.  
  24. SDA = Pin(15)
  25. SCL = Pin(16)
  26. ON = Pin(3, mode=Pin.IN, pull=Pin.PULL_DOWN)
  27. MOT = PWM(Pin(5), freq=5000, duty_u16=0)
  28.  
  29. bus = I2C(1, sda=SDA, scl=SCL)
  30. ina = INA226(bus, 0x40)
  31. poti = Poti(9)
  32.  
  33. timeout = None
  34. window_timeout = None
  35. window_active = True
  36.  
  37. motor_deaktiviert = False
  38.  
  39. queue = deque([0]*20, 100)
  40.  
  41. while True:
  42.     # hier wird zur Schlange einfach der Status das Eingangs (0 oder 1)
  43.     # angehangen. Wenn die Schlange voll ist, wird das älteste Element verworfen
  44.     queue.append(ON())
  45.  
  46.     # Eingang abfragen
  47.     # Anstatt den Eingang direkt abzufragen, müssen alle
  48.     # Elemente in der Warteschalnge 1 sein
  49.     if all(queue):
  50.         # Wenn der Timeout gesetzt ist und größer als die aktuelle Zeit (in ms),
  51.         # wird der Motor deaktiviert und zurück zum Kopf der Endlosschleife
  52.         if timeout is not None and time.ticks_ms() > timeout:
  53.             MOT.duty(0)
  54.             if motor_deaktiviert:
  55.                 print("Motor ist blockiert, Eingangssignal wird ignoriert und der Motor abgeschaltet")
  56.                 motor_deaktiviert = False
  57.             continue
  58.        
  59.         # Bedingung des Timeouts noch nicht erfüllt
  60.         # dann wird diese Position erreicht
  61.         MOT.duty(512)
  62.        
  63.         # Fenster-Funktion, um eine vorgegebene Zeit keine
  64.         # Strom-Messungen durchzuführen. Hilft bei Getriebemotoren zur
  65.         # Überwindung der Hemmung.
  66.        
  67.         # Fenster ist aktiv, aber noch kein Timeout für das
  68.         # Fensrer gesetzt.
  69.         if window_active and window_timeout is None:
  70.             window_timeout = time.ticks_ms() + 5000
  71.             print("Fenster geöffnet")
  72.             continue
  73.         # Fenster ist aktib und der Timeout ist auch gesetzt
  74.         elif window_active and window_timeout:
  75.             if time.ticks_ms() < window_timeout:
  76.                 continue
  77.        
  78.         if window_active:
  79.             print("Fenster geschlossen")
  80.         # window_active wird jetzt zurückgesetzt
  81.        
  82.         # wenn keine der vorheringen Bedingungen erfüllt ist,
  83.         # wird diese Position erreicht
  84.         # Fenster-Funktion zurücksetzen
  85.         window_active = False
  86.         window_timeout = None
  87.        
  88.         # Ausgabe des Stroms in mA
  89.         current = round(ina.current * 1000, 0)
  90.    
  91.         # Wenn der Strom größer ist, als durch das Poti der vorgebene Wert (bis 100mA)
  92.         # wird dieser Zweig ausgeführt
  93.         if current > poti.value:
  94.             # print(f"Motor: {current:.0f} mA")
  95.             # Motor anhalten
  96.             MOT.duty(0)
  97.             # Timeout setzen, damit der Motor nach gegebener Zeit
  98.             # den aktiven Steuerbefehl ignoriert
  99.             if timeout is None:
  100.                 timeout = time.ticks_ms() + 2_000
  101.     else:
  102.         # Motor wird nicht angesteuert
  103.         # Motor anhalten
  104.         # timeout zurücksetzen
  105.         # Fenster aktiv schalten und die None window_timeout zuweisen
  106.        
  107.         MOT.duty(0)
  108.         timeout = None
  109.         window_active = True
  110.         window_timeout = None
  111.        
  112.         motor_deaktiviert = True
  113.  
  114.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement