Desarrollo de un convertidor de dinero en STM32F334: principio de operación, cálculos, creación de prototipos

En mis últimos dos artículos, hablé sobre el módulo de potencia y la placa de control basados ​​en el microcontrolador STM32F334R8T6, que fueron creados específicamente para la implementación de sistemas de control para convertidores de potencia y unidades eléctricas. También se consideró un ejemplo de un convertidor CC / CA, que fue una demostración, no una construcción completa. Ahora es el momento de hacer algo simple, pero útil, y lo más importante, completado.

La mayoría de los problemas relacionados con el proyecto y la electrónica de potencia están relacionados con topologías específicas: alguien está interesado en aprender el algoritmo de control PFC, alguien quiere aprender a construir una LLC de medio puente, pero la topología más popular es, sin duda, dinero. Después de todo, el convertidor buck (también conocido como convertidor buck) es el principal para los proyectos más interesantes: este es el controlador para lámparas LED, la base del controlador MPPT para paneles solares, cargadores y mucho más.

La red tiene mucha información sobre dinero, incluidas hojas de datos, pero está dispersa y personalmente no he encontrado material que describa en detalle el proceso de creación de un convertidor de dinero con control digital. Es hora de arreglarlo. Prácticamente no hay matemáticas, la explicación está "en los dedos", por lo que será interesante para todos los que de alguna manera estén conectados con la electrónica.



Introduccion


Primero debe comprender lo que queremos obtener al final y qué introducción tenemos. La topología de inversión es reductora, es decir, le permite construir un convertidor reductor de tensión. Como verá más adelante, el voltaje en la salida del convertidor reductor depende casi linealmente del voltaje en la entrada, por lo que debe agregar retroalimentación. Hoy hablaré sobre la retroalimentación de voltaje simple, que es la más intuitiva y le permitirá comprender el principio de operación, mientras que esta retroalimentación es suficiente para que implemente la mayoría de las tareas.

Al final del artículo obtendremos una fuente de voltaje de trabajo estabilizado de acuerdo con la topología de "sincronización sincrónica", que opera a una frecuencia bastante alta con control digital, implementado en el STM32F334R8T6 usando PWM de alta resolución (HRPWM). El rango de voltaje de entrada es de 15 ... 60V, el voltaje de salida es de 12V y la corriente de salida máxima es de 2A.

Capítulo 1. El principio del dinero de topología


Comenzaré a decir a partir de lo más básico y gradualmente mejoraré nuestro convertidor, como "Synchronous buck" es una versión de la versión mejorada con mayor eficiencia y complejidad de control. La versión básica de la topología que probablemente utilizó es la siguiente:



Esta topología se utiliza en convertidores de voltaje de baja potencia, por ejemplo, para alimentar circuitos digitales y otros dispositivos de baja potencia. La reducción de CC / CC que utiliza en sus dispositivos probablemente se implemente en microcircuitos de acuerdo con esta topología. Un ejemplo de tal chip es LMR16006 .

El principio de funcionamiento de este circuito es muy simple, se suministra una señal PWM al transistor VT1, el trabajo en sí se divide en 2 etapas, que se alternan una tras otra:

  • La etapa de almacenamiento de energía en el circuito LC. En esta etapa, el transistor VT1 está abierto y la corriente fluye a través del transistor hacia la carga, almacenando simultáneamente energía en el inductor y la capacitancia de salida:

  • Etapa de descarga. En esta etapa, el transistor VT1 se cierra y luego comienza la diversión. Acelerador: es una cosa que acumula energía si se le aplica un potencial (abrir VT1) y la libera si el potencial desaparece (VT1 está cerrado). Al mismo tiempo, busca no solo dar energía, sino también guardar el valor de la corriente y su dirección, por lo tanto, para usar esta propiedad, debe agregar el diodo VD1 para cerrar el circuito, porque la corriente fluye solo en un circuito cerrado:


Cuando me familiaricé con esta topología en la clase 6-7, no entendí de inmediato por qué el diodo no conduce corriente en la primera etapa, ahora parece común, pero creo que vale la pena mencionarlo. Cuando VT1 está abierto, entonces el potencial + VIN, por ejemplo, + 20V, se aplica al cátodo del diodo VD1 y al potencial de tierra, respectivamente, en el ánodo del diodo. Para que la corriente fluya a través del diodo, debe ser exactamente lo contrario: el potencial en el ánodo debe ser mayor que el potencial en el cátodo, por lo tanto, en buck-e, en la etapa de almacenamiento de energía, el diodo está "cerrado". En la etapa de descarga, el diodo ya cierra el circuito, el potencial + VIN no actúa sobre su cátodo y no lo "bloquea". Espero haberlo explicado claramente.

Entonces debería tener una pregunta: "¿Y qué voltaje habrá en la salida, si aplicamos 20V a la entrada?". Como siempre, todo es simple:



Como se puede ver en la fórmula, el voltaje de salida depende linealmente del factor de trabajo de la señal PWM que suministramos al transistor VT1. Si alguien no conoce u olvidó el "factor de trabajo", esta es la relación entre el tiempo que el transistor está en estado abierto y la duración del período. Este coeficiente puede tomar un valor de 0 a 1 o de 0 a 100%. Además, operaremos con esta figura particular cuando controlemos el convertidor, pero para comprender la esencia, sustituyamos esta relación en la fórmula:



La frecuencia de operación del convertidor reductor es constante y se selecciona durante el diseño, no cambia durante la operación y, por lo tanto, el período (T) es constante. Resulta que el voltaje de salida depende directamente de dos cantidades físicas:

  • desde el momento en que abrimos el transistor superior (VT1): cuanto más tiempo está abierto, más energía tiene tiempo para acumularse en el filtro LC y, en consecuencia, el voltaje de salida es mayor;
  • del voltaje de entrada, por ejemplo, si fijamos el relleno en un 50% y cambiamos Vin de 20 a 40V, entonces el voltaje de salida también cambiará de 10 a 20V.

Creo que la imagen general y el principio del trabajo han comenzado a dibujar en ti, arreglémoslo ahora y miremos los oscilogramas reales y verifiquemos esta relación en la práctica. He ensamblado un diseño de dólar que está cargado con un LED de 10 W. Usé 3 canales del osciloscopio, que se incluyen en los siguientes puntos:



Experiencia No. 1 - Voltaje de entrada (Vin) constante 20V, el ciclo de trabajo cambia

  • Vin = 20V, D = 25%, Vout = D * Vin = 0.25 * 20V = 5V

  • Vin = 20V, D = 50%, Vout = D * Vin = 0.5 * 20V = 10V


Como puede ver en las formas de onda, la relación entre el voltaje de salida y el ciclo de trabajo es correcta. Por supuesto, este fue un experimento "idealizado", en realidad, el voltaje de entrada no es estable y flota en un rango bastante amplio. Veamos ahora cuál será la dependencia del voltaje de entrada en un llenado fijo.

Experiencia No. 2: el voltaje de entrada (Vin) está cambiando, el ciclo de trabajo es constante e igual al 50%

  • Vin = 15V, D = 50%, Vout = D * Vin = 0.5 * 15V = 7.5V

  • Vin = 20V, D = 50%, Vout = D * Vin = 0.5 * 20V = 10V

  • Vin = 30V, D = 50%, Vout = D * Vin = 0.5 * 30V = 15V


Ahora hemos visto en la práctica que el voltaje de salida también depende linealmente del voltaje de entrada en un ciclo de trabajo fijo. ¿Ya entiendes cómo estabilizará la salida? El principio de estabilización es tan simple como la fórmula en sí: Vout es de 12V y constante, podemos cambiar el ciclo de trabajo usando un microcontrolador, por lo que si Vin aumenta, el voltaje de salida también aumenta y en este momento disminuimos el factor de trabajo hasta que vuelva a ser 12V. En consecuencia, cuando Vin disminuye, comenzamos a aumentar el ciclo de trabajo hasta que nuevamente el voltaje Vout se convierte en 12V.

¿Qué más me gustaría llamar la atención en la sección teórica ... Ah, sí! Seguramente se estará preguntando cómo un PWM con una amplitud de 20 V después de un transistor finalmente se convirtió en un voltaje constante con ondulaciones escasas. De hecho, si colocamos la sonda roja del osciloscopio en la fuente del transistor VT1, la sonda verde después del filtro LC, veremos la siguiente imagen:



Puede ver cómo el filtro LC "lubrica" ​​el voltaje alterno a constante, pero la cuestión es que la energía almacenada en la inductancia y la capacitancia no se puede consumir instantáneamente, por lo tanto, el voltaje no puede cambiar instantáneamente. Obtenemos que en el momento en que el PWM frente al inductor se convierte en 0 V, el voltaje de salida es proporcionado por la energía almacenada en el filtro, que no absorbe inmediatamente y es suficiente para mantener el voltaje en el momento en que VT1 se cierra. Todo está en los dedos, por supuesto, si es interesante profundizar más, entonces, como siempre, aconsejo a B. Yu. Semenova "Power Electronics: de simple a complejo" , hay un capítulo completo sobre buck (chopper).

La lucha por la eficiencia.


Como escribí un poco antes, esta era la versión básica de la topología. Su principal desventaja son las grandes pérdidas en el diodo de bloqueo. ¿Cuál es la corriente en sistemas simples que operan en MK y CPLD? Por lo general, dentro de 1A, a veces 2A, si hay algún tipo de pantalla TFT. En este caso, la pérdida incluso cuando se usa un diodo Schottky será de 0.4V * 2A = 0.8 vatios. En principio, es tolerable disipar tanto en el paquete SMA / SMB sin problemas, aunque con un voltaje de 3.3V y 2A, ¡una pérdida de 0.8V sigue siendo un 12% de eficiencia!

Ahora imagine el caso cuando la corriente que tenemos es 20A. Puede ser un controlador MPPT, un gran sistema de alimentación FPGA y mucho más. ¡En este caso, la pérdida será 0.4V * 20A = 8 W! ¿Qué significa esto? Por ejemplo, en el caso de MPPT, tendrá menos energía almacenada en la batería, en el caso de la potencia FPGA serán 8 vatios adicionales de calor, que deben ser disipados en algún lugar y, en ambos casos, esto es sin duda una pérdida de eficiencia general. Que se puede hacer Y reemplacemos el diodo VD1 con otro Mosfet de canal N y obtengamos este circuito:



Ahora el transistor VT2 actúa como un diodo, es decir, conduce corriente cuando VT1 está cerrado. El diodo, que estaba en la versión básica, no requería control, ahora estamos obligados a pagar un canal de control adicional con una señal PWM para mejorar el rendimiento.

Primero, calculemos cuánto hemos reducido las pérdidas. La resistencia del canal de un mosfet moderno es de varios megaohmios. Como ejemplo, tomemos un transistor de mi módulo de potencia, del que hablé en artículos anteriores: IPP083N10N5AKSA1 con una resistencia de canal de 8.3 mOhm. Obtenemos pérdidas estáticas iguales a 0.0083 * 20A * 20A = 3.32 vatios. Por supuesto, habrá pérdidas dinámicas, que con un controlador diseñado adecuadamente no será más del 20%, es decir, las pérdidas totales para nosotros serán de 4 vatios. Obtenemos que la transición de un dólar convencional a uno sincrónico puede reducir a la mitad la pérdida del diodo.

Ahora echemos un vistazo a la gestión más complicada. Como ya entendimos, el diodo de bloqueo conducía corriente cuando se cerró VT1. De esto se deduce que VT2 debe estar cerrado cuando VT1 está abierto y, en consecuencia, VT2 está abierto cuando VT1 está cerrado. Si es más simple, los transistores funcionan alternativamente: uno está abierto o el otro, si ambos transistores están abiertos, habrá una corriente continua, porque están interconectados entre VIN y GND. Veamos cuál debería ser la señal, donde el "canal amarillo" es el transistor VT1 y el "canal verde" es el transistor VT2:



Como puede ver, si el "1" lógico se establece en el canal amarillo (en VT1), entonces en ese momento el "0" lógico debe establecerse en el canal verde (en VT2). Obtenemos que VT1 bombea energía al filtro LC, y VT2 cierra el circuito en la etapa de descarga.

Hay un punto más que ya ha escuchado o leído anteriormente: a través de la corriente . El hecho es que un transistor real, no un ideal (mosfet) tiene cierta capacitancia en la puerta, es decir, en realidad no pasa instantáneamente de log.0 a log.1, y la energía en el transistor no se disuelve instantáneamente, lo que resulta en transistores por un corto tiempo al momento del cambio, ambos pueden estar abiertos. Esto puede conducir, en el mejor de los casos, a mayores pérdidas, lo que significa calentamiento y, en el peor de los casos, a una babah, porque a través de la corriente es un cortocircuito común (cortocircuito). Para evitar esto, se introduce un retraso o el llamado tiempo muerto entre apagar un transistor y encender otro. Se ve así:



Creo que notó que hay un pequeño espacio en el límite de cambio de señal. Lo instalé a sabiendas grande (alrededor del 3%) para que pueda verlo, en realidad es mucho más pequeño. En general, el tiempo muerto (en adelante dt) se establece lo más corto posible, pero al mismo tiempo suficiente para permitir que los transistores se cierren. Puede calcularse, o puede seleccionarse empíricamente, personalmente creo que esta y esa opción es normal, pero el Jedi barbudo probablemente le dirá: "¡Es necesario considerarlo, pero es mejor modelarlo!" Esto es ciertamente correcto, pero decida usted mismo: si no es demasiado vago, modele en LTspice teniendo en cuenta las inductancias y capacitancias parásitas de conductores y componentes.

Para el stand en este artículo, configuré dt a ~ 100 ns (en realidad 104). Mi módulo te permite instalarlo mucho menos, porque el controlador es muy duro, pero seguro que muchos de ustedes construirán su diseño sin mi módulo, lo que significa que probablemente habrá mocos. Para que no me quede atascado debido a los mocos, dejaré dt con un margen y si tiene un cableado normal en el tablero, entonces usted mismo puede reducirlo; luego, en el capítulo sobre el código, verá cómo, por ahora, vemos si realmente hay dt:



Se puede ver que dt dura 2.5 divisiones y cada división es de 40 ns, lo que significa que la duración es de ~ 100 ns, como se pretendía. Espero que comprenda por qué se necesita dt, cuánto tiempo debe durar y cómo funciona el convertidor según la topología de dólar. Si no comprende, entonces, como de costumbre, se aceptan preguntas en los comentarios, PM y correo, mientras que parece que respondo a todos.

Capítulo 2. El cálculo de los componentes principales.


En esta parte del artículo, mostraré cómo calcular rápida y fácilmente los principales componentes de potencia para un convertidor reductor síncrono, a saber: inductores, condensadores de entrada y salida, transistores.

Déjame recordarte los datos de entrada:

  • Voltaje de entrada: 15 ... 30V
  • Voltaje de salida: 12V
  • Corriente nominal de salida: 2A
  • Frecuencia de conmutación: 100 kHz

El voltaje de salida de 12V se selecciona porque Planeo usar un LED de 12V 20W como carga, que resultó estar a la mano y es una carga muy obvia. Anticipando las preguntas de los "expertos" en los comentarios, sí, soy consciente de que el LED necesita estabilización de corriente, pero luego hacemos un estabilizador de voltaje y el LED es solo una carga.

El voltaje de entrada se selecciona del bulldozer, puede hacer 15 ... 60V, por lo que si está interesado en un rango diferente, puede calcular el valor de los componentes para usted mismo. Se elige una corriente nominal de 2A para obtener la potencia de salida de 12V * 2A = 24 W, es decir, un poco más de lo que se necesita para el LED. El LED en sí mismo a 12V consume aproximadamente 1.82 ... 1.9A.

El parámetro más interesante permaneció: la frecuencia de funcionamiento del convertidor. Que debe ser Tendrá que responder aquí usted mismo, en mi caso es de 100 kHz. La elección se basa en dos puntos:

  • Un aumento en la frecuencia conduce a una disminución en la inductancia necesaria del inductor, capacitor de entrada y salida. En pocas palabras: con un aumento en la frecuencia, las dimensiones del dispositivo disminuyen. Con frecuencia decreciente, las dimensiones aumentan.
  • Una disminución en la frecuencia conduce a un aumento en la eficiencia, ya que Se reducen las pérdidas dinámicas cuando se cambian los transistores. El aumento de la frecuencia aumenta el componente dinámico de los transistores y, en consecuencia, reduce la eficiencia.

Ahora no discutiré la elección de la frecuencia, solo asuma que 100 kHz. Después de mostrar la metodología de cálculo, volveremos a esta pregunta, porque De acuerdo con las fórmulas, la dependencia de las clasificaciones de los componentes principales en la frecuencia de operación será más claramente visible.

Paso 1. Elegir transistores

Estaremos interesados ​​principalmente en 3 parámetros: el voltaje máximo "fuente de drenaje", la resistencia del canal en estado abierto y la capacitancia de la puerta. El potencial completo de la fuente de voltaje (Vin) se aplica al transistor, y también hay sobretensiones en el momento de la conmutación. Tiene 2 opciones: tomar el transistor VT1 y VT2 con un margen de voltaje o la historia del amortiguador RC en VT2. En mi caso, el módulo de potencia tiene transistores de 100V, y con una entrada de 30V, este es un gran margen de voltaje, incluso 60V fue suficiente para evitar los amortiguadores y proteger el transistor de la falla.

Resistencia del canal: cuanto más pequeño, mejor, pero hay un PERO. Con una disminución en la resistencia del canal, reducimos las pérdidas estáticas (I 2 * R), pero la tecnología es tal que la capacitancia de la puerta aumenta, y esto conduce a un aumento en las pérdidas dinámicas. Debe encontrar un punto medio entre "resistencia de canal" y "capacidad de obturación". Para voltajes de hasta 100V, le aconsejo que preste atención a los transistores de la serie Infineon OptiMOS, que usted mismo observe los altos voltajes mediante la búsqueda paramétrica o incluso hacia los transistores IGBT. Este último también es compatible con mi módulo de alimentación y no requiere ningún cambio en el controlador.

Paso 2. El cálculo de la inductancia del inductor.

Es necesario calcular el valor mínimo de la inductancia, lo que permitirá que nuestro convertidor CC / CC funcione en el modo de corriente continua (L min ):



En términos de variables, creo que todo está claro excepto - k ind . Estas son corrientes de ondulación permitidas en el inductor, generalmente eligen un valor de 20 ... 50%, pero casi siempre establezco un 30%. Cuanto más pequeña sea la onda de la corriente, más lejos estaremos del borde de saturación del núcleo en el que se enrolla el inductor, pero como se puede ver en la fórmula, se necesita una gran inductancia del inductor.

Ahora calculamos el valor mínimo de la inductancia, que será necesaria para mis datos de entrada, la ondulación pondré un 30% como escribí anteriormente:



Debe entenderse que esta es la inductancia mínima requerida para que el convertidor reductor funcione en el modo de corrientes inextricables, pero nuevamente hay un matiz. En el proceso de aumentar la corriente que actúa en el devanado, la permeabilidad del núcleo y la inductancia del inductor SIN corriente y Con corriente son algo diferentes, la dependencia es diferente para diferentes materiales.Para evitar la situación cuando, con un aumento de la corriente en el inductor, la inductancia disminuye por debajo de L min y dc / dc no entra en el modo de corriente de corte, es necesario aumentar un poco la inductancia, es decir, agregar un par de vueltas adicionales durante el bobinado. Un aumento en la inductancia del 10-15% será suficiente para el material Kool Mu, y mi estrangulador estará en él.

Paso 3. Cálculo y fabricación del inductor

Me gustaría describir este procedimiento en la sección de "creación de prototipos", pero luego el paso de calcular la inductancia habría quedado menos claro para usted, y probablemente me perdí las imágenes interesantes, así que describiré todo aquí. Para la fabricación del acelerador, tomaré el acelerador R26 / 14/11 (R es el anillo y los números son las dimensiones) del material Kool Mu con permeabilidad 60, puede descargar la documentación y comprarlo aquí.Lepkos .



Ahora necesita calcular cuántas vueltas y qué cable necesita enrollar. Comencemos con el número de vueltas, tal vez. Hay un parámetro tan conveniente en la documentación para el núcleo: A L , que es igual a 75 nH / vuelta 2 . Aquí con cuidado, ¡se convierte en un cuadrado! Para encontrar la inductancia central, multiplique A L por el número de vueltas en el cuadrado. A partir de aquí, la fórmula para encontrar el número de vueltas se ve así:



para obtener la inductancia mínima requerida, es necesario enrollar 40 vueltas, pero como ya hemos discutido, es necesario aumentar ligeramente la inductancia, agreguemos 3 vueltas. Tomamos el anillo y damos 43 vueltas, tenemos un acelerador:



Ahora, en aras del interés, calculamos qué inductancia debería resultar:



y para mayor fiabilidad, verificamos la inductancia del inductor con pinzas:



137 μH, ¡genial! Resultados convergieron, un error de ± 8% a A L . Vale la pena señalar aquí: si no tiene la capacidad de medir la inductancia, entonces no compre núcleos para aliexpress, ChiDa, computadora, electrónica y otros "restaurantes": existe la posibilidad de obtener el núcleo de otro material o con la permeabilidad incorrecta, pero con la marca correcta. verificado Sin la capacidad de medir la inductancia, no podrá comprobar A L y podrá atormentarse mucho en busca de la causa del "babakh" de su convertidor.

Esto plantea una pregunta razonable: "¿tendremos suficiente núcleo y sus dimensiones? Tal vez fue necesario más? ". Para el material Kool Mu, el límite de inducción magnética es 0.5 T; en la práctica, es mejor no gatear más allá de un umbral por encima de 0.45 T sin que sea claramente necesario. Resulta que el devanado enrollado en el núcleo no tiene que crear inducción en cada punto del núcleo más de 0.45 T, por lo que verificamos:



Como puede ver, el valor de la inducción magnética de 0.06 T es mucho más bajo que el límite de 0.5 T. De esto se pueden sacar dos conclusiones: en primer lugar, el acelerador no entrará en saturación, y en segundo lugar, el núcleo es muy grande y es poderoso para tomar un anillo mucho más pequeño. Tomé el anillo R26 simplemente porque tengo toda su caja, no hay otro significado secreto.

Queda por determinar qué sección del cable tomar para el inductor. En primer lugar, le recomiendo encarecidamente que no tome un cable con un diámetro de más de 1 ... 1.2 mm a frecuencias tan altas, porque El efecto de la piel ya tiene un efecto significativo y reduce la sección transversal efectiva. En segundo lugar, la densidad de corriente en el cable debe seleccionarse en función de las condiciones de enfriamiento y la potencia. A bajas potencias (hasta 10-20 W), puede colocar de forma segura una densidad de corriente de 8..10 A / mm 2 incluso sin flujo de aire. Con potencias de hasta varios kilovatios, es mejor colocar la densidad de corriente en el rango de 5 ... 6 A / mm 2 , y con potencias de 10 kW en adelante, será razonable reducir la densidad de corriente a 3 ... 4 A / mm 2 .

En la punta de mis dedos había un alambre barnizado con un diámetro de 0.8 mm. Su sección transversal, respectivamente, es ~ 0.5 mm 2 . A una corriente de 2A, obtenemos una densidad de corriente en el devanado de aproximadamente 4 A / mm 2 . Podría usar un cable con la mitad de la sección transversal, pero mi núcleo es lo suficientemente grande, por lo que un cable de sección transversal más grande se ajusta sin ningún problema. Cuando optimice su dispositivo, primero tendrá que contar y luego comprar el cable de la sección transversal deseada, luego podrá obtener las dimensiones óptimas del inductor.

Paso 4. Cálculo del condensador de salida.

En esta etapa, como en el caso de la inductancia, consideraremos el valor mínimo de la capacitancia que debe instalarse en el filtro LC a la salida del convertidor reductor. En consecuencia, si instala más, será mejor y luego verá por qué. Calculemos la capacidad: por



supuesto, la capacidad también debe ponerse con cierto margen, especialmente si usa solo cerámica en la salida, porque su capacidad se reduce considerablemente según el voltaje que se le aplica. También vale la pena prestar atención a la dependencia de las pulsaciones: el pulso V variable. Este es el valor máximo de la onda en la salida, es decir, idealmente, con una capacitancia de 147.8 μF, la amplitud de la onda será 0.2V, es decir, el voltaje de salida flotará en el rango de 11.9 ... 12.1V. ¿Quieres reducir la ondulación? Luego, reduzca la fórmula y el valor de la capacidad resultante aumentará en consecuencia, por supuesto, no obtendrá una fuente de alimentación de laboratorio simplemente aumentando la capacidad de salida. También es necesario tener en cuenta la necesidad de un ESR bajo, para esto generalmente colocan 1-2 electrolitos en paralelo y cuelgan cerámica en algunos microfaradios con un dieléctrico X7R preferiblemente. Si el presupuesto lo permite, es posible reemplazar el condensador electrolítico con polímero de tántalo (como en la GPU), por lo que no se necesitan cerámicas, tienen una pequeña ESR.

Consideraciones de frecuencia

Ahora, como dije, volveremos a la cuestión de elegir la frecuencia de funcionamiento del convertidor. Permítanme dividir las conclusiones en algunos pensamientos:

  • Como puede ver en la fórmula, aparece la frecuencia, cuanto mayor es la frecuencia de operación, menor será la inductancia del inductor y menos bobinas tendrán que enrollarse: ahorramos cobre y simplificamos la fabricación de productos de bobinado.
  • La inductancia y el número de vueltas están presentes en la fórmula para calcular la inducción magnética, aunque como recordarán, la inductancia tiene una dependencia cuadrática de los giros, lo que significa que cuando el número de vueltas se reduce 2 veces, la inductancia disminuye 4 veces. De esto se deduce que al aumentar la frecuencia, la inductancia y el valor de la inducción magnética disminuyen, lo que significa que se puede usar un núcleo más pequeño, es decir, reducimos las dimensiones
  • , — , , . !
  • … , . buck- mosfet- 200 . ( ) ? GaN

Creo que a partir de estas tesis quedó claro qué afecta la frecuencia de conmutación, ahora debe aprender cómo encontrar la "media de oro" entre las pérdidas en los transistores y el tamaño del dispositivo usted mismo. En uno de los siguientes artículos, le enseñaré a optimizar la frecuencia de funcionamiento para obtener la máxima eficiencia, lo principal es no olvidar que lo iba a hacer.

Capítulo 3. Montaje de un diseño de convertidor de dinero


Entonces, la parte más tediosa, pero importante, ha terminado, ahora el hardware y el código desaparecerán. Vamos a armar un diseño en el que implementaremos cálculos teóricos. Para hacer esto, necesitará dos módulos sobre los que hablé en artículos anteriores: el módulo de alimentación y el módulo de control en el STM32F334 . También puede ensamblar un medio puente de cualquier basura improvisada del tipo IR2110 en una placa de pruebas, y usar cualquier MK como control: STM32-Discovery, LaunchPad, Arduino y simplemente adaptar la lógica de trabajo y el código a su MK favorito, nada será complicado si Usted comprendió en los primeros dos capítulos cómo funciona el convertidor de dinero.

Ahora hagamos que nuestro diagrama de inversión sea más "realista" agregando los valores de todos los componentes y reflejando correctamente el número de condensadores, así como también observemos qué parte puede realizar mi módulo de potencia:



Como puede ver en el diagrama, el módulo ya contiene un medio puente (dos transistores) para implementar una batería síncrona y un condensador de entrada, por cierto, está en el módulo con un margen enorme: hay 3 electrolitos de 1000 uF y 100V cada uno, esto es suficiente para ensamblar fácilmente una pelota por 500 -800 vatios Nos queda agregar un estrangulador, que ya hemos fabricado y emitir condensadores, este último también por cierto con un margen, porque Encontré solo 4700 uF 25V para baja tensión, pero son algún tipo de chino, así que también decidí hacer un paralelo. De hecho, hay suficientes 470 uF allí, pero simplemente no tenía tanta bagatela en la versión de salida. Resulta este diseño:



Como se mencionó anteriormente, se utiliza un potente LED de 20 W como carga. No sé cuánta luz brilla, y no es muy interesante, pero consume solo 21 ... 22 W a 12 V para el que está diseñado mi convertidor de dinero. El propio LED cubrió el KPT-8 y lo atornilló al radiador, por supuesto, no es suficiente, pero dura de 5 a 7 minutos sin problemas (se calienta hasta +40 ... 50 o C), y no necesito más. Conectamos 2 señales HRPWM, GND desde el módulo de control y, a través del divisor, conectamos la salida de inversión al ADC, como resultado, tenemos tal soporte:



Capítulo 4. Escribir software e iniciar el convertidor


Ahora tenemos todo lo que necesitamos para comenzar a escribir código y revitalizar nuestro convertidor de dinero. Primero, veamos el pin-out para el microcontrolador STM32F334R8T6, que se encuentra en el módulo de control:



Ahora entendemos qué pines del microcontrolador se utilizarán. En el módulo en sí, solo necesito 1 de cada 5 canales para controlar la unidad de alimentación, utilizaremos el canal "A". Este canal, como todo lo demás, tiene 2 salidas de PWM de alta precisión (HRPWM), 1 entrada de error (no lo usamos), GND para combinar la tierra de las placas y 2 canales ADC (usaremos solo uno para el voltaje).

Un poco sobre HRPWM

En las extensiones del segmento de Internet en ruso, casi no conocí ningún material de capacitación sobre HRPWM y no reuní todos los materiales para trabajar con HRPWM basado en microcontroladores STM32, y este es un periférico muy útil.

No profundizaré en la teoría de esta periferia en el marco de este artículo, por lo que describiré la esencia. HRPWM o PWM de alta resolución es nuestro módulo PWM habitual, que tiene una mayor resolución para establecer el factor de trabajo y, además, generalmente tiene configuraciones más flexibles.



  • El microcontrolador STM32F334R8T6 tiene 10 canales HRPWM, que se combinan en 5 grupos de 2 canales. Estos 2 canales dentro del grupo pueden funcionar de manera independiente y formar un par complementario; necesitamos el último;
  • Dentro del par complementario entre 2 señales PWM, es posible instalar tiempo muerto de hardware para protección contra la corriente de paso;
  • Los 10 canales se sincronizan desde un temporizador: temporizador maestro, por lo que todos están sincronizados entre sí y no tiene que configurar manualmente una cadena de temporizadores. Es suficiente encender el temporizador maestro y el temporizador A ... E para que se sincronice desde él;
  • La frecuencia en HRPWM se duplica, es decir, a una frecuencia central de 72 MHz, en HRPWM es 144 MHz después de un multiplicador adicional (x2) con PLL. Esto hace posible controlar los convertidores a una frecuencia de cientos de kHz;
  • Una gran cantidad de configuraciones para el control PWM, por ejemplo, junto con la capacidad de vincular la generación PWM al comienzo y al final del período, hay 4 eventos más configurables (comp) que le permiten traducir el PWM a 0 o 1 en cualquier punto del período que no sea el comienzo / final del período;
  • Hay modos para topologías específicas, por ejemplo, el modo push-pull, que le permite implementar muchas topologías push-pull.

Y esto es solo una pequeña parte de las características, en el diagrama del dispositivo HRPWM puede ver las capacidades de sincronización con un montón de eventos, DAC, comparadores integrados en el MK, y junto con este diagrama de bloques hay muchas más posibilidades documentadas.

Queda la última pregunta que debe abordarse: "¿por qué este PWM es de alto bit?". Para hacer esto, considere un ejemplo simple. Imagine que decidimos usar MK sin HRPWM, digamos STM32F103C8T6, que también funciona a una frecuencia de 72 MHz. Necesitamos controlar el medio puente a una frecuencia de 70 kHz, consideramos qué paso de regulación podemos obtener: 72 000 000/1025 pasos = 70 243 Hz. Sí, tenemos 1025 pasos y al ajustar podemos cambiar el voltaje de salida con un paso teórico de 1/1025 = ~ 0.1%. Ahora tomamos STM32F334, con una frecuencia de reloj de 144 MHz y un ancho de desplazamiento del temporizador de 32 bits, obtenemos la frecuencia equivalente de 144 MHz * 32 = 4.608 GHz. Para aquellos que se asustaron y dudaron de la cifra:



No, esta no es una frecuencia operativa, es una frecuencia equivalente. ¿Qué nos da esto? Tomamos la frecuencia equivalente de 4 608 000 000 Hz / 70 300 Hz = 65 535 pasos. Ahora podemos ajustar el voltaje (o corriente) en la salida en incrementos de 1/65 535 = ~ 0.001%, es decir, ¡100 veces más preciso!

Y ahora hagámoslo: tenemos una frecuencia de 700 kHz, que es normal para un dólar multifásico, por ejemplo. F103 obtendrá 72,000,000 Hz / 700,000 Hz = 102 pasos, lo que le permite obtener una regulación del 1% en el mejor de los casos, pero esto es 1% para el trabajo, es decir, en realidad con tantos pasos tendrá voltaje flotando en la salida como si se estabilizara y no realmente Mientras que para F334 el número de pasos será aproximadamente de 6500, lo que aún le permite construir un regulador de voltaje o corriente muy preciso. Obtenemos que la resolución (paso) de la configuración del ciclo de trabajo es mucho más alta / más frecuente que con una MK convencional con un módulo PWM estándar en su interior.

Configuración del sistema de reloj

Utilicé TrueSTUDIO como entorno de desarrollo en este artículo, porque es gratis, no tan miserable como Keil o IAR , sí, sí, cuénteme sobre su maravilloso depurador , multiplataforma y quizás la mejor solución para principiantes y no solo. Al final del artículo habrá un archivo con el proyecto específicamente para este IDE. No le diré cómo crear y configurar un proyecto, simplemente dejaré un enlace al video donde se muestra todo en detalle: mire .

Después de crear un proyecto y parpadear el LED, debe configurar el sistema de reloj, es decir, desde 8 MHz, elevar la frecuencia a 72 MHz y aplicarlo al núcleo, y luego ajustar el divisor para reducir la frecuencia suministrada al ADC:

void StartInitClock (void) { RCC->CR |= RCC_CR_HSEON; // Enable HSE while (!(RCC->CR & RCC_CR_HSERDY)); FLASH->ACR |= FLASH_ACR_LATENCY_1; RCC->CFGR |= RCC_CFGR_PLLMUL9; // PLL mult x9 RCC->CFGR |= RCC_CFGR_PLLSRC; // Source HSE RCC->CFGR2 |= RCC_CFGR2_ADCPRE12_DIV10; // ADC source AHB/10 RCC->CR |= RCC_CR_PLLON; while((RCC->CR & RCC_CR_PLLRDY) == 0){} RCC->CFGR &= ~RCC_CFGR_SW; RCC->CFGR |= RCC_CFGR_SW_PLL; // Select source SYSCLK = PLL while((RCC->CFGR & RCC_CFGR_SWS) != RCC_CFGR_SWS_1) {} // Wait PLL } 

Aquí, creo que el algoritmo de sintonización es el siguiente: cambia a cuarzo externo (HSE) -> esperamos cuando se completa la transición y se establece la bandera de listo -> enviamos la señal del cuarzo a la entrada PLL -> multiplicamos 8 MHz por 9 -> dividimos la frecuencia por 72 MHz por 10 para cronometrar el ADC -> encienda PLL -> espere hasta que se encienda y establezca el indicador de listo -> envíe una señal desde PLL al bus del sistema y al núcleo -> espere hasta que se complete el cambio -> hecho.

Configuración de HRPWM

Aquí todo es algo más complicado, porque Este módulo tiene mucha funcionalidad, una gran cantidad de configuraciones y la cantidad de documentación es muy grande, pero esto es un inconveniente y al mismo tiempo más: debe pagar por la flexibilidad.

 RCC->CFGR3 |= RCC_CFGR3_HRTIM1SW_PLL; RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN; 

Debe especificar que HRTIM está sincronizado desde PLL, el multiplicador x2 ya está habilitado de forma predeterminada. Luego, simplemente activamos el reloj para HRTIM, aquí está la primera característica, ya que entendemos que el temporizador se sincroniza desde PLL, pero lo activamos para APB2. Esto no es del todo lógico, pero se busca fácilmente en el archivo con CMSIS o en la documentación.

  RCC->AHBENR |= RCC_AHBENR_GPIOAEN; GPIOA->MODER &= ~GPIO_MODER_MODER8; GPIOA->MODER |= GPIO_MODER_MODER8_1; // Alternative PP GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; // Very high speed GPIOA->MODER &= ~GPIO_MODER_MODER9; GPIOA->MODER |= GPIO_MODER_MODER9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; GPIOA->AFR[1] |= 0xDD; // PA8 and PA9 - AF13 

PA8 y PA9 son la salida del temporizador A, que en mi módulo va al canal n. ° 1, que puede ver en el diagrama y pin-out. Las patas están configuradas como push-pull con una función alternativa, el número de la función en sí para ambas patas es el 13. También es importante sintonizar la frecuencia GPIO máxima, de lo contrario habrá un bloqueo incomprensible del frente y la caída de la señal, lo cual es extremadamente crítico para la electrónica de potencia.

 HRTIM1->sCommonRegs.DLLCR |= HRTIM_DLLCR_CAL | HRTIM_DLLCR_CALEN; while ((HRTIM1->sCommonRegs.ISR & HRTIM_ISR_DLLRDY) == RESET); 

Antes de comenzar, debe calibrar el temporizador, porque Funciona con retrasos mínimos, luego solo espera la bandera de listo.

 HRTIM1->sTimerxRegs[0].PERxR = PeriodTimerA; // Period for timer A HRTIM1->sTimerxRegs[0].CMP1xR = 0; // Duty for timer A 

Eso es flexibilidad. En primer lugar, podemos establecer nuestra propia frecuencia para cada temporizador A ... E, aquí simplemente registramos el período de nuestro PWM. En segundo lugar, por defecto tenemos la alineación PWM al comienzo del período, es decir, la señal va a log.1 al comienzo de un nuevo período, y ahora tenemos que elegir cuándo volverá a log.0, en este caso, por el comparador No. 1, es decir Pido en él esencialmente el factor deber.

Por ejemplo, puede traducir PWM no al comienzo del período, sino por el comparador n. ° 1, y volver a log.0 por el comparador n. ° 2 y, por lo tanto, mover el hardware por fases.

 // Deadtime enable HRTIM1->sTimerxRegs[0].OUTxR |= HRTIM_OUTR_DTEN; // Tdtg = 6.94 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTPRSC_0 | HRTIM_DTR_DTPRSC_1; // Deadtime rising = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTR_0 | HRTIM_DTR_DTR_1 | HRTIM_DTR_DTR_2 | HRTIM_DTR_DTR_3; // Deadtime falling = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTF_0 | HRTIM_DTR_DTF_1 | HRTIM_DTR_DTF_2 | HRTIM_DTR_DTF_3; HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTFSLK | HRTIM_DTR_DTRSLK; 

En esta etapa, habilitamos el tiempo muerto y lo configuramos, en principio, los comentarios contienen todas las fórmulas, también se pueden encontrar en el manual de referencia. DT con una duración de ~ 100 ns que ya ha visto en la forma de onda en el capítulo teórico de este artículo. El tiempo muerto se puede configurar por separado en el borde y en la disminución de la señal. Por cierto, [0] es el temporizador A, respectivamente [1] es el temporizador B y así sucesivamente.

 // Samples in middle of ON time HRTIM1->sTimerxRegs[0].CMP2xR = PeriodTimerA / 10; // ADC trigger 1 update: Timer A HRTIM1->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 event: Timer A compare 2 HRTIM1->sCommonRegs.ADC1R |= HRTIM_ADC1R_AD1TAC2; 

Para mí, este no fue el momento más obvio. La conclusión es: quiero asegurarme de que durante el 10% de la duración del período del temporizador A se genere un evento que desencadene la conversión de ADC y mida la señal de retroalimentación. ¿Por qué 10%? Simplemente, idealmente, la medición no debe ocurrir en el momento de la transición de la PWM de 0 a 1 o viceversa, porque En este momento en la unidad de potencia hay transitorios e interferencias, pero no necesitamos medirlos. Por lo tanto, el 10% en mi caso es óptimo, porque a una salida de 12 V y 30 V, el voltaje de entrada del factor de trabajo no caerá al 10% y el momento de conmutar el transistor no coincidirá exactamente con la medición del ADC.

Ahora debe mirar el sistema de comunicación de eventos entre HRTIM y el ADC:



En la primera línea, elegimos cuándo se activará el comparador, en mi caso es el 10% del período del temporizador A. A continuación, seleccionamos un activador específico en el ADC que se pondrá en contacto con el MK, tenemos acceso a la 1ra o 3ra. Ahora simplemente indica qué evento enviará la señal al ADC, en mi caso es el comparador No. 2.

 // Enable output PWM for TA1 and TA2 HRTIM1->sCommonRegs.OENR |= HRTIM_OENR_TA1OEN | HRTIM_OENR_TA2OEN; // Continuous mode HRTIM1->sTimerxRegs[0].TIMxCR |= HRTIM_TIMCR_CONT; // Period for master timer HRTIM1->sMasterRegs.MPER = 65000; // Enable counter for Master and timer A HRTIM1->sMasterRegs.MCR |= HRTIM_MCR_MCEN | HRTIM_MCR_TACEN; 

Y el acorde final! Permitimos que HRTIM envíe señales desde el temporizador A a nuestro GPIO. Ahora seleccionamos el modo, sucede sin fin (lo tengo), pero sucede que el temporizador se enciende durante 1 período y luego debe reiniciarse. Luego, configure el período para el temporizador maestro y actívelo como el último paso, comienza a cronometrar los temporizadores del canal y aparece la señal PWM en la salida.

Era una función de ajuste, queda por hacer una función que establezca el factor de trabajo, es con ella que trabajaremos al crear el controlador:

 void SetDutyTimerA (uint16_t duty) { HRTIM1->sTimerxRegs[0].CMP1xR = duty; } 

Listado de configuraciones de funciones y configuración del ciclo de trabajo
 // f = 102,4 kHz #define PeriodTimerA ((uint16_t)45000) void InitHRPWM (void) { RCC->CFGR3 |= RCC_CFGR3_HRTIM1SW_PLL; RCC->APB2ENR |= RCC_APB2ENR_HRTIM1EN; /************************************************ * Setting GPIO ***********************************************/ RCC->AHBENR |= RCC_AHBENR_GPIOAEN; // Alternative PP GPIOA->MODER &= ~GPIO_MODER_MODER8; GPIOA->MODER |= GPIO_MODER_MODER8_1; // Very high speed GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR8; GPIOA->MODER &= ~GPIO_MODER_MODER9; GPIOA->MODER |= GPIO_MODER_MODER9_1; GPIOA->OSPEEDR |= GPIO_OSPEEDER_OSPEEDR9; // PA8 and PA9 - AF13 GPIOA->AFR[1] |= 0xDD; /************************************************ * Setting timer A ***********************************************/ HRTIM1->sCommonRegs.DLLCR |= HRTIM_DLLCR_CAL | HRTIM_DLLCR_CALEN; while ((HRTIM1->sCommonRegs.ISR & HRTIM_ISR_DLLRDY) == RESET); // Period for timer A HRTIM1->sTimerxRegs[0].PERxR = PeriodTimerA; // Duty for timer A HRTIM1->sTimerxRegs[0].CMP1xR = 0; // Deadtime enable HRTIM1->sTimerxRegs[0].OUTxR |= HRTIM_OUTR_DTEN; // Tdtg = 6.94 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTPRSC_0 | HRTIM_DTR_DTPRSC_1; // Deadtime rising = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTR_0 | HRTIM_DTR_DTR_1 | HRTIM_DTR_DTR_2 | HRTIM_DTR_DTR_3; // Deadtime falling = 15*Ttg = 104 ns HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTF_0 | HRTIM_DTR_DTF_1 | HRTIM_DTR_DTF_2 | HRTIM_DTR_DTF_3; HRTIM1->sTimerxRegs[0].DTxR |= HRTIM_DTR_DTFSLK | HRTIM_DTR_DTRSLK; // Event forces the output to active state for TA1 HRTIM1->sTimerxRegs[0].SETx1R |= HRTIM_SET1R_PER; // Event forces the output to inactive state for TA1 HRTIM1->sTimerxRegs[0].RSTx1R |= HRTIM_RST1R_CMP1; /************************************************ * ADC trigger intialization (with CMP2 event) ************************************************/ // Samples in middle of ON time HRTIM1->sTimerxRegs[0].CMP2xR = PeriodTimerA / 10; // ADC trigger 1 update: Timer A HRTIM1->sCommonRegs.CR1 |= HRTIM_CR1_ADC1USRC_0; // ADC trigger 1 event: Timer A compare 2 HRTIM1->sCommonRegs.ADC1R |= HRTIM_ADC1R_AD1TAC2; /************************************************ * HRTIM start ***********************************************/ // Enable output PWM for TA1 and TA2 HRTIM1->sCommonRegs.OENR |= HRTIM_OENR_TA1OEN | HRTIM_OENR_TA2OEN; // Continuous mode HRTIM1->sTimerxRegs[0].TIMxCR |= HRTIM_TIMCR_CONT; // Period for master timer HRTIM1->sMasterRegs.MPER = 65000; // Enable counter for Master and timer A HRTIM1->sMasterRegs.MCR |= HRTIM_MCR_MCEN | HRTIM_MCR_TACEN; } void SetDutyTimerA (uint16_t duty) { HRTIM1->sTimerxRegs[0].CMP1xR = duty; } 


Ahora veamos si nos estamos moviendo de la manera correcta. En la función principal , inicialice la configuración HRTIM y establezca el ciclo de trabajo, digamos 22500. Con un voltaje de entrada de 20V y un período de 45000, nuestro ciclo de trabajo será del 50% y la salida será de aproximadamente 10V. Esto no es suficiente para expandir el LED al máximo, pero debería encenderse y entenderemos si la sección de alimentación funciona, está todo bien con dt y así sucesivamente. Empecé todo la primera vez:



Puede ver que todos los cálculos teóricos anteriores han sido confirmados. Con un factor de trabajo fijo del 50%, el voltaje de salida simplemente se dividió entre 2: 20V -> 10V, 22V -> 11V, 18V -> 9V. Ahora hagamos que el voltaje de salida sea estable e independiente de la entrada, es decir, agreguemos comentarios.

ADC y ajuste del controlador

Ya se ha escrito mucho sobre los ADC en STM32 antes que yo, solo me detengo en configurar el disparador asociado con el comparador HRTIM. Hablaré brevemente sobre el resto de la configuración de ADC. Nos fijamos en la función de inicialización:

 void InitBasicADC (void) { RCC->AHBENR |= RCC_AHBENR_ADC12EN; RCC->AHBENR |= RCC_AHBENR_GPIOCEN; /************************************************ * Calibration ***********************************************/ ADC2->CR &= ~ADC_CR_ADVREGEN; ADC2->CR |= ADC_CR_ADVREGEN_0; // Vref enable Delay(10); ADC2->CR &= ~ADC_CR_ADCALDIF; ADC2->CR |= ADC_CR_ADCAL; // Start calibration while (ADC2->CR & ADC_CR_ADCAL); // Wait end calibration /************************************************ * Select event trigger and channel ***********************************************/ // Enable start conversion external trigger ADC2->CFGR |= ADC_CFGR_EXTEN_0; // Event 7 - HRTIM ADC2->CFGR |= ADC_CFGR_EXTSEL_0 | ADC_CFGR_EXTSEL_1 | ADC_CFGR_EXTSEL_2; // Select ADC2 channel IN5 ADC2->SQR1 |= ADC_SQR1_SQ1_0 | ADC_SQR1_SQ1_2; // Length regular ADC channel = 1 ADC2->SQR1 &= ~ADC_SQR1_L; ADC2->IER |= ADC_IER_EOCIE; // Interrupt enable NVIC_EnableIRQ(ADC1_2_IRQn); // enable interrupt ADC1 and ADC2 /************************************************ * Start ADC ***********************************************/ ADC2->CR |= ADC_CR_ADEN; // Enable ADC2 Delay(10); ADC2->CR |= ADC_CR_ADSTART; } 

Uso el modo de canal normal, solo tengo un canal y está seleccionado en el registro SQR1 . Involucrado ADC número 2, es decir, su entrada IN5, es rápido y puede operar a la frecuencia de muestreo máxima, pero no esta vez. La frecuencia de muestreo es igual a la frecuencia PWM, porque 1 período = 1 muestra, en principio, esto es más que suficiente.

Además, en el registro CFGR , debemos seleccionar el evento por el cual comenzará la conversión, es decir, el Evento 7 , ¿por qué exactamente? Buscamos en RM:



El disparador 1 del módulo HRPWM llega al Evento 7 para nuestro ADC No. 2, que en este caso funciona como esclavo, luego se controla desde el módulo HRPWM. Creo que ahora está claro cómo conectar 2 módulos, en principio, el algoritmo es similar para cualquier periferia y cualquier temporizador, solo el nombre del registro será diferente.

Cuando se alcanza el contador del período del temporizador maestro, se iniciará una conversión, que después de aproximadamente 15 ciclos (para cuánto se ve exactamente en RM) causará una interrupción y puede recoger el resultado en ella. Es en esta interrupción que organizamos el algoritmo de control. Sí, dentro de la interrupción, algo masivo es mejor no hacerlo, es mejor configurar la bandera y pasar la ejecución, pero me permitiré esa simplificación, porque en este caso mi controlador no está particularmente cargado y logrará calcular y salir de la interrupción con una probabilidad del 146% para La aparición de uno nuevo.

Un poco sobre gerencia

Imagina que entraste al baño y decidiste lavarte las manos en el lavabo. Abres ligeramente el agua, la tocas con la mano, ¿frío? Añadir más agua caliente, más caliente? Bueno! Añadir más agua caliente? ¿Casi lo que necesitas? Bueno! Agregue más agua caliente, intente con su mano, quémese? Bajemos un poco el calor ahora. Ok? Y así, hasta el infinito, abrirá el grifo hasta que la temperatura del agua se vuelva ideal. Esta es la perilla más fácil!

Solo que no regulamos la cantidad de agua caliente, sino el ciclo de trabajo PWM. En lugar de una mano, tenemos un ADC con un resultado medido. Solo queda implementar la lógica. Calcularemos lo que debe producir el ADC a una salida de 12V y luego, usando la condición if , haremos que nuestro controlador mantenga este valor cambiando el factor de trabajo.

Para comenzar, cuelguemos un divisor de voltaje para reducir 12V a 2-2.5V, por ejemplo, porque El ADC puede medir de 0 a + 3.3V y si se suministran 12V, entonces el microcontrolador se quemará simplemente. Por lo tanto, pondré un divisor con valores nominales de 10 kOhm y 2 kOhm, lo que dará una relación de división de 6 y, en consecuencia, nuestro + 12V se convertirá en + 2V. Nuestro ADC producirá el resultado: adcResult = (V out / k) / V ref * 2 12 = (12V / 6) / 3.3 * 4095 = 2481. Ahora escribimos el código para el controlador de interrupciones:

 void ADC1_2_IRQHandler (void) { ADC2->ISR |= ADC_ISR_EOC; adcResult = ADC2->DR; if (adcResult > 2480) { dutyControl = dutyControl - 10; } else { dutyControl = dutyControl + 10; } SetDutyTimerA(dutyControl); } 

En primer lugar, después de entrar en el controlador de interrupciones, debe borrar el indicador de esta interrupción, de lo contrario, la segunda vez no entrará en él. Luego leemos el resultado y lo guardamos como una variable adcResult . Ahora, conociendo el voltaje en la salida, necesita ajustar el ciclo de trabajo para el PWM, implementé esto simplemente a través de la condición if . En cada período PWM, tomamos una medida, aumentamos o disminuimos el ciclo de trabajo y establecemos el resultado para el siguiente período. Todo es simple, rápido y la esencia es visible. Nos fijamos en el resultado del trabajo:



Como puede ver, todo funciona y cuando el voltaje de entrada cambia, la salida en sí se mantiene estable a 12V. Muy atento puede notar pequeñas agujas deslizándose, entonces solo necesita colgar cerámicas X7R en la salida de 1-10 microfaradios y se irán, soy demasiado flojo para buscarlo y soldarlo. Ahora el oscilograma en sí, para no estropear los ojos:



Aquí puede ver cómo aumenta el voltaje de salida. El hecho es que, debido al algoritmo de control, para que el llenado alcance un valor de 0 a 10000, por ejemplo, se necesitan mil períodos o aproximadamente 10 ms. Me conviene porque un inicio suave, si quieres reducir el tiempo de subida, complica un poco el algoritmo y agrega +1000, no +10, y cuanto más te acerques a los 12V especificados, menos regulación harás hasta llegar a +10 . En general, se pueden hacer muchas cosas en términos de gestión, por lo que tiene un campo para experimentos.

Otro punto interesante es la oscilación en el momento del apagado, como una "armónica". El hecho es que después de apagar la alimentación, mi parte digital continúa funcionando desde otra fuente de alimentación e intenta mantener el valor deseado en la salida. ¿De dónde viene la energía? Sí, desde el condensador de entrada, estos son los que son 1000 microfaradios ya 3 piezas, este es un fenómeno tan interesante.

Conclusión


El artículo no era pequeño, pero querías todo e inmediatamente te dicen que preparemos el trozo de hierro, tenlo. Espero que disfruten el artículo, traté de hacerlo no científico, sino científico popular, para que el material sea accesible a personas con diferentes niveles de conocimiento y experiencia. Quizás en el futuro analice de manera similar otras topologías como boost, full bridge y otras.

Por cierto, este artículo y este código servirán para el nuevo controlador MPPT en 20A, que estoy diseñando. Ahora estoy esperando las placas PCBway , que en realidad se ofrecieron para patrocinar mis proyectos de código abierto con placas de circuito impreso, las fuentes MPPT también estarán abiertas como para todos mis módulos.

¡Olvidé lo más importante! Mantenga el proyecto con el código para TrueSTDIO - RAR .

Source: https://habr.com/ru/post/es432778/


All Articles