¿Cómo puedo extraer la función de transferencia de un sistema no lineal desconocido?

0

Estoy tratando de hacer el control PID para mi sistema de motor de electroservo usando el método de ajuste nichols ziegler. Mi sistema tiene una salida de codificador SSI para el mecanismo de realimentación del motor. Usaré este conocimiento para el control. De acuerdo con el método nichols ziegler, debo conocer la función de transferencia de mi sistema. Pero no puedo encontrar exactamente su ecuación. Entonces, ¿cómo puedo extraer su función de transferencia? Necesito una metodología para esto. ¿Puedo extraer T.F. utilizando Matlab / Simulink o LAbview?

    
pregunta Cem

5 respuestas

0

El concepto de Función de transferencia solo se define para sistemas invariantes de tiempo lineal. Los modelos de sistemas no lineales prefieren atenerse a las descripciones de dominio de tiempo como ecuaciones diferenciales no lineales en lugar de descripciones de dominio de frecuencia.

Pero en términos de entrada y salida de corriente, su sistema de encoder de motor está lo suficientemente cerca de un sistema lineal que realmente no necesita para preocuparse por aspectos no lineales (a menos que esté tratando de controlar el ángulo del eje a micro -la precisión radiana!).

Quizás la forma más fácil de obtener un modelo lineal es aplicar un control de retroalimentación proporcional simple sintonizado para obtener un bucle estable, luego registrar los datos de entrada-salida en una respuesta escalonada. Luego ajuste los datos a la función de transferencia de bucle cerrado. Desde la función de transferencia de bucle cerrado puede calcular la función de transferencia de bucle abierto, factorizar la ganancia proporcional y voila : ¡su modelo de motor! Un modelo de motor de CC lineal simple se ve así: $$ \ frac {\ omega} {i} = \ frac {K_T} {Js + B} $$ donde $$ K_T $$ es la constante de par del motor, $$ J $$ es el eje motriz y la inercia de carga. y $$ B $$ es la amortiguación viscosa lineal de los cojinetes del motor

Quizás su proveedor de motores ya especifique estos parámetros, en cuyo caso no tiene que probar, puede escribir el modelo directamente.

Tenga en cuenta que incluso si está utilizando un motor síncrono de imán permanente, en la retroalimentación con un controlador de corriente rígida, el modelo se aproxima al modelo del motor de CC (cepillo).

    
respondido por el docscience
1

El ajuste de Ziegler-Nicholls no requiere que se conozca el TF, ese es el objetivo del método.

    
respondido por el Chu
0

Definitivamente, puede probar la Caja de herramientas de identificación del sistema de Matlab. La página oficial dice

  

Puede usar datos de entrada y salida de dominio de tiempo y dominio de frecuencia para   Identificar funciones de transferencia de tiempo continuo y tiempo discreto, proceso   modelos, y modelos de espacio de estado.

Que es lo que buscas.

    
respondido por el ozgur
0

Tu realmente tienes dos opciones.

El primero, como sugirió @LvW, es usar las especificaciones del motor como en la ilustración. Esto puede ser preciso pero también más difícil porque no todas las manchas estarán disponibles.

El segundo involucra lo que sugeriste. Aplicando una tensión al motor y registrando cómo se comporta su velocidad. En efecto, esto crea una respuesta escalonada que puede analizarse para encontrar las especificaciones para un sistema de primer orden o de segundo orden. Si el sistema oscila, entonces lo que desea es un segundo orden. Si el sistema no oscila, entonces puede utilizar un primer orden.

    
respondido por el vini_i
0

Hay dos métodos muy buenos para estimar funciones de transferencia. Busque moen4 y fitfrd.

Para usar moen4 necesitas básicamente una entrada y una salida de una prueba. El algoritmo luego calcula la función de transferencia que mejor se ajusta a los datos. Los resultados tienden a ser bastante buenos para algunos sistemas, y menos para los sistemas que tienen un comportamiento no lineal significativo (para los cuales no existe una función de transferencia lineal).

Aquí hay un código que puede usar tanto para frd fit como para moen4 fit. Puede trazar los datos de freq_response_frd (frd object) directamente usando la función bode () para obtener un diagrama de bode de sus datos de entrada. Sus datos de entrada deben tener una cobertura de frecuencia suficiente, así que use una señal de chirrido que aumenta con la frecuencia en el tiempo y recopile la respuesta resultante en otra matriz. Luego, pase ambas matrices a id_model_moen y obtendrá su función de transferencia nuevamente.

Por lo general, limito las frecuencias que se analizan porque si traza el rango completo devuelto por fft obtendrá mucho ruido fuera del rango para el que incluso tiene datos de prueba, por lo que es una parte inútil de los resultados.

function [mag, phase, f] = freq_response_mag_phase(out, in, t, freqlim)
    dt = (t(end) - t(1)) / (length(t) - 1);  
    NFFT = length(t);
    Fs = 1.0 / dt;                      
    fb = fft(out, NFFT);                
    fa = fft(in, NFFT);
    f = [0:NFFT-1]*Fs/NFFT * 2 * pi;
    % find first bin after our test range. We will discard bins after it.
    ix = ceil(NFFT/2); 
    if(exist("freqlim", "var"))         
        ix = find(f>freqlim,1);         
    end               
    f = f(1:ix);               
    mag = abs(fb(1:ix)) ./ abs(fa(1:ix));    
    phase = unwrap(angle(fb(1:ix))) - unwrap(angle(fa(1:ix)));
end

function response = freq_response_frd(out, in, t, freqlim) 
    if(exist("freqlim", "var"))
        [mag, phase, f] = freq_response_mag_phase(out, in, t, freqlim);
    else
        [mag, phase, f] = freq_response_mag_phase(out, in, t);
    end
    response = frd(mag .* exp(1i .* phase), f);
end

function sys_tf = id_model_frd(out, in, t, nr)
    resp = freq_response_frd(out, in, t);    
    sys = fitfrd(resp, nr);
    [b, a] = ss2tf(minreal(sys));
    sys_tf = tf(b, a);                  
end

function sys_tf = id_model_moen(out, in, t, nr)
    dt = (t(end) - t(1)) / (length(t) - 1);  
    sys = moen4(iddata(out, in, dt), nr);    
    [b,a] = ss2tf(d2c(sys));            
    sys_tf = tf(b, a);                  
end
    
respondido por el Martin

Lea otras preguntas en las etiquetas