[ Foro de Python ]

ayuda

03-Jun-2023 04:27
Invitado (jessuss)
0 Respuestas

quien me puede ayudar de pasar el codigo siguiente para un sistema pid de temperatura, ahorita el codigo lo hace pero para el voltaje y nose como pasarlo
import warnings
warnings.simplefilter(action='ignore', category=FutureWarning)

from past.utils import old_div

# Checking path to access other files
try:
   from sippy import *
except ImportError:
   import sys, os

   sys.path.append(os.pardir)
   from sippy import *

#librerias necesarias
import pyfirmata as pf #librería de comunicación
import time as tm #de puertos
import numpy as np #librería numérica
import pylab as pl #para gráficas
from scipy import signal
from sippy import functionset as fset
from sippy import functionsetSIM as fsetSIM
import control as ctl
import harold as ha

port='COM3' #definición del puerto
#port = '/dev/ttyACM0'
board = pf.Arduino(port) #definición de la interface
tm.sleep(1) #retardo para facilitar la comunicación
it = pf.util.Iterator(board)#manejo del bus de datos
it.start() #inteligente de pyfirmata
Vi=6 #escalón de entrada al motor actuador
Vi_max=7.7;Vo_max=5#Voltajes de entrada y salida máximos
pwmPin = board.get_pin('d:11:p') #definición de salida PWM
a3 = board.get_pin('a:3:i')#definicón de entrada analógica
k=1000 #número de ciclos de muestreo
t = np.linspace(0, 20, k, endpoint=True)
y =(signal.square(0.3* np.pi * t)+1)/2
elapsed=np.zeros((1,k+1)) #vector de tiempo de muestreo
pwm_data=np.zeros((1,k+1)) #vector de datos de salida PWM
A3_data=np.zeros((1,k+1)) #vector de datos de entrada analógica
pwmPin.write(0) #apagar el motor actuador
tm.sleep(1); T_s=0.01#periodo de muestreo propuesto
for i in range(k):#inicio del ciclo de muestreo
   T = tm.time()#inicio del reloj de cada ciclo
   pwmPin.write((y[i]*Vi)/Vi_max)
   pwm_data[0,i]=pwmPin.read()*Vi_max#lectura del motor actuador
   A3_data[0,i]=a3.read()*Vo_max#lectura del motor generador
   tm.sleep(T_s)#aplicación del periodo propuesto
   elapsed[0,i] = tm.time() - T#periodo de muestreo real
pwmPin.write(0)#fin del ciclo de muestreo, apagado del motor

Ts=elapsed[:,1:k+1]#vector de datos de muestreo
Ts_promedio=np.sum(Ts)/k#promedio del tiempo de muestreo real
print("Ts=",Ts_promedio)#impresión del tiempo de muestreo
tm=range(k-1)*Ts_promedio#tiempo total transcurrido
#pl.plot(tm,pwm_data[0,:k-1],tm,A3_data[0,:k-1])
#pl.grid()#gráfica del comportamiento del sistema a una entrada escalón

##System identification
METHOD = ['N4SID', 'CVA', 'MOESP', 'PARSIM-S', 'PARSIM-P', 'PARSIM-K']
i=0
lege = METHOD[i]
u=pwm_data.reshape(1,k+1)
method = METHOD[i]
sys_id = system_identification(A3_data[0,:], pwm_data[0,:], method, SS_fixed_order = 3 )
xid, yid = fsetSIM.SS_lsim_process_form(sys_id.A, sys_id.B, sys_id.C, sys_id.D,u, sys_id.x0)

sys=ctl.ss(sys_id.A,sys_id.B,sys_id.C,sys_id.D,Ts_promedio)

SSz,T=ctl.reachable_form(sys)
tf=ctl.ss2tf(SSz)
Tf3=ha.Transfer(tf.num,tf.den,Ts_promedio)
G3 = ha.undiscretize(Tf3, method='tustin')
print(G3.num, G3.den)
T,Y=ctl.step_response(tf)
pl.plot(T,Y)
pl.grid()
pl.show()




(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)