# dakmotor.py - het werkpunt van de dakmotor (gelijkstroommotor met worm 1:50) uitrekenen
import math

R, K, I0 = 1.2, 0.030, 0.25          # ankerweerstand (ohm), motorconstante (N m/A = V s/rad), nullaststroom (A)
OVERBRENGING, RENDEMENT = 50, 0.40   # worm, zelfremmend
r = 0.100 / (2 * math.pi)            # tandriemschijf: 100 mm riem per omwenteling


def werkpunt(U, F):
    """Stroom, toerental en rendement bij spanning U (V) en riemkracht F (N)."""
    M = F * r                                            # koppel aan de uitgaande as (N m)
    I = I0 + M / (RENDEMENT * OVERBRENGING * K)          # koppel ~ stroom
    w_motor = (U - R * I) / K                            # toerental ~ spanning min R I (tegen-emk)
    n = w_motor / OVERBRENGING * 60 / (2 * math.pi)      # toeren per minuut aan de schijf
    v = w_motor / OVERBRENGING * r                       # snelheid van de riem (m/s)
    rendement = M * w_motor / OVERBRENGING / (U * I)
    return I, n, v, rendement


print("   F (N)   I (A)   n (tpm)   v (m/s)   rendement")
for F in (0, 30, 60, 90, 120):
    I, n, v, eta = werkpunt(12.0, F)
    print(f"{F:8d}{I:8.2f}{n:10.1f}{v:10.3f}{eta:11.0%}")

# welke gemiddelde spanning geeft 0,10 m/s bij 60 N?
I60 = werkpunt(12.0, 60)[0]
U = R * I60 + K * (0.10 / r * OVERBRENGING)
for rail in (12.0, 12.8, 14.4):
    print(f"rail {rail:4.1f} V: gemiddeld {U:.2f} V nodig -> PWM {round(U / rail * 255)}")
