Files
2025-05-13 01:34:53 +03:00

62 lines
1.4 KiB
Python

import os
import matplotlib.pyplot as plt
from control.matlab import *
import numpy as np
# Input: Current (A)
# Output: Torque (Nm)
# Params: Kt (Nm/A)
def motor(Kt):
return tf(Kt, 1)
# Mass-Spring-Damper
# Input: Force
# Output: Position
# Params: m (kg)
# b
# k (N/m)
def mass(m, b, k):
A = [[0, 1.], [-k/m, -b/m]]
B = [[0], [1/m]]
C = [[1., 0]]
return ss(A, B, C, 0)
# Input: Torque (Nm)
# Output: Force (N)
# Params: r (m)
def pulley(r):
return tf(r, 1)
# Make s a transfer function s/1
s = tf('s')
print(s)
# build a new transfer function using our variable s as a handy placeholder
sys = 1 / (s*s + s + 1)
print(sys)
# Hit the system with a step command
yout, T = step(sys)
plt.plot(T, yout)
# convert our continuous time model to discrete time via Tustin at 0.01s timestep
sysd = c2d(tf(sys), 0.01, method='tustin')
print(sysd)
# Hit the discrete system with a step command, and sample it at 0.01 timestep from 0 to 14 seconds
yout, T = step(sysd, np.arange(0, 14, 0.01))
plt.plot(T, yout)
plt.legend(['Continuous', 'Discrete'])
# Build a system based on the series connection of the motor, pulley, and mass "blocks"
sys = series(motor(2.5), pulley(0.015), mass(0.10, .1, .1))
print(tf(sys))
# Step our series system, returning y (outputs) and x (states)
yout, T, xout = step(sys, return_x=True)
plt.figure()
plt.plot(T, yout)
plt.plot(T, xout)
plt.legend(['Displacement', r'$x$', r'$\dot{x}$'])
plt.show()