Controlador de control Pid mediante ejemplos prácticos. Ley de control diferencial integral proporcional (PID). Configurar la ganancia proporcional

Controlador proporcional-integral-derivado (PID)- un dispositivo en un circuito de control con retroalimentación. Se utiliza en sistemas de control automático para generar una señal de control con el fin de obtener la precisión y calidad requeridas del proceso transitorio. El controlador PID genera una señal de control, que es la suma de tres términos, el primero de los cuales es proporcional diferencia entre señal de entrada y señal de retroalimentación(señal de discordancia), la segunda es la integral de la señal de discordancia, la tercera es la derivada de la señal de discordancia.

Si algunos de los componentes no se utilizan, entonces el regulador se llama integrando proporcionalmente , diferenciando proporcionalmente , proporcional etc.

YouTube enciclopédico

    1 / 4

    ✪ Controlador proporcional

    ✪ CodeSys 2.3 Controlador PID PLC Aries Lección No. 1

    ✪ CodeSys 2.3 Controlador PID PLC Aries Lección No. 3

    ✪ CodeSys 2.3 Controlador PID PLC Aries Lección No. 2

    Subtítulos

información general

Componente proporcional

El componente proporcional produce una señal de salida que contrarresta la desviación de la variable controlada del valor establecido observado en un momento dado. Cuanto mayor es la desviación, mayor es. Si aporte la señal es igual al valor especificado, entonces día libre igual a cero.

Sin embargo, cuando se utiliza sólo un controlador proporcional, el valor de la variable controlada nunca se estabiliza en el punto de ajuste. Existe el llamado error estático, que es igual a una desviación de la variable controlada que proporciona una señal de salida que estabiliza la variable de salida exactamente en este valor. Por ejemplo, en un controlador de temperatura, la señal de salida (potencia del calentador) disminuye gradualmente a medida que la temperatura se acerca al punto de ajuste y el sistema se estabiliza a una potencia igual a la pérdida de calor. La temperatura no puede alcanzar el valor establecido, ya que en este caso la potencia del calentador será cero y comenzará a enfriarse.

Cuanto mayor sea el coeficiente de proporcionalidad entre la señal de entrada y salida (ganancia), menor será el error estático; sin embargo, si la ganancia es demasiado grande y hay retrasos (retraso), pueden comenzar auto-oscilaciones en el sistema, y ​​con un mayor Al aumentar el coeficiente, el sistema puede perder estabilidad.

Componente integrador

El componente integrador es proporcional a la integral de tiempo de la desviación de la variable controlada. Se utiliza para eliminar un error estático. Permite al controlador tener en cuenta el error estático a lo largo del tiempo.

Si el sistema no experimenta perturbaciones externas, después de un tiempo la variable controlada se estabilizará en el valor dado, la señal del componente proporcional será igual a cero y la señal de salida será proporcionada completamente por el componente integrador. Sin embargo, el componente integrador también puede provocar autooscilaciones si su coeficiente se elige incorrectamente.

Componente diferenciador

El componente diferenciador es proporcional a la tasa de cambio de la desviación de la variable controlada y tiene como objetivo contrarrestar las desviaciones del valor objetivo que se predicen en el futuro. Las desviaciones pueden deberse a perturbaciones externas o a un retraso en la influencia del regulador sobre el sistema.

Teoría

El propósito del controlador PID es mantener el valor establecido X 0 de algún valor X cambiando otra cantidad tu. Significado X 0 se llama valor dado(o configuración, en tecnología), y la diferencia e = ( X 0 − x) - residual(o error [de regulación], en tecnología), desajuste o desviación de un valor respecto de un valor determinado. Las fórmulas que se dan a continuación son válidas en el caso de linealidad y estacionariedad del sistema, lo que rara vez es cierto en la práctica.

Señal de salida del regulador tu está determinada por tres términos:

u (t) = P + I + D = K p e (t) + K i ∫ 0 t e (τ) d τ + K d d e d t (\displaystyle u(t)=P+I+D=K_(p)\, (e(t))+K_(i)\int \limits _(0)^(t)(e(\tau))\,(d\tau )+K_(d)(\frac (de)(dt ) ))),

Dónde kp, k yo, k d - factores de ganancia componentes proporcionales, integradores y diferenciadores del controlador, respectivamente.

La mayoría de los métodos para sintonizar controladores PID utilizan una fórmula ligeramente diferente para la señal de salida, en la que los componentes integradores y diferenciadores también se multiplican por la ganancia proporcional:

u (t) = K p (e (t) + K i p ∫ 0 t e (τ) d τ + K d p d e d t) (\displaystyle u(t)=K_(p)\left(\,(e(t)) +K_(ip)\int \limits _(0)^(t)(e(\tau))\,(d\tau )+K_(dp)(\frac (de)(dt))\right))

En una implementación discreta del método para calcular la señal de salida, la ecuación toma la siguiente forma:

U (n) = K p E (n) + K p K i p T ∑ k = 0 n E (k) + K p K d p T (E (n) − E (n − 1)) (\displaystyle U( n)=K_(p)E(n)+K_(p)K_(ip)T\sum _(k=0)^(n)(E(k))+(\frac (K_(p)K_( dp))(T))(E(n)-E(n-1))),

Dónde T (\displaystyle T)- Tiempo de muestreo. Usando reemplazo K yo re yo s c r = K p K yo p T , K re re yo s c r = K p K d p T (\displaystyle K_(i)^(discr)=K_(p)K_(ip)T,K_(d)^(discr)=(\ frac (K_(p)K_(dp))(T))) puede ser escrito:

U (n) = K p E (n) + K yo re yo s c r ∑ k = 0 norte mi (k) + K re re yo s c r (E (n) − E (n − 1)) (\displaystyle U(n)=K_(p )E(n)+K_(i)^(discr)\sum _(k=0)^(n)(E(k))+K_(d)^(discr)(E(n)-E(n -1)))

En la implementación del software, para optimizar los cálculos, se pasa a la fórmula recurrente:

U (n) = U (n − 1) + K p (E (n) − E (n − 1)) + K i re i s c r E (n) + K re d i s c r (E (n) − 2 E (n − 1) + mi (n − 2)) (\displaystyle U(n)=U(n-1)+K_(p)(E(n)-E(n-1))+K_(i)^(discr)( E(n))+K_(d)^(discr)(E(n)-2E(n-1)+E(n-2)))

Los siguientes se utilizan frecuentemente como parámetros del controlador PID:

  • rango relativo
P b = 1 K p (\displaystyle P_(b)=(\frac (1)(K_(p))))
  • Constantes de integración y diferenciación que tienen la dimensión del tiempo.
T i = 1 K i p (\displaystyle T_(i)=(\frac (1)(K_(ip)))) T d = K d p (\displaystyle T_(d)=(K_(dp))\;)

Tenga en cuenta que los términos se utilizan de forma diferente según las distintas fuentes y los distintos fabricantes de reguladores.

Práctica de aplicación

Los métodos teóricos para analizar un sistema con un controlador PID rara vez se utilizan en la práctica. La principal dificultad en la aplicación práctica es el desconocimiento de las características del objeto de control. Además, la no linealidad y la no estacionariedad del sistema plantean un problema importante. Los reguladores prácticos operan en un rango limitado por arriba y por abajo y, por lo tanto, son, en principio, no lineales. En este sentido, se han generalizado los métodos para ajustar experimentalmente un regulador conectado a un objeto de control. El uso directo del valor de control generado por el algoritmo también tiene sus propias particularidades. Por ejemplo, el control de temperatura a menudo controla no uno sino dos dispositivos, uno de los cuales controla el suministro de fluido caliente para calentar y el otro controla el refrigerante para enfriar. A menudo se consideran tres opciones para los reguladores prácticos. En la primera opción, que es la más cercana a la descripción teórica, la salida del controlador es un valor analógico continuo limitado. En el segundo caso, la salida es un flujo de pulsos que puede impulsar un motor paso a paso. En el tercer caso, la señal de control de salida del controlador se utiliza para la modulación de ancho de pulso.

En los sistemas de automatización modernos, que generalmente se construyen sobre la base de PLC, los controladores PID se implementan como módulos de hardware especializados incluidos en el controlador de control o mediante métodos de software que utilizan bibliotecas especializadas. Los fabricantes de controladores suelen desarrollar software especializado (sintonizadores) para ajustar los coeficientes del controlador.

La precisión de la regulación se puede mejorar significativamente utilizando la ley PID (ley de regulación Proporcional-Integral-Diferencial).
Para implementar la ley PID se utilizan tres variables principales:
P – banda proporcional, %;
I – tiempo de integración, s;
D – tiempo de diferenciación, s.
El ajuste manual del controlador PID (determinación de los valores de los parámetros P, I, D), que garantiza la calidad de control requerida, es bastante complejo y rara vez se utiliza en la práctica. Los controladores PID de la serie UT/UP proporcionan ajuste automático de los parámetros PID para un proceso de control específico, manteniendo al mismo tiempo la capacidad de ajustarlos manualmente.

Componente proporcional
En la banda proporcional, determinada por el coeficiente P, la señal de control cambiará en proporción a la diferencia entre el valor de ajuste y el valor real del parámetro (desajuste):

señal de control = 100/P E,

donde E es el desajuste.
El coeficiente de proporcionalidad (ganancia) K es un valor inversamente proporcional a P:

La banda proporcional se determina con respecto al punto de ajuste de control dado, y dentro de esta zona la señal de control varía de 0 a 100%, es decir, si el valor real y el punto de ajuste son iguales, la señal de salida tendrá un valor del 50%.

donde P es la zona de proporcionalidad;
ST – punto de ajuste de regulación.
Por ejemplo:
rango de medición 0...1000 °C;
punto de ajuste de control ST = 500 °C;
banda proporcional P = 5%, que es 50 °C (5% de 1000 °C);
a una temperatura de 475 °C y menos, la señal de control tendrá un valor del 100%; a 525 °C y más – 0%. En el rango de 475...525 °C (en la banda proporcional), la señal de control cambiará en proporción a la magnitud del desajuste con una ganancia K = 100/P = 20.
Reducir el valor de la banda proporcional P aumenta la respuesta del controlador al desajuste, es decir, un pequeño desajuste corresponderá a un valor mayor de la señal de control. Pero al mismo tiempo, debido a la gran ganancia, el proceso adquiere una naturaleza oscilatoria alrededor del valor establecido y no se puede lograr un control preciso. Si la banda proporcional aumenta demasiado, el controlador reaccionará demasiado lentamente al desajuste resultante y no podrá seguir el ritmo de seguimiento de la dinámica del proceso. Para compensar estas desventajas del control proporcional, se introduce una característica de tiempo adicional: el componente integral.

Componente integral
Está determinada por la constante de tiempo de integración I, es función del tiempo y proporciona un cambio en la ganancia (desplazamiento de la banda proporcional) durante un período de tiempo determinado.


señal de control = 100/P E + 1/I ∫ E dt.

Como puede verse en la figura, si el componente proporcional de la ley de control no reduce el desajuste, entonces el componente integral comienza a aumentar suavemente la ganancia durante el período I. Después de un período de tiempo I, se repite este proceso. Si la discrepancia es pequeña (o disminuye rápidamente), entonces la ganancia no aumenta y, si el valor del parámetro es igual al ajuste especificado, adquiere un valor mínimo. En este sentido, se habla del componente integral en función de la desconexión automática del control. En el caso de regulación según la ley PID, la respuesta transitoria del proceso serán oscilaciones que decaerán gradualmente hacia el valor establecido.

Componente diferencial
Muchos objetos de control son bastante inerciales, es decir, tienen una respuesta retardada a la acción aplicada (tiempo muerto) y continúan reaccionando después de que se elimina la acción de control (tiempo de retardo). Los controladores PID en tales objetos siempre se retrasarán al encender/apagar la señal de control. Para eliminar este efecto, se introduce un componente diferencial, determinado por la constante de tiempo de diferenciación D, y se garantiza la plena implementación de la ley de control PID. El componente diferencial es la derivada temporal del desajuste, es decir, es función de la tasa de cambio del parámetro de control. En el caso de que la discrepancia se convierta en un valor constante, el componente diferencial deja de afectar la señal de control.

Señal de control = 100/P mi + 1/I ∫ mi dt + re d/dt mi.

Con la introducción del componente diferencial, el controlador comienza a tener en cuenta el tiempo muerto y el tiempo de retardo, cambiando la señal de control por adelantado. Esto hace posible reducir significativamente las fluctuaciones del proceso alrededor del valor nominal y lograr una finalización más rápida del proceso transitorio.
Por tanto, los controladores PID, al generar una señal de control, tienen en cuenta las características del propio objeto de control, es decir, llevar a cabo un análisis del desajuste por magnitud, duración y tasa de cambio. En otras palabras, el controlador PID "anticipa" la reacción del objeto controlado a la señal de control y comienza a cambiar la acción de control no cuando se alcanza el valor establecido, sino con anticipación.

5. La función de transferencia de qué enlace se representa: K(p) = K/Tr

controlador PID

Diagrama que ilustra el principio de funcionamiento del controlador PID. Los coeficientes delante de la integral y la derivada se omiten para mayor claridad de la ilustración.

Controlador proporcional-integral-derivativo (PID)- un dispositivo en un circuito de control con retroalimentación. Se utiliza en sistemas de control automático para generar una señal de control con el fin de obtener la precisión y calidad requeridas del proceso transitorio. El controlador PID genera una señal de control, que es la suma de tres términos, el primero de los cuales es proporcional diferencia entre señal de entrada y señal de retroalimentación(señal de discordancia), la segunda es la integral de la señal de discordancia, la tercera es la derivada de la señal de discordancia.

Si algunos de los componentes no se utilizan, entonces el regulador se llama proporcional-integral , derivada-proporcional , proporcional etcétera.

información general

Componente proporcional

El componente proporcional produce una señal de salida que contrarresta la desviación de la variable controlada del valor establecido observado en un momento dado. Cuanto mayor es la desviación, mayor es. Si la señal de entrada es igual al valor especificado, entonces la salida es cero.

Sin embargo, cuando se utiliza sólo un controlador proporcional, el valor de la variable controlada nunca se estabiliza en el punto de ajuste. Existe el llamado error estático, que es igual a una desviación de la variable controlada que proporciona una señal de salida que estabiliza la variable de salida exactamente en este valor. Por ejemplo, en un controlador de temperatura, la señal de salida (potencia del calentador) disminuye gradualmente a medida que la temperatura se acerca al punto de ajuste y el sistema se estabiliza a una potencia igual a la pérdida de calor. La temperatura no puede alcanzar el valor establecido, ya que en este caso la potencia del calentador será cero y comenzará a enfriarse.

Cuanto mayor sea el coeficiente de proporcionalidad entre la señal de entrada y salida (ganancia), menor será el error estático; sin embargo, si la ganancia es demasiado grande, si hay retrasos en el sistema, pueden comenzar las autooscilaciones y con un aumento adicional de el coeficiente, el sistema puede perder estabilidad.

Componente integral

La componente integral es proporcional a la integral de la desviación de la variable controlada. Se utiliza para eliminar un error estático. Permite al controlador tener en cuenta el error estático a lo largo del tiempo.

Si el sistema no experimenta perturbaciones externas, después de algún tiempo la variable controlada se estabilizará en el valor dado, la señal del componente proporcional será igual a cero y la señal de salida será proporcionada completamente por el componente integral. Sin embargo, el componente integral también puede provocar oscilaciones propias.

Componente diferencial

El componente diferencial es proporcional a la tasa de cambio de la desviación de la variable controlada y tiene como objetivo contrarrestar las desviaciones del valor objetivo que se predicen en el futuro. Las desviaciones pueden deberse a perturbaciones externas o a un retraso en la influencia del regulador sobre el sistema.

Teoría

El propósito del controlador PID es mantener el valor establecido X 0 de algún valor X cambiando otra cantidad tu. Significado X 0 se llama valor dado, y la diferencia e = ( X 0 − x) - residual, discrepancia o desviación del valor del valor especificado.

Señal de salida del regulador tu está determinada por tres términos:

,

Dónde kp, k yo, k d - factores de ganancia componentes proporcionales, integrales y diferenciales del controlador, respectivamente.

La mayoría de los métodos para sintonizar controladores PID utilizan una fórmula ligeramente diferente para la señal de salida, en la que los componentes integral y diferencial también se multiplican por la ganancia proporcional:

En una implementación discreta del método para calcular la señal de salida, la ecuación toma la siguiente forma:

,

¿Dónde está el tiempo de muestreo? Usando reemplazo podemos escribir:

En la implementación del software, para optimizar los cálculos, se pasa a la fórmula recurrente:

Sistema de control por retroalimentación mediante un controlador PID. El sistema controla el valor. y(t), es decir. muestra el valor y(t) a un valor especificado externamente Utah). Se envía un error a la entrada del controlador PID mi(t), la salida del controlador PID es una acción de control para algún proceso (para un objeto de control) que controla la cantidad y(t).

Los siguientes se utilizan frecuentemente como parámetros del controlador PID:

  • rango relativo
  • Constantes de integración y diferenciación que tienen la dimensión del tiempo.

Tenga en cuenta que los términos se utilizan de forma diferente según las distintas fuentes y los distintos fabricantes de reguladores.

PID (del inglés P-proporcional, I-integral, D-derivado): un regulador es un dispositivo utilizado en bucles de control equipados con un enlace de retroalimentación. Estos reguladores se utilizan para generar una señal de control en sistemas automáticos donde es necesario alcanzar altos requisitos de calidad y precisión de procesos transitorios.

La señal de control del controlador PID se obtiene sumando tres componentes: la primera es proporcional a la magnitud de la señal de error, la segunda es proporcional a la integral de la señal de error y la tercera es su derivada. Si alguno de estos tres componentes no se incluye en el proceso de suma, entonces el controlador ya no será un PID, sino simplemente proporcional, proporcional-diferenciador o proporcional-integrador.

El primer componente es proporcional.

La señal de salida viene dada por una componente proporcional. Esta señal conduce a contrarrestar la desviación actual del valor de entrada a regular respecto del valor establecido. Cuanto mayor sea la desviación, mayor será la señal. Cuando el valor de entrada de la variable controlada es igual al valor especificado, la señal de salida se vuelve cero.

Si deja solo este componente proporcional y lo usa solo, entonces el valor de la cantidad a controlar nunca se estabilizará en el valor correcto. Siempre hay un error estático igual a tal valor de desviación de la variable controlada que la señal de salida se estabiliza en este valor.

Por ejemplo, un termostato controla la potencia de un dispositivo de calefacción. La señal de salida disminuye a medida que se acerca la temperatura deseada del objeto y la señal de control estabiliza la potencia al nivel de pérdida de calor. Como resultado, la temperatura nunca alcanzará el valor establecido, porque el dispositivo de calefacción simplemente tendrá que apagarse y comenzar a enfriarse (la potencia es cero).

Una ganancia mayor entre la entrada y la salida significa un error estático menor, pero si la ganancia (esencialmente un coeficiente de proporcionalidad) es demasiado grande, entonces si hay retrasos en el sistema (y a menudo son inevitables), pronto comenzarán las autooscilaciones. en él, y si aumenta el coeficiente es aún mayor, el sistema simplemente perderá estabilidad.

O un ejemplo de posicionamiento de un motor con caja de cambios. Si el coeficiente es pequeño, la posición deseada del elemento de trabajo se alcanza demasiado lentamente. Aumente el coeficiente: la reacción será más rápida. Pero si aumenta aún más el coeficiente, el motor “sobrepasará” la posición correcta y el sistema no se moverá rápidamente a la posición requerida, como cabría esperar. Si ahora aumentamos aún más el coeficiente de proporcionalidad, entonces comenzarán las oscilaciones alrededor del punto deseado y el resultado no se volverá a lograr...

El segundo componente es la integración.

La integral de tiempo del valor de desajuste es la parte principal del componente integrador. Es proporcional a esta integral. El componente integrador se utiliza precisamente para eliminar el error estático, ya que el controlador tiene en cuenta el error estático a lo largo del tiempo.

En ausencia de perturbaciones externas, después de algún tiempo la cantidad a controlar se estabilizará en el valor correcto, cuando el componente proporcional sea igual a cero, y la precisión de la salida estará totalmente asegurada por el componente integrador. Pero el componente integrador también puede generar oscilaciones alrededor del punto de posicionamiento si el coeficiente no se selecciona correctamente.

El tercer componente es diferenciador.

La tasa de cambio en la desviación del valor a regular es proporcional al tercer componente: el componente diferenciador. Es necesario contrarrestar las desviaciones (causadas por influencias externas o retrasos) de la posición correcta prevista en el futuro.

Como ya entendiste, los controladores PID se utilizan para mantener un valor dado x0 de algún valor cambiando el valor u de otro valor. Hay un punto de ajuste o valor dado x0, y hay una diferencia o discrepancia (desajuste) e = x0-x. Si el sistema es lineal y estacionario (en la práctica esto es difícilmente posible), entonces las siguientes fórmulas son válidas para especificar u:

En esta fórmula ves los coeficientes de proporcionalidad para cada uno de los tres términos.

En la práctica, los controladores PID utilizan una fórmula diferente de sintonización, donde la ganancia se aplica a todos los componentes a la vez:

El lado práctico del control PID

En la práctica, rara vez se utiliza el análisis teórico de sistemas controlados por PID. La dificultad es que se desconocen las características del objeto de control y el sistema casi siempre es no estacionario y no lineal.

Los controladores PID que realmente funcionan siempre tienen una limitación del rango de operación desde abajo y desde arriba, esto explica fundamentalmente su no linealidad. Por lo tanto, el ajuste se realiza casi siempre y en todas partes de forma experimental, cuando el objeto de control está conectado al sistema de control.

El uso de un valor generado por un algoritmo de control de software tiene varios matices específicos. Si hablamos, por ejemplo, de control de temperatura, a menudo se necesitan no uno, sino dos dispositivos: el primero controla la calefacción y el segundo, la refrigeración. El primero suministra refrigerante calentado, el segundo, refrigerante. Se pueden considerar tres soluciones prácticas.

La primera se acerca a la descripción teórica, cuando la salida es un valor analógico y continuo. La segunda es una salida en forma de un conjunto de pulsos, por ejemplo para controlar un motor paso a paso. El tercero es cuando la salida del regulador se utiliza para establecer el ancho del pulso.

Hoy en día, casi todos los sistemas de automatización están construidos y los controladores PID son módulos especiales que se agregan al controlador de control o, en general, se implementan en software mediante la carga de bibliotecas. Para configurar correctamente las ganancias en dichos controladores, sus desarrolladores proporcionan un software especial.

Andrey Povny

Debes mantener la temperatura a un cierto nivel y cambiar la tarea. Hay un microcontrolador al que se adjunta un medidor de temperatura y un triac para controlar la potencia. No nos preocupemos por TAU ni nada por el estilo, simplemente tomémoslo y hagamos un controlador PID “de frente”.

II. Introducción teórica

¿Cómo se fabrica un controlador PID? Tomamos la diferencia entre la temperatura actual y la deseada, la multiplicamos por un coeficiente ajustable y obtenemos la potencia que se necesita generar en este momento. Este es un componente proporcional, funciona en el momento en que aparece un desajuste, es decir, responde instantáneamente tanto al cambio en el punto de ajuste como al comportamiento del objeto. ¿Empiezas a calentar? El poder comienza a disminuir. ¿Sobrecalentado? Se apagó o incluso dio una señal de enfriamiento. Todo está bien, pero en la vida real el efecto de la influencia aparece con retraso, y el objeto está influenciado no solo por nosotros, sino también por el medio ambiente: el reactor calentado no solo se calienta por dentro, sino que también se enfría, emitiendo calor a la habitación, por lo que tan pronto como lo apagamos, inmediatamente comienza a enfriarse. Por lo tanto, un controlador proporcional puro oscila alrededor del punto de mantenimiento y oscila con más fuerza cuanto mayor es la exposición al entorno/contenido del reactor.

Para compensar las influencias "externas" en el reactor, se añade un componente integral al circuito. Todo el desajuste que había en el sistema va al integrador (en consecuencia, en cuanto nos sobrecalentamos, la cantidad disminuye, mientras que está subcalentado, la cantidad aumenta). Y la integral acumulada, con su coeficiente, da su propio aumento o disminución de potencia. Como resultado de este enfoque, en un proceso estacionario, después de un tiempo la integral selecciona tal contribución a la suma con potencia que compensa la pérdida del medio ambiente, y las oscilaciones desaparecen: la integral se vuelve estable, por lo que la cantidad de producción la potencia se vuelve constante. Además, dado que se mantiene la temperatura requerida, no hay desajuste, el componente proporcional no funciona en absoluto.

Para compensar el efecto de los retrasos entre el impacto y la respuesta del sistema, se agrega un componente diferencial al sistema. Es solo que un regulador proporcional proporciona energía todo el tiempo hasta que la temperatura alcanza el punto deseado; un regulador proporcional-diferencial comienza a reducir la potencia suministrada antes de alcanzar el punto deseado; dado que el desajuste disminuye, hay una derivada negativa que reduce la efecto. Esto minimiza el sobrecalentamiento durante las transiciones largas.

Entonces, hemos entendido el significado físico, pasemos a las cuestiones básicas de implementación.

III. ¿Quién debería utilizar el regulador?

- Técnicos.

¿Qué se sigue de esto? De esto se deduce que los técnicos comprenden el componente físico y tienen experiencia en la configuración de reguladores PID de hardware. Esto significa que la implementación del software debe basarse en la facilidad de configuración por parte de los técnicos, repitiendo el modelo físico. ¡Y esto es extremadamente importante! Muy a menudo, para simplificar el código, los coeficientes se cambian, por ejemplo, a sus inversos, para eliminar la división. Como resultado, el ajuste se convierte en un infierno y una pesadilla, y requiere experiencia en ajustar ese regulador en particular en lugar de comprender el proceso. De aquí deducimos que nuestros coeficientes - la constante de integración y la constante de diferenciación - deben tener la dimensión del tiempo, es decir, especificarse en segundos, y no en “1/s”, como les gusta hacer.

IV. Área de funcionamiento.

Estamos intentando crear un regulador universal, lo que significa que debería funcionar tanto en objetos pequeños y rápidos como en hornos enormes y potentes. Esto significa que debemos suponer que la temperatura regulada generalmente está limitada por el medidor. Los más utilizados son XA(K) y XK(L). Su rango de aplicabilidad es de hasta 1200°C. La refrigeración requiere equipos más complejos (criostatos), y rara vez se requiere el control de la refrigeración adicional (ventiladores y puertas que se pueden abrir en los armarios de calefacción), por lo que por ahora lo excluimos de nuestra consideración. Obtenemos que la temperatura controlada es de ~15°C a ~1200°C, solo se controla la fuente de alimentación.

La precisión del control está determinada, en primer lugar, por la precisión de la medición: las tablas de calibración se dan en 0,1 grados; La linealidad dentro de las tablas es, en principio, decente, por lo que la precisión está limitada principalmente por el amplificador y el molinete. En mi caso, quería lograr una precisión de mantenimiento de 0,1 grados, por lo que el medidor se establece en 1/32 grados: esto da ~3 cuantos por 0,1 grados, teniendo así el "ruido" normal de regulación +-1 cuantos. Nos mantenemos dentro de los mismos 0,1 grados. Usar 1/32 le permite trabajar con un punto fijo: 5 bits = parte fraccionaria, el resto es un número entero. En 16 bits esto se puede representar de 0 a 2047°. En lugar de trabajar con números negativos, trabajaremos en Kelvins en lugar de Celsius, así - representando 0 a 2047 °K, lo que equivale a -273 a 1775 °C; en incrementos de 0,03125°.

V. Rango de ajustabilidad.

Para controlar un microrreactor con una potente central eléctrica, puede resultar que el 1% de la potencia sea suficiente para calentarlo 10 grados, mientras que para un gran horno inerte, el 100% de la potencia de calentamiento apenas sea suficiente para calentarlo 10 grados. grado. (En la vida real, se ve así: hay varios calentadores controlados manualmente, se encienden mediante un interruptor separado y producen calentamiento inicial, luego el termostato mantiene el punto de funcionamiento, controlando otro calentador, que a plena potencia produce un máximo de +10°C a eso, que se calienta constantemente). En base a esto, es lógico suponer que el coeficiente de proporcionalidad límite es 100% de potencia por 1 grado. Ya no tiene sentido porque queremos una controlabilidad de 0,1 grados. Para simplificar, tomé la inversa mínima: 1% de potencia por cada 100 grados.

Los rangos de coeficientes de tiempo se calculan simplemente en función de nuestras condiciones de funcionamiento del regulador. Dado que controlamos la potencia del triac calculando el retraso del momento de encendido después de pasar por 0, la frecuencia máxima de funcionamiento del regulador es 50 Hz. Si estamos seguros de que controlamos la potencia, que da igual más o menos, podemos trabajar a 100Hz, pero no siempre es así, por lo que es mejor dosificar la misma cantidad de medias ondas tanto positivas como negativas. cada vez. Para hacer la vida más fácil, reduje el tiempo de funcionamiento a 25 Hz, por lo que cualquier impacto calculado actuará durante 4 medias ondas y durante este tiempo podré calcular un nuevo impacto.

Por lo tanto, las constantes de tiempo se establecen cada 1/25 segundos, de 0 a ~2000 segundos (2000*25 = 50000, solo cabe en 16 bits).

Pues también tenemos un límite de potencia mínimo y máximo, del 0 al 100%.

VI. Gestión de energía.

A partir de este momento terminan todos los cálculos teóricos y comienza la amarga práctica, ligada a una implementación concreta.

Entonces, ya hemos decidido que controlamos el retraso en la apertura del triac después de pasar por 0. Por lo tanto, un retraso de 0 significa 100% de potencia, retraso infinito = 0% de potencia.

Pregunta: ¿con qué precisión Poder gestionar el poder? En general, con la precisión de nuestro cronómetro. Por otro lado, ¿cuánta potencia se necesita? Calculamos qué % de potencia se debe suministrar durante 0,04 segundos. En principio, según la experiencia, el control de potencia incluso con una precisión del 1% a una frecuencia de 0,1 segundos es suficiente para mantener una temperatura de 1 grado. Nuestro control es de 0,04 segundos (2,5 veces más rápido). Por lo tanto, se decidió calcular la tabla de potencia a 1/250 del máximo (en incrementos de 0,4%). Esto permite que la tabla no sea muy grande (500 bytes) y al mismo tiempo tenga una precisión superior al 1%. Si su caso requiere mayor precisión, no es tan difícil recalcularlo.

Ahora hablemos de calcular esta tabla en sí. En primer lugar, hay que tener en cuenta que existe en el momento en que se activa la señal de cruce por cero. En mi caso, 12V. Es decir, cuando el voltaje de entrada caiga por debajo de 12 V, recibiré una señal que pasa por 0.

Esto significa que para una potencia del 100 %, el tiempo de inicio = tiempo de viaje de 12 V.

Resolvamos el sistema de ecuaciones.

; Momento Int:= 12V; Máx:= sqr(220*sqrt(2)) ; ( Sqr(Sin(Pi/2)*K) = Máx ; ( Sqr(Sin(X)*K) = IntMomento ; ; 2*k/MaxCode = 1 - cos(T*Pi) ; cos(T*Pi) = 1-2*k/MaxCode ; T*Pi = arccos(1-2*k/MaxCode) ; T = arccos(1-2*k/MaxCode) / Pi

Mi procesador funciona a una frecuencia de 32786, el PLL está configurado en 384/2, la media onda es de 100 Hz, de donde obtenemos que el código para cargar una constante en el temporizador durante el tiempo T se ve así:

65536-(T*(32768*384/2)/100,0 + 773)

Necesitamos calcular el tiempo de retraso, lo que da un aumento uniforme en el área de la parte incluida de la sinusoide. Es decir, necesitamos tener tiempos que proporcionen un aumento uniforme de potencia. La potencia total que producimos es la integral de toda la onda sinusoidal. [¿Quién sabe cómo insertar fórmulas en el hub? ¿de ninguna manera? Entonces escribo en notación de arce].

Máx = int(sqr(sin(x)), x=0..Pi) int(sqr(sin(x)), x=0..T*Pi) = x/2 - sin(2*x)/ 4+C | 0..T*PI ​​​​= (T*Pi)/2 - sin(2*T*Pi)/4 (T*Pi)/2 - sin(2*T*Pi)/4 = Q*Pi/ 2

Por lo tanto, debemos revisar todos los Q con una precisión determinada y encontrar T para cada uno de ellos.

Lo resolví yo mismo de esta estúpida manera:

generador de perl

#!/usr/bin/perl # (T*Pi)/2 - sin(2*T*Pi)/4 = Q*Pi/2 usa la constante PI => 4 * atan2(1, 1); $T = 1; for($i = 250; $i >= 0; $i--) ( $int = $i*PI/2/250; $ev = ($T*PI)/2-sin(2*$T* PI)/4; mientras(abs($ev-$int) > 0.0005) ( $T -= 0.0001; $ev = ($T*PI)/2-sin(2*$T*PI)/4; ) #print $i."\t".$T."\n"; $código = 65536-($T*(32768*384/2)/100.0 + 773); printf "DB 0%02Xh, 0%02Xh ; %04Xh = $i/250 de potencia\n", $código%256, int($código/256), $código, $i; )

Todo, en la salida recibimos una placa de 250 valores correspondientes a las constantes de carga del temporizador hasta el momento del encendido luego de recibir una señal sobre el paso por 0 (más precisamente, por 12V, como dije anteriormente).

VII. Medición de datos de entrada

Me omito esta pregunta porque merece su propio artículo extenso. En el archivo de mi último blog se puede encontrar cómo resolví el problema con la resistencia térmica.

Lo principal que debemos saber es que medimos los datos con la frecuencia que necesitamos (en este caso, 25 Hz) y la precisión requerida (la salida es un número de 0 a 2048 grados Kelvin en 1/32 grados). Se supone que los datos ya están normalizados para todos los cálculos posteriores.

Si alguien está interesado, escriba en los comentarios y la próxima vez describiré cómo se hace esto para los termopares.

VIII. Cálculo de impacto

Y ahora ha sucedido: tenemos todos los datos para finalmente hacer lo que empezamos: calcular cuánta potencia se debe suministrar al elemento de control.

Recordemos una vez más la fórmula del controlador PID:

U = K * (Err + (1/Ti)*Int + Td*dErr)

  • Ud.- potencia a entregar;
  • k- coeficiente proporcional (nota: está fuera de paréntesis, describiré por qué a continuación);
  • Ti- constante de tiempo de integración. Tenga en cuenta que los cálculos utilizan el valor recíproco;
  • td- constante de tiempo de diferenciación
  • Errar- desajuste actual (diferencia entre el punto de ajuste y la temperatura medida
  • derr- derivada de desajuste (diferencia entre el error actual y el anterior)
  • En t- integral de desajuste acumulado (la suma de todos los Err que vimos)

Volvemos nuevamente a la cuestión que se planteó en el apartado III: esto será utilizado por los técnicos. Por lo tanto, es extremadamente importante evitar el error clásico de todas las implementaciones: "dimensionar los coeficientes como resulta". Hacemos dispositivo para conducir físico proceso, lo que significa que el modelo debe corresponder.

Generemos todas las dimensiones. Parcialmente de cara al futuro, ya lo he descrito en, pero ahora lo revelaremos con más detalle:

  • Ud.- tiene un valor en % de potencia. Aún más precisamente, a 2/5 del % de potencia, ya que nuestra tabla pasa por 1/250 del 100%.
  • Errar- discrepancia, especificada en grados. Más precisamente, después de 1/32 grados.
  • En t- la integral es la suma de grados en el tiempo - y por tanto tiene la dimensión de grado * seg. Más precisamente - (1/32 grados)*(1/25 seg)
  • Ti- fijado después de 1/25 seg.
  • (1/Ti)*Int- después del cálculo se obtiene una contribución con una dimensión (1/32 grados).
  • derr- derivada, tiene la dimensión de grados/seg, o más precisamente (1/32 grados)/(1/25 seg)
  • td- fijado después de 1/25 seg.
  • Td*dErr- después de que el producto aporta la contribución a la dimensión (1/32 grados)
  • (...) - entonces, todos los términos entre paréntesis se reducen a la dimensión (1/32 grados)
  • k- está de acuerdo Ud. Y (...) , lo que significa que tiene la dimensión de porcentaje por grado, más precisamente (2/5)%/(1/32 grados)

Ahora puede ver claramente por qué el coeficiente proporcional está fuera de paréntesis; esto le permite dejar los coeficientes diferencial e int simplemente como constantes de tiempo, como resultado, al configurar el operador opera con números simples y comprensibles: porcentaje por grado para el coeficiente proporcional y segundos para los coeficientes integral y diferencial.

Y gracias a la cómoda selección de la posición de los puntos y las dimensiones temporales, como veremos ahora, todos los cálculos se realizan casi directamente.

Excepto por una cosa: tenemos la cantidad Ti, y para el cálculo se requiere 1/Ti. Una operación de gran división es muy cara. La operación de multiplicación es varias veces más económica, por lo que utilizaremos el excelente artículo División por enteros invariantes mediante la multiplicación. Después de todo, tenemos k / Ti / td cambian muy raramente y, por lo tanto, podemos darnos el lujo de pervertirlos tanto como queramos después de que cambian, lo principal es que el ciclo de cálculo principal funciona rápidamente.

Así que en lugar de Ti para los cálculos los ponemos en un conjunto ti_m, ti_sh1, Ti_sh2; y en cada ciclo realizamos el cálculo:
T1 = MULUH(Ti_m, Int) Q = SHR(T1+SHR(Int-T1, Ti_sh1), Ti_sh2)

Ahora calculamos el saldo de bits. Para ello, escribamos la fórmula completa paso a paso:

  1. Eo = E; Necesitamos que pase el error. Errores: 16 bits
  2. E = YX; Calculamos el nuevo desajuste. 16 bits
  3. Int = Int + (E+Eo)/2 ; Integramos el error. En este caso, calculamos la mitad de la diferencia (esquema de diferencia). 32 bits = 32 bits + 16 bits
  4. cI = Int * (1/Ti) ; Calculamos la contribución integral - 32 bits * 32 bits => 32 bits
  5. cD = Td * (E-Eo); Calculamos la contribución diferencial - 16*16 => 32bit
  6. PID = E + cI + cD ; Deficiente; 16+32+32 => 32 bits
  7. U = K*PID/256 ; coeficiente; 32*16/8 bits => 40 bits.

Para todos los cálculos, la posición del punto hasta el séptimo paso permanece en el quinto lugar desde la derecha. En el último momento se produce una interesante finta con las orejas. K se establece en 1/256, respectivamente, después de la multiplicación el punto se desplaza hacia la izquierda a 5+8=13.º lugar, por lo que debemos descartar los 8 bits de orden inferior del resultado. Y el byte más bajo del resultado es la potencia que necesitamos después del 2/5%. Esta es otra razón por la que la potencia se nivela en pasos de 1/250; esto permite empaquetar el resultado en un byte y el resultado deseado se puede obtener fácilmente de la tabla.

A continuación, recordamos que solo nos interesa la potencia de 0 a 250; por lo tanto, el séptimo paso de los cálculos es muy simple, tan pronto como obtengamos un número negativo, inmediatamente sumamos uMin. Tan pronto como descubrimos que cualquier byte alto no es cero, inmediatamente agregamos uMax. Y sólo si la potencia se suma en el rango, comprobamos que haya menos uMin o más uMax.

Por si a alguien le interesa:

un completo desastre de cálculos

; Control PID CalcMainEnd: ; Computación, Go-Go. CalcPid: ; 1. Eo = E | Pid1 de 16 bits: MOV Err0H, ErrH MOV Err0L, ErrL; 2. E = YX | Pid2 de 16 bits: CLR C MOV A, ConfiguraciónL SUBB A, ThermoL MOV ErrL, A MOV A, ConfiguraciónH SUBB A, ThermoH MOV ErrH, A JNB OV, Pid2Ov JB ACC.7, Pid2Max Pid2Min: MOV ErrL, #LOW(-500* 32) MOV ErrH, #ALTO(-500*32) SJMP Pid2End Pid2Max: MOV ErrL, #BAJO(500*32) MOV ErrH, #ALTO(500*32) SJMP Pid2End Pid2Ov: JNB ACC.7, Pid2OvP Pid2OvN: ; Comprobemos la restricción descendente CLR C MOV A, ErrL SUBB A, #LOW(-500*32) MOV A, ErrH SUBB A, #HIGH(-500*32) JNC Pid2End; Si > -500 => todo está bien SJMP Pid2Min Pid2OvP: CLR C MOV A, ErrL SUBB A, #LOW(500*32) MOV A, ErrH SUBB A, #HIGH(500*32) JNC Pid2Max; Si< 500 => todo está bien Pid2End: ; 3. Int = Int + (E+Eo)/2 | Pid3 de 32 bits + 16 bits: JNB PowerReady, Pid3End; Si no hay red, no guardamos la parte integral MOV A, ErrL ADD A, Err0L MOV R0, A ; temporalmente MOV A, ErrH ADDC A, Err0H MOV C, ACC.7; La media suma siempre cabe en 16 bits, por lo que al realizar un desplazamiento es necesario conservar el signo de RRC A ; Dividamos sin pérdida de signo XCH A, R0 ; A= parte de orden inferior, R0 - media suma de orden superior RRC A ; Se agregó JNB IntS, Pid3IntPos; Int es negativo, cambiemos el signo de R0:A, así será posible simplemente sumar con Int CLR C CPL A ADD A, #1 XCH A, R0 CPL A ADDC A, #0 XCH A, R0 Pid3IntPos: ; Int y R0:A ahora tienen signos consistentes, por lo que agregamos de la forma habitual ADD A, IntLL MOV IntLL, A MOV A, IntLH ADDC A, R0 MOV IntLH, A MOV A, R0 JB ACC.7, Pid3Neg; ¿Agregaste una diferencia negativa? ; Si la diferencia es positiva, simplemente propagamos el acarreo JNC jPid3End; Si agregamos una palabra y no hubo transferencia, no necesitamos hacer nada. INC IntHL; Propagar el acarreo por encima de MOV A, IntHL JNZ Pid3End; Si la transferencia no llegó al 4º byte, todo está bien INC IntHH; Extendemos el acarreo al byte MÁS significativo MOV A, IntHH JNZ Pid3End; Si la transferencia no sube aún más, todo está bien MOV IntHH, #0FFh ; Si la transferencia fuera mayor, limitamos la integral por el techo MOV IntHL, #0FFh MOV IntLH, #0FFh MOV IntLL, #0FFh jPid3End: SJMP Pid3End Pid3Neg: ; Si la diferencia es negativa, entonces necesita continuar sumando ambas veces, pero FFh MOV A, IntHL ADDC A, #0FFh MOV IntHL, A MOV A, IntHH ADDC A, #0FFh MOV IntHH, A JC Pid3End ; Si hubo un arrastre, entonces el signo de la integral no ha cambiado CPL IntS ; Si no hubo transferencia, entonces el signo de la integral ha cambiado CPL C ; Invierta el signo del número resultante MOV A, #0 SUBB A, IntLL MOV IntLL, A MOV A, #0 SUBB A, IntLH MOV IntLH, A MOV A, #0 SUBB A, IntHL MOV IntHL, A MOV A, # 0 SUBB A , IntHH MOV IntHH, A ; como se ha vuelto negativo, la transferencia siempre estará aquí Pid3End: ; 5. cI = Int*(1/Ti) | 32*32=>32 bits Pid5: ; R3:R2:R1:R0 = Int*(1/Ti) JB Ti_sh1, Pid5Calc; si Ti_sh1=0, entonces 1/Ti=1 o Ti=0. y no necesita hacer nada MOV A, Ti_mLL ORL A, Ti_mLH ORL A, Ti_mHL ORL A, Ti_mHH JZ Pid5Zero MOV R0, IntLL MOV R1, IntLH MOV R2, IntHL MOV R3, IntHH AJMP Pid5End Pid5Zero: MOV A, #0 MOV R0, A MOV R1, A MOV R2, A MOV R3, A MOV IntLL, A MOV IntLH, A MOV IntHL, A MOV IntHH, A AJMP Pid5End Pid5Calc: ; R7:R6:R5:R4[:R3] = MULUH(Int*Ti_m) // R3 se considera parte para redondear MOV R2, #0 ;; R7:R6 = IntHH*Ti_mHH MOV A, IntHH MOV B, Ti_mHH MUL AB MOV R7, B MOV R6, A ; R6:R5 += IntHL*Ti_mHH MOV A, IntHL MOV B, Ti_mHH MUL AB MOV R5, A MOV A, R6 AGREGAR A, B MOV R6, A MOV A, R2; A=0 ADDC A, R7 MOV R7, A ; R5:R4 += IntLH*Ti_mHH MOV A, IntLH MOV B, Ti_mHH MUL AB MOV R4, A MOV A, R5 AÑADIR A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntLL*Ti_mHH MOV A, IntLL MOV B, Ti_mHH MUL AB MOV R3, A MOV A, R4 AGREGAR A, B MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R6:R5 += IntHH*Ti_mHL MOV A, IntHH MOV B, Ti_mHL MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADDC A, B MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R5:R4 += IntHL*Ti_mHL MOV A, IntHL MOV B, Ti_mHL MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B MOV R5, A MOV A, R2; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntLH*Ti_mHL MOV A, IntLH MOV B, Ti_mHL MUL AB MOV A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R5:R4 += IntHH*Ti_mLH MOV A, IntHH MOV B, Ti_mLH MUL AB ADD A, R4 MOV R4, A MOV A, R5 ADDC A, B MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ; R4:R3 += IntHL*Ti_mLH MOV A, IntHL MOV B, Ti_mLH MUL AB ADD A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;; R4:R3 += IntHH*Ti_mLL MOV A, IntHH MOV B, Ti_mLL MUL AB ADD A, R3 MOV R3, A MOV A, R4 ADDC A, B MOV R4, A MOV A, R2; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A ;;; Si R3 > 7F - MOV A, R3 JNB ACC. 7, cambio Pid5; Si R3<80 -- округление не надо ANL A, #7Fh JZ Pid5Round ; Если = 80 -- округляем до нечетного MOV A, #1 ADD A, R4 MOV R4, A MOV A, R2 ; A=0 ADDC A, R5 MOV R5, A MOV A, R2 ; A=0 ADDC A, R6 MOV R6, A MOV A, R2 ; A=0 ADDC A, R7 MOV R7, A SJMP Pid5Shift Pid5Round: MOV A, R4 ORL A, #01h MOV R4, A ;JMP Pid5Shift Pid5Shift: ; R3:R2:R1:R0 = (Int-R7:R6:R5:R4) > > 1 CLR C MOV A, IntLL SUBB A, R4 MOV R0, A MOV A, IntLH SUBB A, R5 MOV R1, A MOV A, IntHL SUBB A, R6 MOV R2, A MOV A, IntHH SUBB A, R7 RRC A ; >>1 sin pérdida de acarreo MOV R3, A MOV A, R2 RRC A MOV R2, A MOV A, R1 RRC A MOV R1, A MOV A, R0 RRC A ;MOV R0, A ; R3:R2:R1:R0 += R7:R6:R5:R4 ;MOV A, R0 AÑADIR A, R4 MOV R0, A MOV A, R1 ADDC A, R5 MOV R1, A MOV A, R2 ADDC A, R6 MOV R2, A MOV A, R3 ADDC A, R7 MOV R7, A; Ahora muévete a la derecha a sh2. ; sh2 puede tener hasta 16 (ya que nuestro Ti es de 16 bits; verifiquemos la necesidad de un cambio de 16 bits) MOV A, Ti_sh2 JNB ACC.4, Pid5ShiftUnder16; Necesitamos desplazar >=16 - 2 bytes serán desplazados por movs MOV R0, 18h+2; R2, banco 3 MOV R1, 18h+3; R3, banco 3 MOV R2, #0 MOV R3, #0 Pid5ShiftUnder16: JNB ACC.3, Pid5ShiftUnder8;Necesitamos desplazar >=8 - desplazar 1 byte con movs MOV R0, 18h+1; R1, banco 3 MOV R1, 18h+2; R2, banco 3 MOV R2, 18h+3; R3, banco 3 MOV R3, #0 Pid5ShiftUnder8: ANL A, #07h JZ Pid5End; Si no necesita moverse dentro del byte, todo MOV R4, A SJMP Pid5ShiftRight Pid5NextShift: CLR C; ¡En este punto C todavía tenemos un bit alto posiblemente significativo! Pid5ShiftDerecha: MOV A, R3 RRC A MOV R3, A MOV A, R2 RRC A MOV R2, A MOV A, R1 RRC A MOV R1, A MOV A, R0 RRC A MOV R0, A DJNZ R4, Pid5NextShift; Eso es todo, después de todos los cambios obtuvimos el resultado; No olvides que lo calculado en R3:R2:R1:R0 ; ahora el número es positivo y su signo está en IntS Pid5End: ; 4. PID += [cD = Td * (E-Eo)] | 16*16=>32 bits Pid4: ; cD = R7:R6:R5:R4; ErrD = E-Eo CLR C MOV A, ErrL SUBB A, Err0L MOV DiffL, A MOV A, ErrH SUBB A, Err0H MOV DiffH, A MOV C, ACC.7; Tome el signo del resultado MOV DiffS, C ; Mantengamos el signo E-Eo JNC Pid4Mul; Diff -- negativo, signo invertido MOV A, DiffL CPL A ADD A, #1 MOV DiffL, A MOV A, DiffH CPL A ADDC A, #0 MOV DiffH, A Pid4Mul: ; R7:R6 = DifH*TdH; MOV A, DiffH = en cualquier caso A=DiffH MOV B, TdH MUL AB MOV R6, A MOV R7, B ; R5:R4 = DiffL*TdL MOV A, DiffL MOV B, TdL MUL AB MOV R4, A MOV R5, B; R6:R5 += DiffH*TdL MOV A, DiffH MOV B, TdL MUL AB AGREGAR A, R5 MOV R5, A MOV A, R6 AGREGAR A, B MOV R6, A MOV A, R7 ADDC A, #0 MOV R7, A; R6:R5 += DiffL*TdH MOV A, DiffL MOV B, TdH MUL AB ADD A, R5 MOV R5, A MOV A, R6 ADD A, B MOV R6, A MOV A, R7 ADDC A, #0 MOV R7, A; 6. PID = E + cI + cD | Pid6 de 32 bits: ; R3:R2:R1:R0 es igual a cI, signo en IntS; ; R7:R6:R5:R4 = cD; iniciar sesión en DiffS; E en complemento a dos inverso JB IntS, ChkDiffN JNB DiffS, Pid6Add ; Int>0, Diff>0 => Agregar SJMP Pid6Sub; Int>0, diferencia<0 =>Sub ChkDiffN: JNB DiffS, Pid6Sub; En t<0, Diff>0 => Sub; En t<0, Diff<0 =>Agregar Pid6Agregar: ; Mismo signo => agregarlos con verificación de desbordamiento MOV A, R0 ADD A, R4 MOV R0, A MOV A, R1 ADDC A, R5 MOV R1, A MOV A, R2 ADDC A, R6 MOV R2, A MOV A, R3 ADDC A, R7 MOV R3, A JNC Pid6Err; Si no hay acarreo, como resultado de la adición no hubo desbordamiento MOV R3, #0FFh MOV R2, #0FFh MOV R1, #0FFh MOV R0, #0FFh SJMP Pid6Err Pid6Sub: ; Los signos son diferentes: reste uno del otro y verifique el signo del resultado CLR C MOV A, R4 SUBB A, R0 MOV R0, A MOV A, R5 SUBB A, R1 MOV R1, A MOV A, R6 SUBB A, R2 MOV R2, A MOV A, R7 SUBB A, R3 MOV R3, A JNC Pid6Err; Si no hay préstamo, el signo del resultado es igual al signo de DiffS CPL DiffS; Si hubo un préstamo se debe invertir el signo de DiffS y el resultado MOV R6, #0 ; R6=0 MOV A, R0 CPL A ADDC A, R6; R6=0, C=1 => acción +1 MOV R0, A MOV A, R1 CPL A ADDC A, R6 ; +transfer MOV R1, A MOV A, R2 CPL A ADDC A, R6 MOV R2, A MOV A, R3 CPL A ADDC A, R6 MOV R3, A Pid6Err: MOV R6, #0; R6=0; En R3:R2:R1:R0 -- se encuentra cI+cD; signo de suma en DiffS; necesita sumar/restar Err, escrito en código inverso; Reduzcamos el signo de Err a DiffS MOV R4, ErrL MOV A, ErrH JB ACC.7, Pid6ChkDiffS JNB DiffS, Pid6SumErrNoInv; Err>0, Diff>0 => NoInv SJMP Pid6SumErrInv Pid6ChkDiffS: JNB DiffS, Pid6SumErrNoInv; Errar<0, Diff>0 => NoInv Pid6SumErrInv: ; Err tiene un signo diferente al de DiffS: invertir SETB C; No estoy seguro del estado C MOV A, ErrL CPL A ADDC A, R6; A+=R6+C, R6=0 C=1 => A+=1 MOV R4, A ; R4=ErrL MOV A, ErrH CPL A ADDC A, R6 Pid6SumErrNoInv: MOV R5, A; ErrH Pid6SumErr: ; Así, en R5:R4 se encuentra Err, cuyo signo es consistente con DiffS; pero en código de complemento inverso MOV A, R0 ADD A, R4 MOV R0, A MOV A, R5 CLR F0 JNB ACC.7, Pid6SubErrPos SETB F0 MOV R6, #0FFh; Agregue un negativo => agregue FF Pid6SubErrPos: ADDC A, R1 MOV R1, A MOV A, R2 ADDC A, R6; +extensión MOV R2, A MOV A, R3 ADDC A, R6; +extensión MOV R3, A MOV R6, #0; Es necesario comprobar si el signo del importe total ha cambiado JNC Pid6ChkF0 JB F0, Pid7; Errar<0, был перенос =>El signo no ha cambiado, no hay desbordamiento SJMP Pid6SumOv; Err>0, hubo una transferencia => desbordamiento Pid6ChkF0: JNB F0, Pid7; Err>0, sin acarreo => sin desbordamiento; SJMP Pid6SumUf; Errar<0, небыло переноса =>el signo ha cambiado Pid6SumUf: ; Si se equivoca<0 и небыло переноса =>signo cambiado CPL DiffS MOV A, R0 CPL A ADD A, #1 ; C=?, entonces sumamos 1 usando el método habitual MOV R0, A MOV A, R1 CPL A ADDC A, R6 MOV R1, A MOV A, R2 CPL A ADDC A, R6 MOV R2, A MOV A, R3 CPL A ADDC A, R6 MOV R3, A SJMP Pid7; El signo del resultado y DiffS están normalizados Pid6SumOv: ; Hubo un desbordamiento => redondear al máximo MOV R0, #0FFh MOV R1, #0FFh MOV R2, #0FFh MOV R3, #0FFh; 7.U = K*PID/256 | 32 bits*16 bits/8 bits => 40 bits; | que están truncados a 10 bits; | al calcular Pid7: ; R3:R2:R1:R0 contiene el resultado del PID, DiffS contiene su signo; Necesitamos calcular K*PID/256, limitando el resultado a 10 bits; K siempre es positivo, por lo que si PID< 0 =>mínimo JB DiffS, Pid7Umin; ya que podemos limitar estrictamente el límite superior a 16 bits; entonces si R3 != ​​​​0 => establece el máximo en cualquier caso MOV A, R3 JNZ Pid7Umax ; = ; calculamos teniendo en cuenta que debería resultar R7=0 R6=0, ; de lo contrario hay desbordamiento, por lo que no tocamos R7 y R6 en absoluto; pero comprobamos el resultado; R7:R6 = R2*KH MOV A, R2 JZ Pid7S1 MOV A, KH JNZ Pid7Umax; Si R2!=0 y KH!=0 => R7:R6>0 => desbordamiento Pid7S1: ; R6:R5 = R2*KL MOV A, R2 MOV B, KL MUL AB MOV R5, A MOV A, B JNZ Pid7Umax ; Si R6 > 0 => desbordamiento; R6:R5 = R1*KH MOV A, R1 MOV B, KH MUL AB AÑADIR A, R5 JC Pid7Umax; Si R6 > 0 => desbordamiento MOV R5, A MOV A, B JNZ Pid7Umax; Si R6 > 0 => desbordamiento; R5:R4 = R0*KH MOV A, R0 MOV B, KH MUL AB MOV R4, A MOV A, R5 AÑADIR A, B JC Pid7Umax; Si R6 > 0 => desbordamiento MOV R5, A; R5:R4 = R1*KL MOV A, R1 MOV B, KL MUL AB AGREGAR A, R4 MOV R4, A MOV A, R5 ADDC A, B JC Pid7Umax; Si R6 > 0 => desbordamiento MOV R5, A; R4:R3 = R0*KL MOV A, R0 MOV B, KL MUL AB RLC A; C = R3>=0x80, Z=R3>0x80 MOV R3, #0FFh; R3<>0x80 => nada JNZ Pid7S2 MOV R3, #0FEh; R3==0x80 => redondear a Pid7S2 par: MOV A, R4 ADDC A, B; Sumamos multiplicación, registro y arrastre ANL A, R3; Y además, si redondeamos a par, descartamos el bit menos significativo MOV R4, A MOV A, R5 ADDC A, R6; Hemos tenido R6=0 durante mucho tiempo, aunque no agregamos nada allí durante la multiplicación JC Pid7Umax; Si R6 > 0 => desbordamiento MOV R5, A; R5:R4 => resultado limitado de 16 bits; Ahora necesitamos limitar R5:R4 a Umax/Umin MOV A, UmaxL SUBB A, R4; C=0 actualmente MOV A, UmaxH SUBB A, R5 JC Pid7Umax; Si R5:R4>Umax => R5:R4 = Umax MOV A, UminL SUBB A, R4 ; C=0 actualmente MOV A, UminH SUBB A, R5 JNC Pid7Umin; Si R5:R4 R5:R4 = Umín; Potencia calculada MOV UH, R5 MOV UL, R4 SETB UReady AJMP CalcExit Pid7Umax: ; Establecer potencia máxima MOV UH, UmaxH MOV UL, UmaxL SETB UReady AJMP CalcExit Pid7Umin: ; Establecer potencia mínima MOV UH, UminH MOV UL, UminL SETB UReady AJMP CalcExit

IX. Aplicación de influencia.

Entonces tenemos un impacto calculado y nuestro trabajo es aplicarlo. Para ello se utiliza un ciclo de funcionamiento general a una frecuencia de 50 Hz. En el ciclo par se realizan mediciones y cálculos, en el ciclo impar se aplica la influencia. Así se obtiene el esquema general: se fija la potencia, se realizan mediciones y cálculos a través de una sinusoide y se utiliza una nueva a través de otra.

X. Escollos.

Comparado con el esquema de diferencia, el esquema directo tiene muy pocos inconvenientes, aquí hay una lista de los que vi:
  • Contabilidad de dimensiones. El error más importante y más común. No se puede simplemente tomar U=K*(Err+Ki*Int+Kd*Diff), sin estipular QUÉ son K, Ki, Kd. ¿Y con qué exactitud? Es especialmente importante para el coeficiente Ki, que tiene la dimensión inversa del tiempo (si la operación es en números enteros, NO PUEDES simplemente multiplicar por él), ya que debe haber DIVISIÓN y el número inverso no se puede representar en números enteros.
  • Contabilidad del signo. Lo segundo muy importante es tener en cuenta el signo. Todas las operaciones deben estar firmadas, la integral debe acumular signo, ya que no solo reemplaza el componente proporcional, sino que también le permite resistir influencias externas, por ejemplo, la liberación de calor de la mezcla misma; y entonces su signo es negativo.
  • Contabilidad de desbordamiento. Para nosotros es importante obtener la potencia del 0% al 100%, o el hecho de que la potencia calculada sea mayor que el 100% o menor que el 0%. No es necesario hacer todos los cálculos si, por ejemplo, obtenemos un resultado negativo en el subgrupo. Pero al mismo tiempo, es importante tener en cuenta que puede ocurrir un desbordamiento durante la adición del producto, y debe tenerse en cuenta como "más del 100%", y en ningún caso el resultado debe dejarse después del desbordamiento. . Esto conlleva, en primer lugar, una falta de regulación cuando es necesario: el objeto está por debajo de la temperatura requerida y no se suministra energía.
  • Contabilidad del tiempo de cálculo. La necesidad de multiplicaciones de bits grandes (con una implementación curva, también divisiones) lleva tiempo, por lo que es extremadamente importante calcular el tiempo de ejecución de la versión del peor de los casos de los cálculos, y debe ser menor que el tiempo libre entre mediciones. . No hacerlo da como resultado un objeto no administrado que "parece funcionar, pero de alguna manera no funciona correctamente".

XI. Conclusiones.

Como resultado, el esquema de implementación directa no tiene los mismos problemas que antes, pero requiere más costos computacionales. Sin embargo, si se implementa correctamente, el circuito directo es bastante aplicable incluso en microcontroladores baratos de 8 bits y proporciona resultados más predecibles.