Full text
Proyecto Fin de Carrera Ingeniería de Telecomunicación Formato de Publicación de la Escuela Técnica Superior de Ingeniería Autor: F. Javier Payán Somet Tutor: Juan José Murillo Fuentes Dep. Teoría de la Señal y Comunicaciones Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2013 Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías Industriales Simulación de un convertidor DC/DC para aplicación fotovoltaica mediante plataforma embebida Autor: María Aguilar Vega Tutor: Sergio Vázquez Pérez Departamento de Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2017
Trabajo Fin de Grado Grado en Ingeniería de las Tecnologías Industriales Simulación de un convertidor DC/DC para aplicación fotovoltaica mediante plataforma embebida Autor: María Aguilar Vega Tutor: Sergio Vázquez Pérez Profesor Contratado Doctor Departamento de Ingeniería Electrónica Escuela Técnica Superior de Ingeniería Universidad de Sevilla Sevilla, 2017
Trabajo Fin de Grado: Simulación de un convertidor DC/DC para aplicación fotovoltaica mediante plataforma embebida Autor: María Aguilar Vega Tutor: Sergio Vázquez Pérez El tribunal nombrado para juzgar el trabajo arriba indicado, compuesto por los siguientes profesores: Presidente: Vocal/es: Secretario: acuerdan otorgarle la calificación de: El Secretario del Tribunal Fecha:
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida El valor de una idea radica en el uso de la misma. — Thomas A. Edison. I
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Agradecimientos Este proyecto supone el final de un deseado objetivo perseguido durante a˜nos. Una etapa que, aunque parezca contradictorio, ha sido dura, divertida, amarga, dulce, nueva y sobre todo, enriquecedora. Con todo esto, me gustar´ıa dedicar algunas palabras a todas aquellas personas que, de alguna manera, han hecho posible el alcance de esta ansiada meta: A mi familia, por la paciencia y el apoyo recibido. Especialmente en ´epocas duras y fechas de ex´amenes, cuando el estr´es se apoderaba de m´ı y me hac´ıa ver todo mucho m´as oscuro; por hacerme entender desde hace muchos a˜nos que, con esfuerzo, todo se consigue. A Pablo, por su inestimable apoyo a kil´ometros de distancia. Por haberme inundado de inmejorables experiencias durante todos estos a˜nos. A mis amigos y amigas, a los que mis logros los saborean como propios; a quienes han sabido mantener el contacto en la distancia y a quienes han hecho que no me quiera despedir de Sevilla. Y por ´ultimo a Sergio, por su infinita paciencia y valiosas aportaciones. Resulta una motivaci´on constante poder aprender de profesionales con ganas de transmitir, de ense˜nar y sobre todo, con ganas de ayudarte a ser cada vez mejor. Sinceramente, gracias. Mar´ıa Aguilar Vega Sevilla, junio de 2017 III
X Cap´ıtulo 0. ´ INDICE DE FIGURAS 5.1. Implementaci´on en bloques. . . . . . . . . . . . . . . . . . . . . . . . . 44 5.2. Implementaci´on en bloques. . . . . . . . . . . . . . . . . . . . . . . . . 45 5.3. Bloque Boost Controller. . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.4. External Control Loop. . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 5.5. InnerControlLoop.............................. 47 5.6. Generaci´on de PWM con tiempos muertos. . . . . . . . . . . . . . . . . 47 5.7. Disparos de los transistores con tiempos muertos. . . . . . . . . . . . . 48 5.8. Resultado tras la simulaci´on de bloques. . . . . . . . . . . . . . . . . . 49 5.9. Seguimiento de tensi´on con bloques. . . . . . . . . . . . . . . . . . . . . 50 5.10. Seguimiento en corriente con bloques. . . . . . . . . . . . . . . . . . . . 50 5.11. Aproximaci´on Euler I. . . . . . . . . . . . . . . . . . . . . . . . . . . . 51 5.12. Seguimiento de tensi´on con controladores en C. . . . . . . . . . . . . . 52 5.13. Seguimiento en corriente con controladores en C. . . . . . . . . . . . . . 52 5.14. Resultados de simulaci´on con C-Scripts. . . . . . . . . . . . . . . . . . 53 5.15. Implementaci´on en bloques. . . . . . . . . . . . . . . . . . . . . . . . . 54 5.16. Adaptaci´on de medidas. . . . . . . . . . . . . . . . . . . . . . . . . . . 56 5.17. Implementaci´on con PIL. . . . . . . . . . . . . . . . . . . . . . . . . . . 57 5.18.BloqueADC. ................................ 58 5.19. Bloque C2000 ePWM. . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.20.ePWMtipo1................................. 59 5.21. Comportamiento del driver. . . . . . . . . . . . . . . . . . . . . . . . . 59 5.22. Configuraci´on ePWM. . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 5.23. Diagrama de flujo de la funci´on principal. . . . . . . . . . . . . . . . . . 62 5.24. Diagrama de flujo de la interrupci´on del ADC. . . . . . . . . . . . . . . 63 5.25. Seguimiento de tensi´on en PIL. . . . . . . . . . . . . . . . . . . . . . . 64 5.26. Seguimiento de corriente en PIL. . . . . . . . . . . . . . . . . . . . . . 65 5.27. Resultado tras la simulaci´on con PIL. . . . . . . . . . . . . . . . . . . . 66 5.28. Resultado con PIL ante un cambio en irradiancia. . . . . . . . . . . . . 67 5.29. M´aquina de estados. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68 5.30. Diagrama de flujos de la interrupci´on con m´aquina de estados. . . . . . 69
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Cap´ıtulo 1 Introducci´on La energ´ıa solar fotovoltaica es una fuente limpia y renovable, con una larga vida ´util y una alta fiabilidad. Se trata de una energ´ıa libre y abundante en la mayor parte del mundo, que ha demostrado ser una fuente econ´omica en muchas aplicaciones de la actualidad: alimentaci´on de dispositivos aut´onomos, producci´on de electricidad, etc. Como se˜nalan Djamila Rekioua y Ernest Matagne en [1], la tecnolog´ıa fotovoltaica (PV) es una tecnolog´ıa en la cual, la energ´ıa radiante del sol se convierte directamente en corriente el´ectrica continua mediante un dispositivo semiconductor denomiado c´elula fotovoltaica1. El material m´as com´unmente empleado en las c´elulas de los paneles fotovoltaicos es el silicio. Posteriormente se expondr´a el principio de funcionamiento de una c´elula y se realizar´a una clasificaci´on de las mismas. Existen m´ultiples ventajas sobre el uso de sistemas fotovoltaicos. Entre ellas, caben destacar: •No existen part´ıculas m´oviles ni combustibles consumidos o emitidos. •Los procesos fotovoltaicos son completamente s´olidos y aut´onomos. •No necesitan conexi´on a una fuente de alimentaci´on o suministro de combustible existente. •Pueden soportar condiciones clim´aticas estrictas, como el tiempo nublado. •Se pueden combinar con otras fuente de alimentaci´on para aumentar la fiabilidad del sistema. •Su dise˜no es modular, por lo que permite una actualizaci´on de la planta a medida que aumenta la demanda de energ´ıa. •Su coste de producci´on es pr´acticamente nulo. En cualquier caso, como cualquier tipo de tecnolog´ıa tambi´en presenta inconvenientes, tales como la dependencia de la irradiancia en cada instante de tiempo y por lo tanto, de las limitaciones en la producci´on de energ´ıa en funci´on de la radiaci´on solar existente en cada instante. Se trata de una energ´ıa no despachable, por lo que para 1El t´ermino ((fotovoltaico)) se comenz´o a usar en Reino Unido en el a˜no 1849. Proviene del griego ϕως: phos, que significa ((luz)), y de -voltaico, que proviene del ´ambito de la electricidad, en honor al f´ısico italiano Alejandro Volta. 1
2 Cap´ıtulo 1. Introducci´on hacer que sea despachable es necesario el uso de almacenamiento, lo cual puede llegar a ser bastante costoso. Aunque el balance econ´omico en esta tecnolog´ıa parece ser positivo, existe cierto enfrentamiento entre la inversi´on en fuentes de energ´ıa renovables y el mantenimiento de las convencionales donde la inversi´on en centrales f´osiles ha sido considerable. En el caso de Espa˜na, los cambios de gobierno y pautas pol´ıticas han influido de tal manera que las inversiones en el sector f´osil no pueden dejar de ser consideradas: la introducci´on de renovables en la red el´ectrica supondr´ıa un coste de producci´on cero frente a las centrales convencionales, lo cual impide una recuperaci´on de las inversiones en las segundas. Es decir, la adopci´on de las energ´ıas renovables es lenta: una vez construida una central nuclear (o de cualquier otro tipo) no es viable apagarla hasta el fin de su vida ´util. A pesar de este tipo de problem´aticas, la energ´ıa fotovoltaica ya es pionera en muchos pa´ıses tales como Alemania, Escocia o Costa Rica. 1.1. Principio de funcionamiento de una c´elula fotovoltaica Como se ha comentado en el apartado 1, una c´elula fotovoltaica es un dispositivo electr´onico que transforma la energ´ıa solar en corriente continua. Para entender el funcionamiento de una c´elula fotovoltaica es necesario recordar los conceptos de electr´on, hueco y par electr´on-hueco (eh). Sup´ongase entonces un material semiconductor caracterizado por una energ´ıa Egentre la banda de conducci´on y la de valencia. Entonces, dada una temperatura algunos de los electrones consiguen la energ´ıa suficiente como para desprenderse de los ´atomos: estos se conocen como electrones libres. Igualmente a los enlaces vac´ıos se les denomina como huecos. Ambos procesos est´an asociados y por tanto se habla de par electr´on-hueco. En el caso de una c´elula fotovoltaica los procesos de generaci´on2y recombinaci´on3se producen cuando el semiconductor dopado se expone a radiaci´on electromagn´etica. Lo que ocurre es que un fot´on consigue desprenderse, de manera que es capaz de arrancar un electr´on creando un hueco en el propio ´atomo. Es decir, la energ´ıa que necesita el electr´on proviene del fot´on, aunque la interacci´on de la luz con la materia puede no llegar a ser efectiva pudiendo pasar a trav´es del material (fotones de baja energ´ıa) o puede ser que la luz se vea reflejada. Para la generaci´on de corriente el´ectrica es necesario la existencia de un campo el´ectrico que logre separar los pares eh, de forma que es necesario que el semiconductor est´e formado por dos capas: una capa tipo py otra tipo n. As´ı los huecos, se dirigen hacia el contacto del lado p, provocando la extracci´on de un electr´on desde el metal 2Proceso en el que un electr´on consigue la suficiente energ´ıa para pasar de la banda de valencia a la de conducci´on. 3Proceso an´alogo a la generaci´on: el electr´on cede energ´ıa pasando de la banda de conducci´on a la de valencia.
1.1. Principio de funcionamiento de una c´elula fotovoltaica 3 que constituye el contacto. Por su parte, los electrones se dirigen hacia el contacto del lado ninyect´andolos en el metal. Este fen´omeno induce una corriente el´ectrica por un circuito externo, haciendo que la c´elula funcione como generador. En la figura 1.1 se ilustra el funcionamiento de una c´elula fotovoltaica cuando se conecta a un circuito externo a trav´es de los contactos met´alicos. ++++++++++++++++++++++++++++++++++++++++++++ —————————————————————————— Zona N Zona P - + E eh+ Iph ID + - Recombinación Pérdidas por reflexión Pérdidas por transmisión Generación par eh Figura 1.1: Funcionamiento c´elula fotovoltaica. De esta forma, la corriente entregada por una c´elula se calcula como la suma neta de dos corrientes que se oponen: •Corriente de iluminaci´on: producida como consecuencia de la generaci´on de portadores que produce la propia iluminaci´on (fotones). Es funci´on dependiente de la radiaci´on luminosa y la temperatura. Iph =IL(1.1) •Corriente de oscuridad: surge como consecuencia del proceso de recombinaci´on de portadores debido al voltaje externo para poder entregar energ´ıa a la carga. Se puede expresar matem´aticamente seg´un la expresi´on (1.2). ID=IOhe eVD mkT −1i(1.2) Con las definiciones previas, se puede comprender f´acilmente el modelo de una c´elula fotovoltaica representado en la figura 1.2, donde la polarizaci´on p-n viene representada
4 Cap´ıtulo 1. Introducci´on por el propio diodo y las resistencias RsyRpmodelan, respectivamente, las p´erdidas internas del movimiento de los electrones y de los contactos met´alicos. Rs Rp VD = V + IRS ID Im V Iph Figura 1.2: Modelo de una c´elula fotovoltaica. El valor de la corriente Imgenerado por la c´elula viene dada por la ecuaci´on (1.3), donde mes un factor constante (normalmente comprendido entre 1 y 2) conocido como factor de idealidad del diodo, kla constante de Boltzman y Tla temperatura absoluta en Kelvin. Tambi´en se representa en la figura 1.3 la curva caracter´ıstica de una c´elula fotovoltaica deducida a partir de la ecuaci´on (1.3). Im=Iph −IOhee(V+IRs) mkT −1i−(V+IRs) Rp (1.3) —= Iph IL IDI VVV Figura 1.3: Curva I-V de una c´elula fotovoltica. 1.2. Tipos de c´elulas fotovoltaicas Actualmente, la tecnolog´ıa de fabricaci´on de c´elulas fotovoltaicas m´as empleada es el silicio monocristalino. En una de las capas de silicio se emplea un dopado P (boro, por ejemplo), mientras que para la otra se usa un elemento donador (f´osforo) para as´ı crear la uni´on p-n.
1.3. Curvas caracter´ısticas de una planta de paneles 5 La clasificaci´on m´as usual que se puede encontrar en bibliograf´ıa como [1] y [2] se realiza seg´un el tipo de silicio con el que se fabrican. As´ı se pueden distinguir c´elulas de: •Silicio monocristalino: se obtiene del propio silicio fundido y dopado con boro. Presenta t´ıpicos colores azules y el conexionado es visible. En cuanto al rendimiento en campo, sus valores t´ıpicos compenden entre el 15 y el 18 %. •Silicio policristalino: el proceso de solidificaci´on se hace en m´ultiples cristales. La fabricaci´on de este tipo de c´elulas es muy semejante al anterior con una simplificaci´on en el n´umero de pasos. Pueden aprecierase los cristales y se caracteriza por su tonalidad azul. El rendimiento oscila entre el 12 y el 14 %. •Silicio amorfo: se fabrica depositando una lamina delgada sobre sustrato de vidrio o pl´astico. A diferencia de las otras dos, presenta un color marr´on homog´eneo (aunque se pueden fabricar de diferentes colores) y no se aprecian las conexiones. A pesar del atractivo que presenta por el poco espesor a utilizar, su rendimiento en campo no llega al 10 %. La disposici´on final de una c´elula fotovoltaica queda como aparece representado en la figura 1.4. En dicha representaci´on, se muestra de forma descendente en la leyenda las capas que componen una c´elula desde la capa m´as interna (contacto met´alico) hasta la m´as externa (cristal de protecci´on). Contactos metálicos Capa antirreflectante Si-n Si-p Cristal de protección Figura 1.4: C´elula fotovoltaica. Para conseguir una c´elula fotovoltaica pr´actica es necesario a˜nadir contactos el´ectricos para poder extraer la energ´ıa que se genera. Adem´as, se usa una capa antireflectante para garantizar un nivel alto de absorci´on de fotones y que aumenta el rendimiento de la propia c´elula. Tambi´en es importante proteger la c´elula con un cristal de protecci´on que sea capaz de dejar pasar la luz. 1.3. Curvas caracter´ısticas de una planta de paneles Cada panel est´a formado por un n´umero determinado de c´elulas conectadas en serie. Igualmente, una planta o huerto fotovoltaico est´a compuesto por diferentes paneles
6 Cap´ıtulo 1. Introducci´on dispuestos en serie o en paralelo. De esta forma se puede hacer referencia a las curvas de funcionamiento de la planta o de un m´odulo individual. En la figura 1.5 se representan dichas gr´aficas en condiciones ideales: irradiancia de 1 kW/m2y 25oC de temperatura del panel. I V V P PMPP IMPP VMPP ISC VOC VOC Figura 1.5: Curvas de funcionamiento en condiciones nominales. Como puede observarse en la figura 1.5, existe un punto de funcionamiento para el cual la potencia generada, por el panel o el conjunto de paneles, es m´axima. Dicho punto es conocido como punto de m´axima potencia (MPP). Tambi´en se definen otros puntos de inter´es que permiten definir completamente el comportamiento del panel: VMP P : tensi´on para la que se alcanza el punto de m´axima potencia. IMP P : corriente para la que se alcanza el punto de m´axima potencia. VOC: del ingl´es, open-circuit. Es la tensi´on de circuito abierto, definida como la diferencia de potencial que aparece en los extremos del circuito (bornas de los paneles) cuando no existe ninguna carga externa conectada. ISC: del ingl´es, short-circuit. Se trata de la corriente de cortocircuito, definida como la corriente que circula por las bornas cuando se cortocircuita la salida.
1.4. Uso de convertidores par ala integraci´on en la red 7 Como es de esperar, la posici´on y trayectoria de las curvas se ven modificadas por la influencia de la irradiaci´on y temperatura, tal y como se muestra en la figura 1.6. La potencia generada ser´a menor cuanto menor sea la irradiancia y mayor sea la temperatura del panel. I V V P Efecto del aumento de la temperatura Efecto de la irradiancia VMPP , IMPP Figura 1.6: Efecto de la irradiancia y la temperatura en las curvas de funcionamiento. 1.4. Uso de convertidores para la integraci´on en la red Una planta solar fotovoltaica cuenta con distintos elementos que permiten el funcionamiento de la misma. Uno de los m´as importantes es el convertidor de potencia para la transformaci´on de la corriente continua en corriente alterna. Dependiendo del tipo de integraci´on del sistema en la red de distribuci´on podr´a ser necesario el uso de convertidores DC/DC, lo cual permite incrementar el nivel de tensi´on en la entrada del inversor. A continuaci´on se desarrollar´an los tipos de conexiones de paneles PV.
8 Cap´ıtulo 1. Introducci´on Inversor centralizado En este tipo de configuraci´on s´olo se hace uso de un inversor central al que llega la corriente de todas las hileras, tal y como se puede observar en el esquema de la figura 1.7. Cada hilera necesita un diodo de paso4para evitar que la hilera que produce menos energ´ıa consuma energ´ıa de la que produce m´as. Entre sus ventajas destacan su alta eficiencia (con conexi´on de paneles en serie), su bajo coste y una alta fiabilidad. Por el contrario, presenta el inconveniente de que toda la potencia es evacuada a trav´es de un ´unico convertidor, por lo que en caso de fallo la producci´on se detiene. Adem´as la b´usqueda del punto de m´axima potencia proporcionar´a un punto de funcionamien- to global a todas las hileras (que en condiciones generales, trabajar´an con distintas condiciones ambientes), por lo que no se podr´a extraer el cien por cien de la potencia. Filtro Red Inversor DC-Link Conexión de paneles Figura 1.7: Configuraci´on de inversor centralizado. Inversores en hileras Cada hilera tiene su propio inversor de forma que es posible encontrar el punto de m´axima potencia para cada hilera, por lo que el hecho de que las hileras presenten diferentes condiciones de trabajo deja de ser un problema mayor. Resulta m´as costoso que la configuraci´on anterior debido a que el n´umero de inversores necesarios es mayor. En la figura 1.8 aparece representada dicha configuraci´on. Normalmente cada hilera representa una fase, instalando una hilera entre una fase y el neutro de la red, de manera que se pueden simultanear la fases, aunque a partir de 5kW es necesaria la inversi´on en trif´asica. 4En la realidad, en el dise˜no de huertos solares tambi´en se utilizan fusibles. Esto permite una disminuci´on de las p´erdidas debido a la ca´ıda de tensi´on en los diodos.
1.4. Uso de convertidores par ala integraci´on en la red 9 Filtro Red Inversor DC-Link Conexión de paneles Hileras Figura 1.8: Configuraci´on de inversores en hileras. Configuraci´on multihilera Se trata de una evoluci´on de la configuraci´on en hileras, como se puede observar en el esquema de la figura 1.9. Se emplea un convertidor Boost para cada hilera y la salida de cada convertidor se conecta a un bus com´un de continua que a su vez se conecta al inversor. Red Convertidor elevador Filtro Conexión de paneles DC DC Filtro DC-Link Inversor Figura 1.9: Configuraci´on multihileras. Con esta distribuci´on es posible encontrar en punto de m´axima potencia por cada hilera y usar un inversor central con mejor rendimiento que los de configuraci´on en hilera. El mayor inconveniente se encuentra en el uso de los dos convertidores (DC/DCDC/AC), ya que al tener una disposici´on en cascada las p´erdidas se suman. El bus de alterna puede ser monof´asico o trif´asico. Configuraci´on modular Este tipo de configuraci´on tambi´en se conoce como ”paneles CA”. Se caracterizan por no tener cableado en corriente continua, ya que se integra un inversor con cada panel.
16 Cap´ıtulo 2. Modelo del sistema Internamente, el modelo est´a constinuido por una ganancia que representa el valor de irradiancia nominal, por lo que la entrada de irradiancia debe ser un porcentaje sobre la irradiancia nominal en tanto por uno. La ecuaci´on que regula la corriente generada por la unidad viene dada por la ecuaci´on (2.1). Este valor de corriente se satura inferiormente a cero para evitar dar una corriente en sentido negativo. Im=Iph −IOhee(V+RsI) V m −1i(2.1) Figura 2.4: M´ascara del bloque panel. 2.3. Resultados caracteristicos del modelado Para comprobar el funcionamiento de la planta y su dise˜no se realiza una simulaci´on que permite caracterizar correctamente los par´ametros que definen las curvas de las figuras 2.5 y 2.6. El punto de m´axima potencia est´a en 431,6 V y 28,1 A para dar una potencia de 12,1 kW.
2.3. Modelo de la planta de paneles 17 0 100 200 300 400 500 600 Tensión de la planta PV(V) 0 2000 4000 6000 8000 10000 12000 14000 Potencia de la planta PV (W) Figura 2.5: Curva P-V de la planta de paneles. 0 100 200 300 400 500 600 Tensión de la planta PV (V) 0 5 10 15 20 25 30 Corriente de la planta PV (A) Figura 2.6: Curva I-V de la planta de paneles.
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Cap´ıtulo 3 Algoritmos MPPT y dise˜no del control Los algoritmos de seguimiento del punto de m´axima potencia (MPPT) son utilizados en sistemas fotovoltaicos para maximizar la energ´ıa entregada por los paneles. La variaci´on de esta energ´ıa se consigue a trav´es de un cambio del ciclo del convertidor de potencia, en este caso, del convertidor Boost. En este cap´ıtulo se explica los algoritmos m´as usados para el c´alculo del MPP: P&O, m´etodo de conductancia incremental y el m´etodo de tensi´on constante, aunque se centrar´a m´as en el m´etodo de conductancia incremental, que es el se va a implementar en el modelo. Tambi´en existen otros algoritmos menos utilizados como el fuzzy logic control o el de redes neuronales. Estos algoritmos difieren en su complejidad, velocidad de convergencia, efectividad y costo, como puede comprobarse en [1]. Por ´ultimo, tambi´en se desarrollar´a el dise˜no de los lazos interno y externo de control del convertidor elevador con sus respectivas ecuaciones. 3.1. M´etodo Perturbance and Observe (P&O) Se trata de uno de los algoritmos m´as utilizados para el c´alculo del MPP. Su comportamiento se especifica en el diagrama de flujos representado en la figura 3.1. Como su propio nombre indica, se funcionamiento se basa en la propia observaci´on del sistema: para un instante de tiempo kse establece una Vref y en el instante k+ 1 medimos el valor de voltaje a la salida del panel. Atendiendo a la curva caracter´ıstica potencia-voltaje de una planta de paneles, si el voltaje en el instante k+1 es mayor que en el instante ky la potencia ha aumentado, quiere decir que el punto de trabajo se encuentra a la izquierda del punto de m´axima potencia y por tanto, se debe incrementar Vref . En caso contrario, estar´ıa posicionado en la parte derecha con pendiente negativa, por lo que la referencia de voltaje debe disminuir. Dichos aumentos o decrementos en la tensi´on de referencia de los paneles se corresponder´a, respectivamente, con un incremento o decremento del valor del ciclo de trabajo del convertidor elevador. 19
20 Cap´ıtulo 3. Algoritmos MPPT y dise˜no del control Las razones principales por el cu´al se trata de un algoritmo muy utilizado reside b´asicamente en la facilidad de su implementaci´on y su bajo coste computacional. Sin embargo, este algoritmo produce oscilaciones alrededor del MPP (lo cual conlleva a m´as p´erdidas por conmutaci´on), aunque el m´etodo tradicional puede ser modificado de tal forma que con factores de aceleraciones e incrementos de la referencia variable sea posible favorecer la convergencia del algoritmo. Otro inconveniente que hace que no sea del todo eficiente es que no presenta muy buena respuesta cuando la irradiancia es alta. Inicio Pk-1 = Pk Muestrear Ik, Vk Pk = IkVk Pk — Pk-1 = 0 Pk — Pk-1 > 0 Vk — Vk-1 > 0 Vk — Vk-1 > 0 Incrementar Vref Decrementar Vref Incrementar Vref Decrementar Vref Volver Sí Sí Sí Sí Figura 3.1: M´etodo Perturbance and Observe (P&O). 3.2. M´etodo de tensi´on constante El m´etodo de tensi´on constante o m´etodo de la tensi´on de circuito abierto fraccional se basa en una aproximaci´on proporcional entre la tensi´on del punto de m´axima potencia y la tensi´on de circuito abierto. Se considera que VMP P ≃Kv·Voc (3.1) donde Kves un factor de proporcionalidad comprendido entre, aproximadamente, 0,71 y 0,78. Su algoritmo se representa esquem´aticamente en la figura 3.2.
3.3. M´etodo de conductancia incremental 21 La aproximaci´on (3.1) resulta ser v´alida si se entiende que la tensi´on del panel var´ıa relativamente poco con la irradiaci´on. Comparte las mismas ventajas que el algoritmo P&O: f´acil y bajo coste de implementaci´on. El inconveniente que presenta es que de forma general, no es capaz de trabajar de una manera m´as o menos precisa en el punto de m´axima potencia. Este efecto se hace cada vez m´as considerable cuanto menor es la irradiancia. Tambi´en son considerables las p´erdidas de potencia recurrente, ya hay que detener la generaci´on de potencia para poder conocer la tensi´on de circuito abierto. Inicio Parar inyección de potencia Desconectar el panel y medir Voc Vref = Kv · Voc Fin Figura 3.2: M´etodo de la tensi´on a circuito abierto fraccional. 3.3. M´etodo de conductancia incremental El fundamento del algoritmo de conductancia incremental reside en el c´alculo de la pendiente de la curva caracter´ıstica de potencia vista en el cap´ıtulo 1, concretamente, en la figura 1.5. Como ocurre con el m´aximo de cualquier funci´on matem´atica, la pendiente en el MPP es nula. Igualmente, como indica la figura 3.3, seg´un se est´e a la izquierda o derecha del m´aximo, la pendiente ser´a, respectivamente, positiva o negativa. Por este motivo, este m´etodo utiliza el c´alculo de la pendiente como se expresa en la ecuaci´on (3.2).
22 Cap´ıtulo 3. Algoritmos MPPT y dise˜no del control V P Pmax dP/dV > 0 dP/dV < 0 Figura 3.3: Concepto del algoritmo de conductancia incremental. dP dV=d(V I) dV=I+VdI dV≃I+V∆I ∆V (3.2) Por tanto, los tres posibles valores para la pendiente ser´an: ∆I ∆V =−I V: la pendiente es nula, estamos en el MPP. ∆I ∆V >−I V: estamos a la izquierda del MPP. ∆I ∆V <−I V: nos situamos a la derecha del MPP. donde I Vse le denota como conductancia instant´anea y ∆I ∆V como conductancia incremental. Una vez entendido el fundamento te´orico del algoritmo resulta sencillo comprender el diagrama de flujos propuesto en la figura 3.4. Al igual que ocurre con otros algoritmos, este m´etodo tambi´en se presta al uso de factores de aceleraci´on para facilitar su convergencia y evitar posibles oscilaciones alrededor del MPP. Para el desarrollo de este proyecto, se propone el algoritmo que se muestra en la figura 3.5. En dicha implementaci´on los factores de aceleraci´on se denotan como K1yK2: el incremento de la tensi´on referencia se calcula como un porcentaje de la pendiente de la potencia o del incremento de corriente entre los intervalos ky k+ 1. El decremento o incremento de Vref se consigue por el signo de ∆Vref , ya que se corresponder´a con el signo de el incremento de la pendiente o de la corriente. Las razones por las cu´ales se ha optado por esta soluci´on para la b´usqueda del punto de b´asicamente son, principalmente, la buena respuesta que presenta el algoritmo ante variaciones bruscas de la irradiancia y pr´acticamente, la inexistencia de oscilaciones alrededor del punto deseado de trabajo. Por el contrario, se debe que asumir una mayor complejidad y coste computacional, aunque con las tecnolog´ıas y recursos existentes esto no suponga un gran problema.
3.3. M´etodo de conductancia incremental 23 Inicio Muestrear Ik, Vk ΔI = Ik — Ik-1 ΔV = Vk — Vk-1 ΔV = 0 ΔI/ ΔV = - I/V Incrementar Vref Decrementar Vref Incrementar Vref Decrementar Vref Volver Sí Sí ΔI = 0 ΔI/ ΔV > - I/V ΔI > 0 Sí Sí Sí Ik-1 = Ik Vk-1= Vk Figura 3.4: M´etodo conductancia incremental convencional.
24 Cap´ıtulo 3. Algoritmos MPPT y dise˜no del control Inicio Muestrear Ik, Vk ΔI = Ik — Ik-1 ΔV = Vk — Vk-1 ΔV = 0 ΔI/ ΔV + I/V = 0 Volver Sí Sí Sí Ik-1 = Ik Vk-1= Vk ΔVref = K1 * ( ΔI/ ΔV + I/V ) ΔVref = K2 * ΔI ΔI = 0 Vref = Vk + ΔVref Figura 3.5: M´etodo conductancia incremental propuesto.
3.4. Formulaci´on del lazo externo de control 25 3.4. Formulaci´on del lazo externo de control Para el dise˜no del lazo externo de control se realiza un balance de potencia en el condensador de salida de la planta de paneles fotovoltaicos. Se parte entonces del modelo que se presenta en la figura 3.6. La fuente constante de corriente modela la fuente de energ´ıa renovable y, por su parte, como se ha comentado en cap´ıtulo 2, el control del inversor asegurar´a una tensi´on constante en el condensador de la etapa de salida del convertidor Boost (fuente de tensi´on constante). _ + Vdc iout ifem icon Figura 3.6: Esquema del convertidor y la planta de paneles. Se denota como iout a la corriente que circula por la bobina e ifem a la de la fuente de energ´ıa renovable (FEM). Aplicando la ley de Kirchoff en el nodo se˜nalado en la figura 3.6, se tiene que: CdVdc dt+iout =ifem (3.3) Multiplicando en ambos miembros de la ecuaci´on (3.3) por Vdc se obtiene el siguiente balance de potencias instant´aneas: CVdc dVdc dt=pfem −pout (3.4) donde pout es la potencia que debe salir del convertidor y pfem la que proporciona la fuente. Esta ´ultima expresi´on puede reformularse como: C1 2 dV2 dc dt=pfem −pout (3.5) Para resolver la ecuaci´on resulta conveniente plantear un cambio de variables que permita resolver una ecuaci´on diferencial ordinaria de primer orden lineal. pout =−Cdz dt+pfem (3.6)
32 Cap´ıtulo 4. Processor In the Loop (PIL) Figura 4.3: Configuraci´on general del PIL. (a) Entradas (b) Salidas Figura 4.4: Entradas y salidas de PIL.
4.3. Entorno de trabajo 33 de control (dicho archivo se selecciona accediento en Configure en la m´ascara proporcionada en la figura 4.3). De esta manera presenta una lista de variables que deben ser seleccionadas manualmente como entradas o salidas (ver figura 4.4). Aunque no se utiliza para el desarrollo de este proyecto, tambi´en es posible configurar condiciones iniciales para las Override Probes en la secci´on de Calibrations. Este apartado permite modificar los ajustes del c´odigo embebido como coeficientes de filtros. 4.3. Entorno de trabajo PIL est´a desarrollado para familias de procesadores espec´ıficas, que tienen la funcionalidad incorporada necesaria para la operaci´on PIL. Actualmente, dichos marcos y aplicaciones demo asociadas est´an disponibles para las familias de ST Microelectronics 32bit F4,Microchip dsPIC33FMCU yTexas Instruments (TI) C2000T M . En cualquier caso, el soporte para otras plataformas puede desarrollarse si se cumple los requisitos que aparecen en [4]: •Las herramientas de generaci´on de c´odigo son capaces de generar archivos binarios del formato ELF que contienen informaci´on de depuraci´on de DWARF. •La unidad menos direccionable (LAU) del procesador no supera los 16 bits. •El ancho de la direcci´on del procesador no supera los 32 bits. 4.3.1. PIL Prep Tool Como puede deducirse de su traducci´on, se trata de una herramienta proporcionada por Plexim y que forma parte del entorno de ejecuci´on. Esta herramienta debe ejecutarse en la compilaci´on del c´odigo y se encarga de analizar las macros especificadas de PIL para generar autom´aticamente archivos auxiliares que se compilan y se enlazan con las macros del c´odigo. Estos archivos auxiliares contienen funciones de inicializaci´on e incluyen un identificador ´unico global (GUID) que permite identificar el c´odigo embebido, de tal manera que a una compilaci´on s´olo le corresponde un ´unico fichero .out. 4.3.2. Variables Para la definici´on de los dos tipos de variables que se pueden definir para la comunicaci´on con PLECS, es necesario declararlas a trav´es de macros e instrucciones facilitadas por Plexim. 4.3.2.1. Read Probes Estas variables son las que reciben un valor en el entorno embebido y son enviadas a la simulaci´on de PLECS. Para declarar una variable como Read Probe se utiliza la macro PIL READ PROBE tal y como se muestra a continuaci´on.
34 Cap´ıtulo 4. Processor In the Loop (PIL) PIL_READ_PROBE(tipo de variable, nombrevariable, n, referencia, "unidad"); As´ı, tipo de variable se refiere al tipo de variable que se pretende declarar (entero, flotante, etc), nombrevariable es el nombre que se le quiere dar a la variable, nyreferencia son variables de prescalado del valor que toma la variable (el valor Valor read le´ıdo por la simulaci´on corresponde con la ecuaci´on (4.1)) y unidad es la unidad que lleva la variable declarada (V para voltios, A para amperios, etc). Valor read = Valor 2nreferencia (4.1) A continuaci´on se muestra un ejemplo de declaraci´on de una variable tipo float cuyo nombre es Vsalida: PIL_READ_PROBE(float, Vsalida, 10, 5, "V"); El valor le´ıdo por PLECS para un valor de la variable de 400 V ser´a: Valor read = 400 210 5 = 1,95V Esta macro permite la definici´on de una variable de cualquier tipo (int, float...) y tambi´en es reconocida por la herramienta Pil Prep Tool generando la siguiente l´ınea en el archivo autogenerado. PIL_SYMBOL_DEF(nombrevariable, n, referencia, "unidad"); Esta macro, a su vez, se trata de una variable tipo estructura est´atica de tipo constante: typedef struct { int q; float ref; char *unit; } pil_var; const pil_var PIL_V_nombrevariable = {n, referencia, "unidad"} 4.3.2.2. Override Probes Este tipo de variables son aquellas que se obtienen de la simulaci´on para usarlas en la tarea de control y se definen mediante la macro PIL OVERRIDE PROBE. Por tanto, s´olo las variables definidas como Override Probes podr´an ser configuradas como entradas del bloque PIL.
4.3. Entorno de trabajo 35 PIL_OVERRIDE_PROBE(tipo de variable, nombrevariable, n, referencia, "unidad"); Esta macro se expande en una definici´on de variable incrementada con dos s´ımbolos auxiliares que permiten que la variable sea transmitida al m´odulo PIL. struct nombrevariable { int variable int variable_probeV; int variable_probeF; }; Durante el an´alisis del archivo binario para la recopilaci´on de los s´ımbolos, PLECS detecta variables con las definiciones probeF yprobeV e identificas las variables Override Probes. Al igual que ocurr´ıa con las Read Probes, la herramienta PIL Prep Tool reconoce la macro PIL OVERRIDE PROBE y genera la siguiente macro auxiliar: PIL_SYMBOL_DEF(nombrevariable, n, referencia, "unidad"); Este tipo de variables tiene un comportamiento similar al de un interruptor con dos estados: uno de avance y otro de anulaci´on. En el primero, el valor de la variable es proporcionado por la aplicaci´on embebida, mientras que en el segundo el valor es suministrado por PLECS. Su estado se almacena en la variable auxiliar probeF y se puede conmutar din´amicamente en tiempo de ejecuci´on. Gracias a esto, se puede usar la misma compilaci´on de la aplicaci´on embebida para controlar el hardware real o ejecutar la simulaci´on en PLECS, simplemente cambiando el modo de estas variables sin necesidad de recompilar. Si se utiliza el valor suministrado por PLECS, el valor est´a almacenado en la variable auxiliar probeV. Para que la interacci´on con PLECS se lleve a cabo correctamente, el c´odigo en el hardware debe acceder a estas variables a trav´es de las siguientes macros: INIT OPROBE(probe): debe ser ejecutada en la inicializaci´on del programa para inicializar la variable. SET OPROBE(probe): asigna un valor a la variable. La propia herramienta de PIL genera una funci´on llamada PilInitOverrideProbes() que contiene la macro de inicializaci´on de todas las variables Override Probes. Como es de esperar, esta funci´on debe ejecutarse en la inicializaci´on del c´odigo antes de que alguna variable de este tipo sea utilizada.
36 Cap´ıtulo 4. Processor In the Loop (PIL) 4.3.3. Calibraciones PIL tambi´en ofrece un entorno para las calibraciones de variables como las ganancias o umbrales del c´odigo embebido. Esta operaci´on se lleva a cabo a trav´es de la macro PIL CALIBRATION tal y como se muestra a continuaci´on. PIL_CALIBRATION(tipodevariable, variable,n, referencia, "unidad", minrango, maxrango, valorpordefecto); Se puede observar la semejanza que presenta con las macros introducidas anteriormente. Los tres nuevos valores del final del comando son, respectivamente, el valor m´ınimo permitido, el valor m´aximo y su valor por defecto. Esta macro desemboca en la definici´on de una macro PIL SYMBOL CAL DEF, la cual proporciona la informaci´on que se necesita para que PLECS interprete y maneje la calibraci´on. Para ello es necesario llamar a la funci´on PilInitCalibrations() en el inicio de la ejecuci´on del c´odigo para establecer el valor de la variable al valor de defecto. Para deshacer los cambios realizados durante la simulaci´on, esta funci´on tambi´en debe ser llamada en PIL CLBK TERMINATE SIMULATION, que se explica en el apartado 4.4.1. 4.3.4. Identidad del c´odigo Ya se ha comentado en la secci´on 4.3.1 que es importante asegurarse de que el archivo binario seleccionado en el bloque PIL coincida con el c´odigo que se est´a ejecutando en el DSP. La explicaci´on reside en que el bloque PIL extrae la direcci´on de una variable dada de la informaci´on del debug contenida en el archivo binario. Por tanto, si se asegura que el archivo es el correspondiente a la compilaci´on es posible que el bloque acceda a ubicaciones de memorias err´oneas. Para conseguir esta identificaci´on, se compara un identificador (GUID, que se genera al ejecutar la herramienta Pil Prep Tool) almacenado en el archivo .out con el suministrado por el hardware. Esta comprobaci´on se realiza al inicio de la simulaci´on pero es f´acil comprobarlo manualmente en la propia configuraci´on del bloque PIL: el propio bloque te informa del error y por tanto no estar´a disponible el modo Ready for PIL. 4.3.5. Agente remoto El agente remoto es el que efect´ua el enlace de comunicaci´on (bien en serie o bien en paralelo) con PLECS y procesa los comandos recibidos de PLECS para acceder a las variables y se encarga de pasar el c´odigo durante los pasos de simulaci´on. 4.3.5.1. LLamadas de comunicaci´on PIL interact´ua con el driver de comunicaci´on espec´ıfico mediante funciones de comunicaci´on. Estas funciones son:
4.4. Ejecuci´on 37 CommCallback() : se ejecuta en cada interrupci´on del sistema desde la llamada PIL beginInterruptCall(), cuyo funcionamiento se justificar´a la secci´on 4.4. BackgroundCommCallback() : es llamada peri´odicamente por PIL backgroundCall(), la cual tambi´en se explicar´a posteriormente en el apartado 4.4. Dependiendo del tipo de comunicaci´on que se quiera llevar a cabo es necesario hacer uso de las funciones explicadas en las siguientes subsecciones 4.3.5.2 y 4.3.5.3. Para el desarrollo del proyecto se utiliza la comunicaci´on a trav´es de la interfaz de comunicaci´on serie del DSP. 4.3.5.2. Comunicaci´on serie Para llevar a cabo este tipo de comunicaci´on, el asistente remoto utiliza una capa de mensajes y chequeo de errores, lo que hace el protocolo sea v´alido y apropiado para otros muchos enlaces. Es necesario asegurar que no se pierdan los caracteres durante la comunicaci´on, por lo que se llama a la funci´on CommCallback() desde la interrupci´on para dar servicio. Existen dos llamadas para su implementaci´on: PIL RA serialIn(): para la recepci´on. PIL RA serialOut(): para la transmisi´on. 4.3.5.3. Comunicaci´on paralelo La comunicaci´on en paralelo suele ser atendida por medio de las dos siguientes llamadas: PIL RA parallelIn(): hace posible la recepci´on de un mensaje. PIL RA parallelOut(): llamada cuando se realiza el env´ıo de un mensaje. Los mensaje se intercambian directamente a trav´es de vectores de 16 bits de enteros. No realiza ning´un tipo de verificaci´on y resulta bastante conveniente para intercambiar mensajes a trav´es de memoria compartida, donde la posibilidad de que exista alg´un error en la transmisi´on es muy improbable. 4.4. Ejecuci´on Las acciones realizadas por PIL beginInterruptCall() yPIL backgroundCall() depender´a de si la simulaci´on PIL se est´a ejecutando o no. Estas dos funciones se llaman de manera per´ıodica por la aplicaci´on embebida para habilitar la funcionalidad de PIL. Para proporcionar un mejor entendimiento del funcionamiento en ejecuci´on, se van a comparar la actuaci´on en tiempo real y en pseudo-tiempo real.
38 Cap´ıtulo 4. Processor In the Loop (PIL) En la figura 4.5 se observa la ejecuci´on en tiempo real para un sistema con dos tareas de control, una r´apida y prioritaria y otra m´as lenta que ser´a interrumpida por la primera. Al principio de la rutina de servicio de interrupci´on del hardware, se ejecuta la funci´on PIL beginInterruptCall(), que solo llama a CommCallback(), que se encarga de establecer servicio para una comunicaci´on serie y asegurar que no se pierde ning´un caracter. Por su parte, PIL backgroundCall() se ejecuta como parte del bucle principal; se encarga de analizar los mensajes entrantes y llama al mismo tiempo a la funci´on BackgroundCommCallback() si est´a configurado. PIL_beginInterruptCall ( ) Tarea prioritaria Tarea secundaria Tarea de fondo (Background) CommCallback ( ) is called PIL_BackgroundCall ( ) Figura 4.5: Ejecuci´on en tiempo real. Como se coment´o en el apartado 4.1, el comportamiento de la ejecuci´on con la herramienta PIL no coincide con las condiciones de ejecuci´on en tiempo real. En la ejecuci´on en pseudo-tiempo real, la ejecuci´on de la tarea de control sigue el ritmo de la simulaci´on del modelo en PLECS. Al comienzo de la interrupci´on de la rutina de servicio, se para la ejecuci´on de la tarea mediante la macro PILCLBK STOP TIMERS para entrar en el bucle de comunicaci´on. En el bucle de comunicaci´on se ejecutar´an las llamadas de comunicaci´on y el an´alisis de funciones. Comparando las figuras 4.5 y 4.6, se observan claramente las diferencias. En la primera de ellas, una vez que se recibe la petici´on para un nuevo “step”, se reaunda la tarea de control que se quiere ejecutar y continua hasta que se produce la siguiente interrupci´on del hardware. 4.4.1. Funcionalidad del Control Callback Las acciones de control de comunicaci´on entre el hardware y la simulaci´on se llevan a cabo mediante las funciones PilCallback(). Se trata de una m´aquina de estados
4.4. Ejecuci´on 39 PIL_beginInterruptCall ( ) Tarea prioritaria Tarea secundaria Tarea de fondo (Background) PILCLBK_STOP_TIMERS CLBK_START_TIMERS Bucle de comunicación Figura 4.6: Ejecuci´on en pseudo-tiempo real. de la ejecuci´on del PIL que permite tomar las acciones necesarias en funci´on de una variable que mide el estado que se quiere tomar. Para llevar a cabo esta implementaci´on se define una m´aquina de estado que se est´a ejecutando en todo instante. A continuaci´on se muestra el c´odigo con todas las acciones definidas: #include "includes.h" void PilCallback(PIL_CtrlCallbackReq_t aCallbackReq) { switch(aCallbackReq) { case PIL_CLBK_ENTER_NORMAL_OPERATION_REQ: PIL_inhibitPilSimulation(); EnableActuation(); return; case PIL_CLBK_LEAVE_NORMAL_OPERATION_REQ: DisableActuation(); PIL_allowPilSimulation(); return;
40 Cap´ıtulo 4. Processor In the Loop (PIL) case PIL_CLBK_INITIALIZE_SIMULATION: ResetControl(); ResetControlDispatcher(); return; case PIL_CLBK_TERMINATE_SIMULATION: PilInitCalibrations(); break; case PIL_CLBK_STOP_TIMERS: EALLOW; SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 0; EDIS; return; case PIL_CLBK_START_TIMERS: EALLOW; SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; EDIS; return; } } Aunque por los nombres resulta bastante intuitivo, se tratar´a de explicar brevemente cada uno de los estados posibles: PIL CLBK ENTER NORMAL OPERATION REQ: este estado se llama cuando el DSP quiere trabajar en modo de operaci´on normal (Normal Operation). Una vez que entra en dicho modo, se ejecuta PIL inhibitPilSimulation() para indicar que se ha entrado en dicho estado de ejecuci´on. PIL CLBK LEAVE NORMAL OPERATION REQ: la tarjeta pide entrar en el entorno de simulaci´on (Ready for PIL). Ejecutando la funci´on PIL allowPilSimulacion() la aplicaci´on confirma que es posible entrar en dicho modo. PIL CLBK INITIALIZE SIMULATION: se usa al principio de una simulaci´on PIL para resetear los controladores y la atenci´on de tareas a las condiciones iniciales. PIL CLBK TERMINATE SIMULATION: llamada al final de cualquier simulaci´on PIL.
4.4. Ejecuci´on 41 PIL CLBK STOP TIMERS: hace su funci´on al principio de la interrupci´on de control cuando se usa PIL para parar todos los temporizadores y contadores asociados a las tareas de control. PIL CLBK START SIMULATION: se llama antes de reanudar las tareas de control cuando se est´a en modo PIL. Se consigue reiniciar los contadores y los temporizadores asociados a las tareas de control. 4.4.2. Configuraci´on del entorno Para configurar PIL es necesario llamar a una serie de funciones que se encargan de la configuraci´on y la inicializaci´on. PIL init(): debe llamarse al principio de cualquier otra llamada de ejecuci´on vista en la secci´on anterior. PIL setLinkParams(): establece los par´ametros obligatorios para la comunicaci´on. Necesita un puntero al primer elemento del campo GUID y otro a CommCallback. Utiliza la definici´on de un tipo (typedef void(∗PIL CommCallbackPtr t)()) para la comunicaci´on, que permite que PIL llame a la aplicaci´on utilizando un puntero para recivir los datos entrantes y solicitar la transmisi´on de mensajes. PIL setCtrlCallback(): registra las llamadas del control para las simulaciones de PIL. Para su correcta ejecuci´on es necesario utilizar la definicion del tipo typedef void(∗PIL CtrlCallbackPtr t)(PIL CtrlCallbackReq t). Este tipo de puntero es utilizado para que PIL llame a la aplicaci´on y pueda comunicarse correctamente. Existen otro tipo de configuraciones adicionales que, por ejemplo, permiten la transmisi´on serie m´ultiple, pero que no se utilizan en el proyecto y por lo tanto, no van a ser detalladas. Puede consultarse [4] para m´as informaci´on sobre estas configuraciones. Para hacer que la configuraci´on y las evaluaciones est´en disponibles para PLECS es necesario utilizar la macro PIL CONST DEF, a trav´es de la cual se pueden definir el nombre de usuario, informaci´on sobre el tiempo de compilaci´on, nombre del proyecto y de la tarjeta. Como requisito m´ınimo, Guid[] debe estar definido y si se usa la comunicaci´on serie entre el hardware y PLECS, tambi´en es necesario especificar la velocidad de comunicaci´on a trav´es de la definici´on del BaudRate.
48 Cap´ıtulo 5. Implementaci´on Para generar los tiempos muertos hay que retrasar el disparo en uno de los interruptores utilizando puertas l´ogicas (el modelo no tiene en cuenta los retrasos de las puertas l´ogicas) y un bloque de retraso que simular´ıa un circuito RC. En la figura 5.7 puede verse representado los tiempos muertos generados por el circuito de la figura 5.6 con un retraso de 2 µs. 1.7598 1.75985 1.7599 1.75995 1.76 1.76005 tiempo(s) 0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1 Disparos Figura 5.7: Disparos de los transistores con tiempos muertos. 5.1.3. Resultados de simulaci´on A continuaci´on se muestran los resultados de la simulaci´on con este primer acercamiento a la implementaci´on de la soluci´on. En la figura 5.8 se muestran la tensi´on de salida, la corriente y tensi´on de salida de la planta de paneles, as´ı como la corriente de la bobina para una simulaci´on de 2 s con una se˜nal de habilitaci´on en 0,5 s. El valor de la se˜nal de habilitaci´on no tiene un valor arbitrario, si no que est´a elegido de tal manera que exista una precarga en el condensador de salida de la planta de paneles. Los par´ametros de la simulaci´on puede consultarse en la tabla 5.1. Se puede comprobar en la figura 5.8 que la planta alcanza los 431,6Vy12,1 kW, que corresponde con el punto de m´axima potencia para una irradiaci´on nominal de la planta. El rizado de corriente en la bobina en r´egimen permanente puede visualizarse en la ´ultima gr´afica de la figura 5.8. En esta simulaci´on dicho rizado es de 2,44 A, comprob´andose el funcionamiento en continuo del convertidor. Tambi´en puede observarse en las figuras 5.9 (referencia en rojo) y 5.10 (referencia en verde) que existe, respectivamente, seguimiento de tensi´on y de corriente.
5.1. Soluci´on mediante simulaci´on de bloques en PLECS 49 Vout(V) 600.0 Ipv(A) 0 10 20 30 Vpv(V) 0 200 400 600 tiempo(s) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 IL(A) -20 0 20 40 60 601.0 599.0 Figura 5.8: Resultado tras la simulaci´on de bloques.
50 Cap´ıtulo 5. Implementaci´on 0 0.2 420 430 440 450 460 470 480 490 500 510 520 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 tiempo(s) V pv y V pvref (V) Figura 5.9: Seguimiento de tensi´on con bloques. 0 0.2 0.4 0 .6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 - 20 -10 0 10 20 30 40 50 60 tiempo(s) I L e I Lref (A) Figura 5.10: Seguimiento en corriente con bloques.
5.2. Soluci´on mediante simulaci´on de bloques en PLECS 51 5.2. Implementaci´on con controladores en C La ´unica diferencia que existe con respecto a la implementaci´on de la secci´on 5.1 es la implementaci´on de los controladores. Tras comprobar que el algoritmo MPPT funciona correctamente, el siguiente paso es implementar los controladores en un bloque que tambi´en permita la implementaci´on de los PI en C. Para la aproximaci´on de los controladores se utiliza la aproximaci´on rectangular hacia delante, conocida tambi´en como Euler I, representada en la figura 5.1. Entonces, la aproximaci´on de la derivada del error y la integral quedan, respectivamente como la expresiones (5.1) y (5.2). de(t) dt=ek−ek−1 T(5.1) Zt 0 e(τ)dτ= k−1 X i=0 e(i)T=T k−1 X i=0 ei(5.2) Por tanto, discretizando la ecuaci´on de un PI continuo se llega a la ecuaci´on del PI discreto con la aproximaci´on adoptada mostrada en la ecuaci´on (5.3) e(t) t k-1 k T Figura 5.11: Aproximaci´on Euler I. uk=uk−1+kpek−kpek−1+KiTsek−1(5.3) Para el caso particular de la implementaci´on en PLECS, se han utilizado los bloques C-Script para la implementaci´on de los lazos de control (external control loop e inner control loop). Ambos controladores siguen la aproximaci´on Euler I de la ecuaci´on (5.3). Puede consultarse el anexo A para consultar la configuraci´on de dichos bloques en PLECS.
52 Cap´ıtulo 5. Implementaci´on 5.2.1. Resultados de simulaci´on Como es de esperar, el comportamiento de las simulaciones es id´entico. Puede comprobarse en las figuras 5.12 y 5.13 que existe seguimiento en corriente y tensi´on. En la figura 5.14 se muestran los resultados de la simulaci´on para la se˜nal de habilitaci´on activada a los 0,5s. 0 0.2 420 430 440 450 460 470 480 490 500 510 520 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 tiempo(s) V pv y V pvref (V) Figura 5.12: Seguimiento de tensi´on con controladores en C. 0 0.2 0.4 0 .6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 - 20 -10 0 10 20 30 40 50 60 tiempo(s) I L e I Lref (A) Figura 5.13: Seguimiento en corriente con controladores en C.
5.2. Soluci´on mediante simulaci´on de bloques en PLECS 53 Vout(V) 600.0 Ipv(A) 0 10 20 30 Vpv(V) 0 200 400 600 tiempo(s) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 IL(A) -20 0 20 40 60 601.0 599.0 Figura 5.14: Resultados de simulaci´on con C-Scripts.
54 Cap´ıtulo 5. Implementaci´on Par´ametro Valor Kplazo externo 1 Kplazo interno 10 Kilazo externo 10 Kilazo interno 500 fsw (disparos) 10 kHz Tcontrol (disparos) 100 µs TMP P T 50 ms Max step simulaci´on 1 µs Tabla 5.1: Par´ametros de la simulaci´on. 5.3. Implementaci´on en PIL Una vez se comprueba que el algoritmo de b´usqueda del punto de m´axima potencia y que los controladores funcionan correctamente, se procede a utilizar la herramienta PIL. Por un lado debe modificarse el modelo de la simulaci´on (ya que hay que incluir el nuevo bloque de PIL y el modelo de los perif´ericos del DSP) y por otro lado se debe configurar Code Composer Studio para poder trabajar con el DSP, tal y como se muestra en el esquem´atico de la figura 5.15. PIL Adaptar medidas Modelo ADC Modelo ePWM DSP Entradas de la simulación Salida sobre la simulación Variables de entrada del algoritmo de control Programación del DSP en CCS Figura 5.15: Implementaci´on en bloques. Por un lado, se tiene el entorno de simulaci´on que permite obtener las variables a controlar por el DSP. Estas variables deben pasar por un modelo del convertidor
5.3. Soluci´on mediante simulaci´on de bloques en PLECS 55 anal´ogico digital por lo que, para hacer la simulaci´on lo m´as realista posible, estas se˜nales deben introducirse en un bloque de etapa de adaptaci´on que simule el comportamiento de los sensores de medici´on. Adem´as de contar con modelos suficientemente precisos de los perif´ericos del controlador, tambi´en es necesario contar con una herramienta PIL que permita comunicarse con el microcontrolador y as´ı poder ejecutar el c´odigo de control en el entorno de simulaci´on (pseudo-tiempo real). En lo que resta de secci´on, se va a explicar c´omo se lleva a cabo la ejecuci´on con PLECS y el DSP elegido. Para ello es necesario hacer una breve explicaci´on de c´omo configurar Code Composer Studio y c´omo se utilizan los modelos de los perif´ericos proporcionados por la librer´ıa de PLECS. 5.3.1. Configuraci´on en Code Composer Studio Para empezar a realizar nuestro proyecto en Code Composer Studio, es necesario primero configurarlo para que pueda reconocer la herramienta Pil Prep Tool proporcionada por Plexim. De esta manera, es necesario crear una variable de entorno que contenga la ruta absoluta de dicha herramienta. Por otra parte, tambi´en se deben definir las propiedades del proyecto. Hay que asegurarse que lo que en lo que se conoce como Linker Command File se ha seleccionado F28335.cmd y que la librer´ıa que se va a utilizar es la rts2800 fpu32.lib, que permite trabajar de manera optima con flotantes. Aunque se puede usar cualquier versi´on de CCS, se comprob´o que no es v´alida cualquier versi´on del compilador. Las nuevas versiones incorporan un compilador que es capaz de de generar el fichero de salida con la configuraci´on del hardware pero PIL no es capaz de reconocerlo. La versi´on del compilador que se ha usado para la realizaci´on del proyecto es la C2000 6.2.9. Cualquier proyecto que se quiera realizar es necesario incluir el header file de pil pil.h, que contiene las cabeceras de todas las funciones necesarias para la comunicaci´on. Este fichero est´a incluido en la carpeta de frameworks. El contenido puede verse en los anexos A, al final de la documentaci´on. 5.3.2. Montaje en PLECS Ahora el modelo del sistema es un modelo m´as realista de una implementaci´on f´ısica desde el punto de vista del control. En la figura 5.17 pueden verse los diferentes bloques para la comunicaci´on con el hardware. La utilizaci´on de modelos precisos de los perif´ericos es un requisito fundamental para las simulaciones con PIL. Estos modelos deben ser configurables exactamente igual que el propio hardware. Los modelos simplificados de los perif´ericos son ´utiles a gran nivel de abstracci´on, pero se pierden detalles importantes de la temporizaci´on y la cuantificaci´on por ejemplo, en el convertidor anal´ogico-digital y la generaci´on de pulsos.
56 Cap´ıtulo 5. Implementaci´on 5.3.2.1. Adaptaci´on de medidas El ADC del microcontrolador trabaja en un rango de tensiones comprendido entre 0 y 3,3 V, por lo que en la realidad es necesario adaptar todas las medidas de corriente y tensi´on del convertidor a este rango de tensiones a trav´es de, por ejemplo, amplificadores operacionales o sensores de efecto Hall. Para simular esta etapa en nuestro circuito de potencia se introduce el bloque de adaptaci´on de medidas de la figura 5.16 que convierte las se˜nales muestreadas al rango de trabajo del ADC utilizando ganancias. El valor de las ganancias utilizadas puede consultarse en la tabla 5.2. K K: i_L.K K K: VoutPV.K i_L VoutPV i_L' VoutPV' K K: IoutPV.K IoutPV IoutPV' VoutDC K K: VoutBoost.K VoutDC' Figura 5.16: Adaptaci´on de medidas. De esta forma el valor le´ıdo por el ADC ser´a: Valor ADC =3,3 Valor maxValor entrada (5.4) donde Valor ADC ser´a el valor de entrada al ADC, Valor max es el valor m´aximo de tensi´on o corriente que se desea medir y Valor entrada el valor de entrada previo a la adaptaci´on. Ganancia Valor K:iL3,3/125 K:ioutP V 3,3/40 K:VoutP V 3,3/520 K:VoutBoost 3,3/600 Tabla 5.2: Ganancias de la etapa de adaptaci´on.
5.3. Soluci´on mediante simulaci´on de bloques en PLECS 57 V A VoutPV i_L V_dc A IoutPV A IoutBoost V VoutBoost VoutBoost IoutPV VoutPV i_L 1 >=C 0 enable Probe PVV,I V_PV P_PV V,I I_pv I_ppv V_ppv P_ppv PvsV P_ppv I_ppv V_ppv IvsV V_ppv sw swtop swbottom swtop swbottom PlantaPV - + PIL VoutPV i_L Adaptacionde medidas i_L VoutPV i_L' VoutPV' IoutPV IoutPV' VoutDC VoutDC' C2000ADC i_L' IoutPV' RESULTx INT VoutPV' VoutDC' IoutPV VoutBoost sw 0 C Value: Processor enable C C2000ePWM s CMPxA SOC Figura 5.17: Implementaci´on con PIL.
64 Cap´ıtulo 5. Implementaci´on 5.3.5. Resultados de simulaci´on En la figura 5.27, se representan las corrientes y tensiones representativas del sistema para una irradiancia nominal y para una se˜nal de habilitaci´on en 0,5s. Vout y Vout_referencia (V) 0 100 200 300 400 500 600 tiempo (s) 00.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 Figura 5.25: Seguimiento de tensi´on en PIL. En la figura 5.25 puede observarse el seguimiento en tensi´on (en rojo se muestra la tensi´on de referencia y en verde el comportamiento de la tensi´on de la planta). En esta gr´afica se hace notar el efecto de la existencia un cero de fase no m´ınima en el sistema debido a la din´amica de carga y descarga del condensador (obsevar justo en el instante de habilitaci´on del sistema, t= 0,5s). El valor de la capacidad del condensador de salida de la planta de paneles debe ser lo suficientemente grande para conseguir un rizado m´ınimo pero tambi´en lo suficientemente peque˜no para que durante, el intervalo de control y muestreo de la tens´ıon, pueda ofrecer cambios de tensi´on. Tambi´en puede comprobarse en la figura 5.26 y el seguimiento en corriente. El rizado de la corriente de la bobina que se muestra en el zoom de la figura 5.27 es de 2,44 en r´egimen permanente. Una vez comprobado que el algoritmo MPPT y el control funciona en PIL de manera similar que a las simulaciones previas, puede realizarse cualquier tipo de prueba en la simulaci´on, como por ejemplo, comprobar la consistencia del algoritmo de conductancia incremental. En la figura 5.28 se representan los resultados para un cambio de irradiancia en t= 1,2 s. Como puede comprobarse, PIL es una herramienta consistente que permite comprobar si el c´odigo de control funciona correctamente. Se trata de una funci´on, junto
5.3. Soluci´on mediante simulaci´on de bloques en PLECS 65 tiempo (s) 1.0 IoutPV y IoutPV_referencia (A) 0 0.2 0.4 0.6 0.8 1.2 1.4 2.01.6 1.8 -10 0 10 20 30 40 50 Figura 5.26: Seguimiento de corriente en PIL. con PLECS, de gran utilidad que en principio permite el control de cualquier sistema de potencia. Con el fin de completar el sistema para una posible implementaci´on real, tambi´en se implementa la m´aquina de estados que se muestra en la figura 5.29. Esta m´aquina de estados cuenta con tres se˜nales de entrada: una se˜nal para la habilitaci´on del sistema (r= 1), otra de parada (r= 0) y otra de reset del sistema. Los estados posibles de la m´aquina de estados son: Inicio: este es el estado de reposo del sistema. El sistema se mantendr´a en este estado siempre y cuando la se˜nal de habilitaci´on tenga un valor 0. Precarga: para que el sistema funcione correctamente, es necesario realizar una precarga en el condensador de salida de los paneles. Se permanece en dicho estado siempre y cuando la precarga no se haya completado (el nivel de la tensi´on del condensador sea inferior a la tensi´on de circuito abierto de la planta). Run: se trata del estado normal de ejecuci´on donde la planta opera correctamente. Se activan los disparos de los transistores y es el ´unico estado donde se habilita la ejecuci´on del MPPT y del control. Error: se trata de un estado accesible por todos los estados anteriores. En caso de error, dicho estado se encarga de deshabilitar los disparos y s´olo se podra salir de este estado a trav´es de la habilitaci´on del reset, lo que permite llevar al sistema a la situaci´on inicial. Para la implementaci´on de la m´aquina de estados, el algoritmo del control en la interrupci´on del ADC debe modificarse como se muestra en el diagrama de flujo de la figura 5.30.
66 Cap´ıtulo 5. Implementaci´on VoutBoost (V) 599.0 600.0 601.0 IoutPV (A) 0 10 20 30 VoutPV (V) 0 200 400 600 tiempo(s) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 i_L(A) -20 0 20 40 60 Figura 5.27: Resultado tras la simulaci´on con PIL.
5.3. Soluci´on mediante simulaci´on de bloques en PLECS 67 VoutBoost (V) 599.0 599.2 599.4 599.6 599.8 600.0 600.2 600.4 600.6 600.8 601.0 IoutPV (A) 0 5 10 15 20 25 30 VoutPV (V) 0 100 200 300 400 500 600 tiempo(s) 0.0 0.2 0.4 0.6 0.8 1.0 1.2 1.4 1.6 1.8 2.0 2.2 2.4 2.6 i_L (A) -20 -10 0 10 20 30 40 50 60 Figura 5.28: Resultado con PIL ante un cambio en irradiancia.
68 Cap´ıtulo 5. Implementaci´on INICIO PRECARGA RUN ERROR p=1 r=1 r=0 r=0 r=1 p=0 e=1 e=1 e=1 e=1 reset=1 r=0 Figura 5.29: M´aquina de estados.
5.3. Soluci´on mediante simulaci´on de bloques en PLECS 69 Inicio error enable y e=0 Vpanel > 128V p=1p=0 p=1 Primer MPPT cont MPPT= ciclo MPPT cont MPPT= ciclo MPPT MPPT Control Fin muestreo e=1 SÍ SÍ SÍ SÍ SÍ SÍ No No No No No Figura 5.30: Diagrama de flujos de la interrupci´on con m´aquina de estados.
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Cap´ıtulo 6 Conclusiones y trabajos futuros Este proyecto ha supuesto un avance en la simulaci´on de sistemas de potencia mediante plataformas embebidas. Con modelos suficientemente buenos de los dispositivos es posible reproducir el comportamiento de un sistema con cierta exactitud y un m´ınimo error. Gracias a simulaciones en tiempo o pseudo-tiempo real es posible minimizar errores del algoritmo, minimizando p´erdidas econ´omicas y materiales y, por lo tanto, acotando los posibles errores de la puesta en marcha de multitud de proyectos, ya que tienen en cuenta efectos de modelado y comportamiento que en simulaciones convencionales se desprecian. Aunque el algoritmo de conductancia incremental funciona ante cambios de irradiancia y situaciones de sombreado parcial, puede mejorarse el algoritmo MPPT, a˜nadiendo una mejora para la b´usqueda de un ´optimo global que mejore la estabilidad del sistema y su rapidez de convergencia, tanto para casos de sombreado parcial y como para cambios bruscos de irradiancia. Para completar el sistema, puede ampliarse el modelo de simulaci´on sustituyendo la fuente de tensi´on de salida del convertidor elevador por un condensador, que estar´ıa regulado por el control del inversor, cuyo modelo tambi´en habr´ıa que incorporar. Resulta interesante simular el sistema completo para la integraci´on de la planta en la red el´ectrica. El atractivo m´as interesante, a pesar de todas las ampliaciones posibles en el ´ambito de la simulaci´on, es comprobar el modo normal de funcionamiento de PIL. Es decir, probar el c´odigo de control en un entorno real donde el valor de las variables de entradas sean las del propio circuito de potencia. Para ello, se propone utilizar el emulador de paneles fotovoltaicos 14360Ade Agilent Technologies, capaz de simular unas curvas caracter´ısticas dadas. El control de los paneles para la programaci´on de las curvas puede realizarse de manera remota a trav´es de un servidor. 71
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Anexos 73
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Anexo B Ficheros de cabecera (Header Files) pil.h 1#ifndef PIL H 2#define PIL H 3 4#ifdef cplusplus 5extern ”C” { 6#endif 7 8#include <stdint.h> 9#include <stdbool.h> 10 11 #ifndef PIL CLA CODE 12 #include <stdlib.h> 13 #endif 14 15 //@{ 16 /∗∗ Additional types and constant definitions ∗/ 17 #ifndef NULL 18 #define NULL 0 19 #endif 20 //@} 21 22 /∗∗ 23 ∗Macro for declaring a read probe. 24 ∗/ 25 #ifndef PIL PREP TOOL 26 #define PIL READ PROBE(type, name, qloc, ref, unit) type name 27 #endif 28 29 /∗∗ 30 ∗Macro for declaring an override probe. 31 ∗/ 32 #ifndef PIL PREP TOOL 33 // full list of arguments used by PIL prep tool: type, name, qloc, ref, unit 34 #ifdef PREFIX PROBES 81
82 ANEXOS B. Ficheros de cabecera 35 #define PIL OVERRIDE PROBE(type, name, ...)\ 36 type name 37 #else 38 #define PIL OVERRIDE PROBE(type, name, ...)\ 39 type name;\ 40 type name ## probeV;\ 41 int16 t name ## probeF 42 #endif 43 #endif 44 45 /∗∗ 46 ∗Macro for declaring a calibration. 47 ∗/ 48 #ifndef PIL PREP TOOL 49 #define PIL CALIBRATION(type, name, qloc, ref, unit, min, max, dval) type name 50 #endif 51 52 /∗∗ 53 ∗Macro for defining a PIL configuration constant. 54 ∗/ 55 #define PIL CONFIG DEF(type, name, value)\ 56 const type PIL C ## name attribute ((used)) = value 57 58 /∗∗ 59 ∗Macro for setting the value of an override probe. 60 ∗Important: Do not set override probes using direct assignments (”=”). 61 ∗Always use this macro instead. 62 ∗/ 63 #ifdef PREFIX PROBES 64 #define SET OPROBE(probe, value) \ 65 do{\ 66 probe = value; \ 67 if(PIL Probe F ## probe == 1){\ 68 probe = PIL Probe V ## probe; \ 69 }\ 70 }while (0) 71 #else 72 #define SET OPROBE(probe, value) \ 73 do{\ 74 probe = value; \ 75 if(probe ## probeF == 1){\ 76 probe = probe ## probeV; \ 77 }\ 78 }while (0) 79 #endif 80 /∗∗ 81 ∗Control−callback identifiers. 82 ∗These constants identify individual actions which the PIL framework 83 ∗requests from the application. 84 ∗/ 85 typedef enum 86 { 87 PIL CLBK LEAVE NORMAL OPERATION REQ, //!<Request system to enter PIL mode (i.e.
ANEXOS B. Ficheros de cabecera 83 disable actuators) 88 PIL CLBK ENTER NORMAL OPERATION REQ, //!<Release system from PIL mode (i.e. allow re−enabling of actuators) 89 PIL CLBK PREINIT SIMULATION, //!<Called (with interrupts disabled) to allow PIL pre −initialization 90 PIL CLBK INITIALIZE SIMULATION, //!<Called at start of PIL simulation 91 PIL CLBK TERMINATE SIMULATION, //!<Called at end of PIL simulation 92 PIL CLBK STOP TIMERS, //!<Called to request freezing of timers 93 PIL CLBK START TIMERS //!<Called to request release of frozen timers 94 }PIL CtrlCallbackReq t; 95 96 /∗∗ 97 ∗Initializes override probes. 98 ∗This function is autogenerated by the PIL prep tool and has to be called once 99 ∗during the initialization of the code. 100 ∗/ 101 extern void PilInitOverrideProbes(void); 102 103 /∗∗ 104 ∗Initializes calibrations to their default values. 105 ∗This function is auto−generated by the PIL prep tool and has to be called during 106 ∗the initialization of the code. It is also recommended that the function be called 107 ∗in the PIL CLBK TERMINATE SIMULATION callback to ensure calibrations are restored 108 ∗to their original values after a PIL simulations. 109 ∗/ 110 extern void PilInitCalibrations(void); 111 112 /∗∗ 113 ∗Control callback type definition. 114 ∗The PIL framework calls the application using this callback pointer. 115 ∗/ 116 typedef void(∗PIL CtrlCallbackPtr t)(PIL CtrlCallbackReq t); 117 118 /∗∗ 119 ∗Communication callback type definition. 120 ∗The PIL framework calls the application using this callback pointer 121 ∗to receive incoming data and to request the transmission of outgoing messages. 122 ∗/ 123 typedef void(∗PIL CommCallbackPtr t)(); 124 125 /∗∗ 126 ∗Initializes the PIL framework. 127 ∗This function must be called before any other framework functions. 128 ∗/ 129 extern void PIL init(void); 130 131 /∗∗ 132 ∗Sets the mandatory link parameters 133 ∗ 134 ∗@param aGuid Pointer to first element of GUID field 135 ∗@param aCommPtr Pointer to CommCallback 136 ∗@return None 137 ∗/
84 ANEXOS B. Ficheros de cabecera 138 extern void PIL setLinkParams(const unsigned char∗aGuid, PIL CommCallbackPtr t aCommPtr); 139 140 /∗∗ 141 ∗Sets desired node address 142 ∗ 143 ∗@param aNode Desired Station/Node Address 144 ∗@return None 145 ∗/ 146 extern void PIL setNodeAddress(unsigned char aNode); 147 148 /∗∗ 149 ∗Sets pointer to the PIL control callback. 150 ∗ 151 ∗@param aCtrlPtr Pointer to CtrlCallback 152 ∗@return None 153 ∗/ 154 extern void PIL setCtrlCallback(PIL CtrlCallbackPtr t aCtrlPtr); 155 156 /∗∗ 157 ∗Sets pointer to the PIL background communication callback. 158 ∗ 159 ∗@param aBackgroundCommPtr Pointer to BackgroundCommCallback 160 ∗@return None 161 ∗/ 162 extern void PIL setBackgroundCommCallback(PIL CommCallbackPtr t aBackgroundCommPtr); 163 164 /∗∗ 165 ∗Indicates to the framework that the system is ready for a PIL simulation 166 ∗Invokes a Framework State change to the Ready Mode 167 ∗This method is used as a response to an LEAVE NORMAL OPERATION REQ and has no effect in PIL Mode 168 ∗ 169 ∗@return None 170 ∗/ 171 extern void PIL allowPilSimulation(void); 172 173 /∗∗ 174 ∗Indicates to the framework that the system is not ready for a PIL simulation 175 ∗Invokes a Framework State change to Normal Operation 176 ∗This method is used as a response to an ENTER NORMAL OPERATION REQ and has no effect in PIL Mode 177 ∗ 178 ∗@return None 179 ∗/ 180 extern void PIL inhibitPilSimulation(void); 181 182 /∗∗ 183 ∗Used to Request the PIL CLBK ENTER NORMAL OPERATION REQ Callback from the Application 184 ∗Only has an effect outside PIL Mode 185 ∗ 186 ∗@return None 187 ∗/
ANEXOS B. Ficheros de cabecera 85 188 void PIL requestNormalMode(void); 189 190 /∗∗ 191 ∗Used to Request the PIL CLBK LEAVE NORMAL OPERATION REQ Callback from the Application 192 ∗Only has an effect outside PIL Mode 193 ∗ 194 ∗@return None 195 ∗/ 196 void PIL requestReadyMode(void); 197 198 /∗∗ 199 ∗Used to check if a PIL simulation is active 200 ∗ 201 ∗@return None 202 ∗/ 203 extern bool PIL simulationActive(void); 204 205 /∗∗ 206 ∗Receive function. 207 ∗This function is used by the communication callback to 208 ∗pass received characters (e.g. from the SCI link) to the PIL 209 ∗message parser. 210 ∗ 211 ∗@param aChar character received over communication link 212 ∗/ 213 extern void PIL RA serialIn(int16 t aChar); 214 215 /∗∗ 216 ∗Transmit function. 217 ∗This function is used by the communication callback to 218 ∗obtain characters from the PIL framework that are ready for 219 ∗transmission (e.g. over the SCI link). 220 ∗ 221 ∗@param aChar pointer to hold potential character to be transmitted 222 ∗@return true if a character is ready for transmission and written to aChar 223 ∗/ 224 extern bool PIL RA serialOut(int16 t∗aChar); 225 226 /∗∗ 227 ∗Returns true if sync frame has been transmitted. 228 ∗Can be used to synchronize communication speed change. 229 ∗/ 230 extern bool PIL RA serialOutIsSynchronized(); 231 232 /∗∗ 233 ∗PIL service function to be called at the beginning of the control 234 ∗interrupt routine. 235 ∗/ 236 extern void PIL beginInterruptCall(void); 237 238 /∗∗ 239 ∗PIL service function to be called in the background task.
86 ANEXOS B. Ficheros de cabecera 240 ∗/ 241 extern void PIL backgroundCall(void); 242 243 /∗∗ 244 ∗Receive function for Direct Link. 245 ∗This function is used by the communication callback to store incoming messages to the PIL framework. 246 ∗ 247 ∗IMPORTANT: This function must be called by the background task. 248 ∗ 249 ∗This function copys the content of the buffer aBuf from the first element to the (aLen−1)th element 250 ∗into the framework buffer where it is parsed and processed. 251 ∗ 252 ∗@param ∗aBuf Pointer to the buffer where the incoming message is stored 253 ∗@param aLen Length of incoming message in aBuf 254 ∗@return None 255 ∗/ 256 extern void PIL RA parallelIn(uint16 t ∗aBuf, uint16 t aLen); 257 258 /∗∗ 259 ∗Transmit function for Direct Link. 260 ∗This function is used by the communication callback to 261 ∗obtain messages(stored in an internal buffer) from the PIL framework that 262 ∗are ready for transmission. 263 ∗ 264 ∗IMPORTANT: This function must be called by the background task. 265 ∗ 266 ∗If an outgoing message exists, this functions writes the whole message into the buffer specified 267 ∗in the parameters. Furthermore, the message length is provided for further processing in the 268 ∗communication Callback. 269 ∗ 270 ∗@param ∗aBuf Pointer to the buffer where the outgoing message needs to be stored 271 ∗@param ∗aLen Pointer to the variable where the length of the actually outgoing message is stored 272 ∗@return None 273 ∗/ 274 extern void PIL RA parallelOut(uint16 t ∗aBuf, uint16 t ∗aLen); 275 276 /∗∗ 277 ∗Framework revision. 278 ∗/ 279 #define PIL FRAMEWORK VERSION 0x0301 // v3.1 280 281 /∗∗ 282 ∗Maximal length for PIL message 283 ∗/ 284 #define PIL MSG DATA LEN 30 // 30 words = maximal data length of RA Link data frame 285 286 /∗∗ 287 ∗Globally unique identifier (GUID) autogenerated by PIL prep tool. 288 ∗/ 289 extern const unsigned char PIL D Guid[]; 290
ANEXOS B. Ficheros de cabecera 87 291 /∗∗ 292 ∗Pointer to PIL GUID. 293 ∗/ 294 #define PIL GUID PTR (unsigned char∗)&PIL D Guid[0] 295 296 /∗∗ 297 ∗MACRO for PIL D x definitions. 298 ∗/ 299 #define PIL CONST DEF(type, name, value)\ 300 const type PIL D ## name attribute ((used)) = value 301 302 /∗∗ 303 ∗Helper−structure for configuring all PIL symbols. 304 ∗/ 305 typedef struct 306 { 307 int q; //!<fixed−point location 308 float ref; //!<reference value 309 char ∗unit; //!<unit string 310 }pil var; 311 312 /∗∗ 313 ∗Helper−structure for configuring calibrations (write−access). 314 ∗/ 315 typedef struct 316 { 317 float min; //!<minimal value (inclusive) 318 float max; //!<maximal value (inclusive) 319 float dval; //!<default value 320 int level; //!<access level (−1 = no direct writes allowed) 321 }pil var wa; 322 323 /∗∗ 324 ∗Macro for encapsulating read and override probe parameters. 325 ∗/ 326 #define PIL SYMBOL DEF(name, qloc, ref, unit)\ 327 const pil var PIL V ## name attribute ((used)) = {qloc, ref, unit} 328 329 /∗∗ 330 ∗Macro for encapsulating calibration parameters. 331 ∗/ 332 #define PIL SYMBOL CAL DEF(name, qloc, ref, unit, min, max, dval)\ 333 const pil var PIL V ## name attribute ((used)) = {qloc, ref, unit};\ 334 const pil var wa PIL WA ## name attribute ((used)) = {min, max, dval, 1} 335 336 /∗∗ 337 ∗Macro for initializing an override probe. 338 ∗/ 339 #ifndef PIL PREP TOOL 340 #ifdef PREFIX PROBES 341 #define INIT OPROBE(probe) \ 342 do{\ 343 PIL Probe F ## probe = 0;\
88 ANEXOS B. Ficheros de cabecera 344 }while (0) 345 #else 346 #define INIT OPROBE(probe) \ 347 do{\ 348 probe ## probeF = 0;\ 349 }while (0) 350 #endif 351 #endif 352 353 /∗∗ 354 ∗Macro for initializing a calibration. 355 ∗/ 356 #ifndef PIL PREP TOOL 357 #define PIL INIT CALIBRATION(N, T, P, Q, R) \ 358 N = (T)(P ∗(double)(1L << Q) / (double)(R)) 359 #endif 360 361 #ifdef cplusplus 362 } 363 #endif 364 #endif /∗PIL H ∗/ control.h 1#ifndef MPC 28335 CONTROL H 2#define MPC 28335 CONTROL H 3 4#include ”pil.h” 5 6 7struct CONTROL VARS { 8 9PIL READ PROBE(uint16 t, backgroundTaskNumber, 0, 1.0, ””); 10 PIL READ PROBE(uint16 t, task1StepCtr, 0, 1.0, ””); 11 PIL READ PROBE(uint16 t, task2StepCtr, 0, 1.0, ””); /∗Por si se quiere introducir una tarea lenta∗/ 12 PIL READ PROBE(uint16 t, Fs, 0, 1, ””); 13 14 15 PIL OVERRIDE PROBE(float, il, 0, 1.0, ”A”); /∗Corriente que circula por la bobina∗/ 16 PIL OVERRIDE PROBE(float, IPV, 0, 1.0, ”A”); /∗Corriente panel∗/ 17 PIL OVERRIDE PROBE(float, VPV, 0, 1.0, ”V”); /∗Tension panel∗/ 18 PIL OVERRIDE PROBE(float, Vboost, 0, 1.0, ”V”); /∗Tensi´on del ”condensador” de salida del boost∗/ 19 PIL OVERRIDE PROBE(float, I rb, 0, 1.0, ”V”); /∗Corriente de referencia de la bobina∗/ 20 21 PIL OVERRIDE PROBE(int, enable, 0, 1, ” ”); /∗Se˜nal de habilitacion∗/ 22 PIL OVERRIDE PROBE(int, ciclo, 0, 1, ” ”); /∗Cada cic/2 de ejecuta el algoritmo, se lee de la simulaci´on∗/ 23 PIL OVERRIDE PROBE(float, dutyout, 0, 1, ” ”); /∗Valor del duty antes de saturaci´on∗/ 24
ANEXOS B. Ficheros de cabecera 89 25 PIL OVERRIDE PROBE(float, changeVRef, 0, 1.0, ”V”); /∗Variaciones en la tensi´on de referencia∗/ 26 PIL READ PROBE(float, VRef, 0, 1.0, ”V”); /∗Tensi´on de referencia del MPPT∗/ 27 28 PIL READ PROBE(uint16 t, Cmp, 0, 1, ””); 29 30 /∗Variables para almacenar el valor de tensi´on y corrientes anteriores, para los delta∗/ 31 32 float VPVa; 33 float IPVa; 34 35 }; 36 37 extern struct CONTROL VARS ControlVars; 38 39 extern void InitControl(void); 40 extern void DisableActuation(void); 41 extern void EnableActuation(void); 42 extern void ResetControl(void); 43 44 extern void ControlTask1(void); 45 extern void ControlBackground(void); 46 47 48 #endif /∗MPC 28335 CONTROL H ∗/ includes.h 1#ifndef INCLUDES H 2#define INCLUDES H 3 4#define LED ON 34 5#define CRYSTAL 30 6#define BAUD RATE 115200L 7 8#if (CRYSTAL == 40) 9#define SYSCLK HZ (140000000l) 10 #define LSPCLK HZ (SYSCLK HZ / 6l) 11 #define PLX CPU RATE 7.143L // for a 140MHz CPU clock speed (SYSCLKOUT) 12 #elif (CRYSTAL == 30) 13 #define SYSCLK HZ (30000000l ∗5l) 14 #define LSPCLK HZ (SYSCLK HZ / 6l) 15 #define PLX CPU RATE 6.667L // for a 150MHz CPU clock speed (SYSCLKOUT) 16 #else 17 #error Unsupported value for CRYSTAL 18 #endif 19 20 #define PLX DELAY US(A) DSP28x usDelay( \ 21 ((((long double) A ∗ \ 22 1000.0L) / \ 23 (long double)PLX CPU RATE) −9.0L) / 5.0L)
96 ANEXOS C. Ficheros .C 35 } 36 37 38 void InitControlDispatcher() 39 { 40 /∗Configuraci´on de los disparos del ADC∗/ 41 EPwm1Regs.ETSEL.bit.SOCAEN = 1; // Habilitar SOC en el grupo A 42 EPwm1Regs.ETSEL.bit.SOCASEL = 6; // Seleccionar SOC cuando CMPB en upcount 43 EPwm1Regs.ETPS.bit.SOCAPRD = 1; // Genera un pulso en el primer evento 44 AdcRegs.ADCTRL2.bit.EPWM SOCA SEQ1 = 1;// Habilitar SOCA desde el ePWM para empezar la secuencia 45 46 /∗Habilitar la interrupci´on de la secuencia cada EOS∗/ 47 AdcRegs.ADCTRL2.bit.INT ENA SEQ1 = 1; 48 EALLOW; 49 PieVectTable.ADCINT = &ControlDispatcher; 50 EDIS; 51 PieCtrlRegs.PIEIER1.bit.INTx6 = 1; 52 IER |= M INT1; 53 54 CtrlDispatchVars.interruptNesting = 0; 55 } 56 57 void BlinkLed(void){ 58 if(LEDTimer >LED BLINK PERIOD 2){ 59 #ifdef LED ON 33 60 GpioDataRegs.GPBTOGGLE.bit.GPIO33 = 1; 61 #endif 62 #ifdef LED ON 32 63 GpioDataRegs.GPBTOGGLE.bit.GPIO32 = 1; 64 #endif 65 #ifdef LED ON 34 66 GpioDataRegs.GPBTOGGLE.bit.GPIO34 = 1; 67 #endif 68 LEDTimer = 0; 69 } 70 } 71 72 void main(void) 73 { 74 DeviceInit(); 75 76 MemCopy(&RamfuncsLoadStart, &RamfuncsLoadEnd, &RamfuncsRunStart); 77 78 InitFlash(); 79 80 EALLOW; 81 #ifdef LED ON 33 82 GpioCtrlRegs.GPBMUX1.bit.GPIO33 = 0; 83 GpioCtrlRegs.GPBDIR.bit.GPIO33 = 1; 84 #endif 85 #ifdef LED ON 32 86 GpioCtrlRegs.GPBMUX1.bit.GPIO32 = 0;
ANEXOS C. Ficheros .C 97 87 GpioCtrlRegs.GPBDIR.bit.GPIO32 = 1; 88 #endif 89 #ifdef LED ON 34 90 GpioCtrlRegs.GPBMUX1.bit.GPIO34 = 0; 91 GpioCtrlRegs.GPBDIR.bit.GPIO34 = 1; 92 #endif 93 EDIS; 94 95 DINT; 96 IER = 0x0000; 97 IFR = 0x0000; 98 99 EALLOW; 100 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 0; 101 EDIS; 102 103 /∗Configuraci´on de la interfaz serie∗/ 104 SCIInit(ONE STOPBIT+ NO PARITY + EIGHT BITS, BAUD RATE, LSPCLK HZ); 105 SCIWriteString(”\n\rRS−232 Initialized.\n\r”); 106 107 /∗Inicializaci´on del PIL∗/ 108 PIL init(); 109 PIL setLinkParams(PIL GUID PTR, (PIL CommCallbackPtr t)SCIPoll); 110 PIL setCtrlCallback((PIL CtrlCallbackPtr t)PilCallback); 111 112 /∗Inicializaci´on de variables∗/ 113 PilInitOverrideProbes(); 114 115 /∗Iniciamos las tareas de control∗/ 116 InitControl(); 117 InitControlDispatcher(); 118 119 /∗Habilitar interrumpimientos globales y eventos de depuraci´on en tiempo real de mayor prioridad: ∗/ 120 EINT; // Habilitar la interrupci´on global INTM 121 ERTM; // Habilitar la interrupci´on global de tiempo real DBGM 122 123 EALLOW; 124 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; 125 EDIS; 126 127 /∗Ready for PIL?∗/ 128 PIL requestReadyMode(); 129 130 /∗Bucle principal∗/ 131 for(;;) 132 { 133 BlinkLed(); 134 PIL backgroundCall(); 135 ControlBackground(); 136 } 137 }
98 ANEXOS C. Ficheros .C control.c 1#include ”includes.h” 2#include ”math.h” 3 4extern void DSP28x usDelay(unsigned long aCount); 5 6#define INV SQRT3 Q15 (int16 t)(1.0 / 1.73 ∗32768.0) 7#define ONE HALF Q15 (uint16 t)(0.5 ∗(double)(32768)) 8 9struct CONTROL VARS ControlVars; 10 11 float TPWM; //Tpwm en seg 12 13 float Vref; 14 float changeinref; 15 float i L, il; 16 float I pv, I pva; 17 float V pv, V pva; 18 float V Boost; 19 float deltaV, deltaI; 20 int flag; 21 float dPdV; 22 float tempPowerVariable; 23 int cont, start, runfirstflag; 24 int cic; 25 26 27 float kpe=1; 28 float kpi=10; 29 float kie=10; 30 float kii=500; 31 float Ts=0.0001; 32 float errore, errorea; 33 float errori, erroria; 34 float D; 35 float Iref; 36 float P ref; 37 float ref mod; 38 39 /∗∗ 40 ∗Inicializa la tarea de control 41 ∗/ 42 void InitControl(void){ 43 uint16 t pwmPeriod = (uint16 t)(SYSCLK HZ / 2 / PWM HZ / 2); 44 45 InitPWM(pwmPeriod); 46 InitADC(); 47 48 ControlVars.Fs = CONTROL HZ; 49 50
ANEXOS C. Ficheros .C 99 51 ControlVars.Cmp = 0; 52 53 EPwm1Regs.CMPA.half.CMPA = ControlVars.Cmp; 54 55 TPWM = 1./ControlVars.Fs; 56 57 flag=1; 58 cont=0; 59 runfirstflag=1; 60 changeinref=0.0; 61 Vref=0.0; 62 D=0.0; 63 64 P ref=0; 65 ref mod=0; 66 67 SET OPROBE(ControlVars.dutyout, 0); 68 69 errorea=0.0; 70 erroria=0.0; 71 72 DisableActuation(); 73 ResetControl(); 74 } 75 76 /∗∗ 77 ∗Se llama cuando se para, aqui hay que deshabiltiar los pwm. 78 ∗/ 79 void DisableActuation(void){ 80 81 EALLOW; 82 EPwm1Regs.TZFRC.bit.OST=1; 83 EDIS; 84 } 85 86 87 void EnableActuation(void){ 88 89 ResetControl(); 90 91 #ifndef KEEP POWERSTAGE OFF 92 // enable actuators 93 EALLOW; 94 EPwm1Regs.TZCLR.bit.OST=1; 95 EDIS; 96 #endif 97 } 98 99 /∗∗ 100 ∗Se llama cuando se comienza el control 101 ∗/ 102 void ResetControl(void){ 103
100 ANEXOS C. Ficheros .C 104 ControlVars.task1StepCtr = 0; 105 ControlVars.task2StepCtr = 0; 106 ControlVars.backgroundTaskNumber = 0; 107 108 changeinref=0.0; 109 Vref=0.0; 110 V pva=0.0; 111 I pva=0.0; 112 cont=0; 113 P ref=0; 114 ref mod=0; 115 116 flag=1; 117 runfirstflag=1; 118 cont=0; 119 D=0.5; 120 errorea=0.0; 121 erroria=0.0; 122 123 ControlVars.Cmp = 0; 124 125 EPwm1Regs.CMPA.half.CMPA = ControlVars.Cmp; 126 127 ControlVars.VRef= Vref; 128 ControlVars.VPVa= V pva; 129 ControlVars.IPVa= I pva; 130 SET OPROBE(ControlVars.changeVRef, changeinref); 131 132 } 133 134 135 void ControlTask1(){ 136 137 ControlVars.task1StepCtr++; 138 139 140 SET OPROBE(ControlVars.enable, 0); 141 start = ControlVars.enable; 142 143 SET OPROBE(ControlVars.ciclo, 0); 144 cic = ControlVars.ciclo; 145 146 /∗Lectura de entradas Anal´ogicas∗/ 147 148 SET OPROBE(AdcOvrProbes.ADCRESULT0, 0); 149 SET OPROBE(AdcOvrProbes.ADCRESULT1, 0); 150 SET OPROBE(AdcOvrProbes.ADCRESULT2, 0); 151 SET OPROBE(AdcOvrProbes.ADCRESULT3, 0); 152 153 /∗Calculo del valor de las medidas reales (debido a la fase de adaptaci´on)∗/ 154 155 i L = (AdcOvrProbes.ADCRESULT0)∗0.030517578; 156 I pv = (AdcOvrProbes.ADCRESULT1)∗0.00732421875;
ANEXOS C. Ficheros .C 101 157 V pv = (AdcOvrProbes.ADCRESULT2)∗0.126953125; 158 V Boost = (AdcOvrProbes.ADCRESULT3)∗0.146484375; 159 160 /∗Las guardamos en variables para poder sacarlas y ver que se corresponden∗/ 161 162 SET OPROBE(ControlVars.il, i L); 163 SET OPROBE(ControlVars.IPV, I pv); 164 SET OPROBE(ControlVars.VPV, V pv); 165 SET OPROBE(ControlVars.Vboost, V Boost); 166 167 if (start==1) { 168 169 170 if (runfirstflag==1) 171 { 172 cont=(cic−1); 173 runfirstflag=0; 174 } 175 176 cont++; 177 178 if (cont==cic) {/∗El MPPT se recalcula cada 0.0cic s∗/ 179 180 cont=0; 181 182 /∗Leemos el valor de las variables de la iteracion anterior∗/ 183 184 V pva = ControlVars.VPVa; 185 I pva = ControlVars.IPVa; 186 187 /∗Solo en la primera iteracion∗/ 188 189 if(flag){ 190 V pva = V pv; 191 I pva = I pv; 192 flag=0; } 193 194 /∗Calculo de los incrementos∗/ 195 196 deltaV = (V pv −V pva); 197 deltaI = (I pv −I pva); 198 199 // //////////////////////////////////////////////////////////////////////////////////////////////////////////// 200 201 if( (deltaV <0.0001) && (deltaV >−0.0001) ) /∗Si deltaV = 0....∗/ 202 { 203 if( (deltaI <0.001) && (deltaI >−0.001) ) /∗Vemos si deltaI = 0 (MPPT) ...∗/ 204 { 205 changeinref = 0; 206 207 }
102 ANEXOS C. Ficheros .C 208 else 209 { 210 changeinref = (0.1 ∗deltaI); 211 } 212 } 213 else 214 { 215 dPdV= V pv∗((I pv/V pv) + (deltaI/deltaV)); /∗Calculo de la pendiente∗/ 216 tempPowerVariable = ((I pv/V pv) + (deltaI/deltaV)); /∗Calculamos DI/DV + I/V para ver el error que cometemos∗/ 217 218 if( (tempPowerVariable <0.001) && (tempPowerVariable >−0.001) ) 219 { 220 changeinref = 0; 221 222 } 223 else 224 { 225 changeinref = (0.4 ∗dPdV); 226 } 227 } 228 229 Vref= (V pv + changeinref); 230 231 ControlVars.VPVa = V pv; 232 ControlVars.IPVa = I pv; 233 234 SET OPROBE(ControlVars.changeVRef, changeinref); 235 236 }/∗Fin if cic∗/ 237 238 239 /∗External control loop∗/ 240 errore=0.5∗((Vref∗Vref) −(V pv∗V pv)); 241 P ref= (P ref + kpe∗errore −kpe∗errorea + kie∗Ts∗errorea); 242 errorea=errore; 243 244 /∗Inner control loop∗/ 245 Iref= −P ref/V pv; 246 errori=(i L −Iref); 247 ref mod= (ref mod + kpi∗errori −kpi∗erroria + kii∗Ts∗erroria); 248 erroria=errori; 249 250 251 D=(ref mod/V Boost); 252 253 SET OPROBE(ControlVars.dutyout, D); 254 255 if(D>1){ 256 D=1.0;} 257 if(D<0){ 258 D=0.0;} 259
ANEXOS C. Ficheros .C 103 260 SET OPROBE(ControlVars.I rb, Iref); 261 ControlVars.Cmp = (int)((float)(EPwm1Regs.TBPRD)∗D); 262 EPwm1Regs.CMPA.half.CMPA = ControlVars.Cmp; 263 264 265 }/∗Fin if∗/ 266 267 // /////////////////////////////////////////////////////////////////////////////////////////////////////////// 268 269 ControlVars.VRef = Vref; 270 271 // ////////////////////////////////////////////////////////////////////////////////////////////////////////// 272 273 274 } 275 276 277 /∗∗ 278 ∗Funcion del bucle, maquina de estados 279 ∗/ 280 void ControlBackground(void) 281 { 282 switch(ControlVars.backgroundTaskNumber) 283 { 284 case 0: 285 PLX DELAY US(300); 286 break; 287 288 case 1: 289 PLX DELAY US(1000); 290 break; 291 292 case 2: 293 PLX DELAY US(600); 294 break; 295 296 } 297 ControlVars.backgroundTaskNumber++; 298 if(ControlVars.backgroundTaskNumber >2) 299 { 300 ControlVars.backgroundTaskNumber = 0; 301 } 302 } DevInit F2833x.c 1#include ”includes.h” 2
104 ANEXOS C. Ficheros .C 3// Funciones que deben ejecutarse desde la RAM necesitan ser asignadas a una nueva secci´on. 4//Esta secci´on ser´a mapeada a una direcci´on de carga y ejecuci´on usando un archivo cmd 5 6#pragma CODE SECTION(InitFlash, ”ramfuncs”); 7 8//Prototipo de funciones 9void DeviceInit(void); 10 void PieCntlInit(void); 11 void PieVectTableInit(void); 12 void WDogDisable(void); 13 void PLLset(Uint16); 14 void ISR ILLEGAL(void); 15 16 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 17 // Configure Device for target Application Here 18 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 19 void DeviceInit(void) 20 { 21 WDogDisable(); 22 DINT; // Deshabilita todas las interrupciones 23 IER = 0x0000; // Desahibilita interrupcoines de la CPU 24 IFR = 0x0000; // Limpia todos los flags de interrupci´on de CPU 25 26 27 #if (CRYSTAL == 40) 28 PLLset(0x7); // x 3.4 = 140 29 #elif (CRYSTAL == 30) 30 PLLset(0xA); // x 5 = 150 31 #else 32 #error Unsupported value for CRYSTAL 33 #endif 34 35 // Inicializa la interrupci´on 36 37 PieCntlInit(); 38 PieVectTableInit(); 39 40 EALLOW; //Permitir acceso a los registros protegidos. 41 42 // HIGH / LOW SPEED CLOCKS prescalado 43 44 SysCtrlRegs.HISPCP.all = 0x0003; // Sysclk / 6 (25 MHz) 45 SysCtrlRegs.LOSPCP.all = 0x0003; // Sysclk / 6 (25 MHz) 46 47 48 // PERIPHERAL CLOCK ENABLES 49 50 51 SysCtrlRegs.PCLKCR0.bit.ADCENCLK = 1; // ADC
ANEXOS C. Ficheros .C 105 52 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 53 SysCtrlRegs.PCLKCR0.bit.I2CAENCLK = 0; // I2C 54 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 55 SysCtrlRegs.PCLKCR0.bit.SPIAENCLK=1; // SPI−A 56 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 57 SysCtrlRegs.PCLKCR0.bit.SCIAENCLK=1; // SCI−A 58 SysCtrlRegs.PCLKCR0.bit.SCIBENCLK=0; // SCI−B 59 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 60 SysCtrlRegs.PCLKCR0.bit.ECANAENCLK=0; // eCAN−A 61 SysCtrlRegs.PCLKCR0.bit.ECANBENCLK=0; // eCAN−B 62 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 63 SysCtrlRegs.PCLKCR1.bit.ECAP1ENCLK = 0; // eCAP1 64 SysCtrlRegs.PCLKCR1.bit.ECAP2ENCLK = 0; // eCAP2 65 SysCtrlRegs.PCLKCR1.bit.ECAP3ENCLK = 0; // eCAP3 66 SysCtrlRegs.PCLKCR1.bit.ECAP4ENCLK = 0; // eCAP4 67 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 68 SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; // ePWM1 69 SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 0; // ePWM2 70 SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0; // ePWM3 71 SysCtrlRegs.PCLKCR1.bit.EPWM4ENCLK = 0; // ePWM4 72 SysCtrlRegs.PCLKCR1.bit.EPWM5ENCLK = 0; // ePWM5 73 SysCtrlRegs.PCLKCR1.bit.EPWM6ENCLK = 0; // ePWM6 74 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 75 SysCtrlRegs.PCLKCR1.bit.EQEP1ENCLK = 0; // eQEP1 76 SysCtrlRegs.PCLKCR1.bit.EQEP2ENCLK = 0; // eQEP2 77 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 78 SysCtrlRegs.PCLKCR0.bit.TBCLKSYNC = 1; // Enable TBCLK 79 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 80 81 82 // GPIO (GENERAL PURPOSE I/O) CONFIG 83 84 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 85 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 86 // GPIO−00 −PIN FUNCTION = −−Spare−− 87 GpioCtrlRegs.GPAMUX1.bit.GPIO0 = 0; // 0=GPIO, 1=EPWM1A, 2=Resv, 3=Resv 88 GpioCtrlRegs.GPADIR.bit.GPIO0 = 0; // 1=OUTput, 0=INput 89 // GpioDataRegs.GPACLEAR.bit.GPIO0 = 1; // uncomment if −−>Set Low initially 90 // GpioDataRegs.GPASET.bit.GPIO0 = 1; // uncomment if −−>Set High initially 91 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 92 // GPIO−01 −PIN FUNCTION = −−Spare−− 93 GpioCtrlRegs.GPAMUX1.bit.GPIO1 = 0; // 0=GPIO, 1=EPWM1B, 2=ECAP6, 3=MFSR−B 94 GpioCtrlRegs.GPADIR.bit.GPIO1 = 0; // 1=OUTput, 0=INput 95 // GpioDataRegs.GPACLEAR.bit.GPIO1 = 1; // uncomment if −−>Set Low initially 96 // GpioDataRegs.GPASET.bit.GPIO1 = 1; // uncomment if −−>Set High initially 97 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−
112 ANEXOS C. Ficheros .C 319 GpioCtrlRegs.GPBDIR.bit.GPIO39 = 0; // 1=OUTput, 0=INput 320 // GpioDataRegs.GPBCLEAR.bit.GPIO39 = 1; // uncomment if −−>Set Low initially 321 // GpioDataRegs.GPBSET.bit.GPIO39 = 1; // uncomment if −−>Set High initially 322 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 323 324 // GPIO−48 −PIN FUNCTION = −−Spare−− 325 GpioCtrlRegs.GPBMUX2.bit.GPIO48 = 0; // 0=GPIO, 1=ECAP5, 2=XD31, 3=Resv 326 GpioCtrlRegs.GPBDIR.bit.GPIO48 = 0; // 1=OUTput, 0=INput 327 // GpioDataRegs.GPBCLEAR.bit.GPIO48 = 1; // uncomment if −−>Set Low initially 328 // GpioDataRegs.GPBSET.bit.GPIO48 = 1; // uncomment if −−>Set High initially 329 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 330 // GPIO−49 −PIN FUNCTION = −−Spare−− 331 GpioCtrlRegs.GPBMUX2.bit.GPIO49 = 0; // 0=GPIO, 1=ECAP6, 2=XD30, 3=Resv 332 GpioCtrlRegs.GPBDIR.bit.GPIO49 = 0; // 1=OUTput, 0=INput 333 // GpioDataRegs.GPBCLEAR.bit.GPIO49 = 1; // uncomment if −−>Set Low initially 334 // GpioDataRegs.GPBSET.bit.GPIO49 = 1; // uncomment if −−>Set High initially 335 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 336 337 // GPIO−58 −PIN FUNCTION = −−Spare−− 338 GpioCtrlRegs.GPBMUX2.bit.GPIO58 = 0; // 0=GPIO, 1=MCLKR−A, 2=XD21, 3=Resv 339 GpioCtrlRegs.GPBDIR.bit.GPIO58 = 0; // 1=OUTput, 0=INput 340 // GpioDataRegs.GPBCLEAR.bit.GPIO58 = 1; // uncomment if −−>Set Low initially 341 // GpioDataRegs.GPBSET.bit.GPIO58 = 1; // uncomment if −−>Set High initially 342 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 343 // GPIO−59 −PIN FUNCTION = −−Spare−− 344 GpioCtrlRegs.GPBMUX2.bit.GPIO59 = 0; // 0=GPIO, 1=MFSR−A, 2=XD20, 3=Resv 345 GpioCtrlRegs.GPBDIR.bit.GPIO59 = 0; // 1=OUTput, 0=INput 346 // GpioDataRegs.GPBCLEAR.bit.GPIO59 = 1; // uncomment if −−>Set Low initially 347 // GpioDataRegs.GPBSET.bit.GPIO59 = 1; // uncomment if −−>Set High initially 348 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 349 // GPIO−60 −PIN FUNCTION = −−Spare−− 350 GpioCtrlRegs.GPBMUX2.bit.GPIO60 = 0; // 0=GPIO, 1=MCLKR−B, 2=XD19, 3=Resv 351 GpioCtrlRegs.GPBDIR.bit.GPIO60 = 0; // 1=OUTput, 0=INput 352 // GpioDataRegs.GPBCLEAR.bit.GPIO60 = 1; // uncomment if −−>Set Low initially 353 // GpioDataRegs.GPBSET.bit.GPIO60 = 1; // uncomment if −−>Set High initially 354 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 355 // GPIO−61 −PIN FUNCTION = −−Spare−− 356 GpioCtrlRegs.GPBMUX2.bit.GPIO61 = 0; // 0=GPIO, 1=MFSR−B, 2=XD18, 3=Resv 357 GpioCtrlRegs.GPBDIR.bit.GPIO61 = 0; // 1=OUTput, 0=INput 358 // GpioDataRegs.GPBCLEAR.bit.GPIO61 = 1; // uncomment if −−>Set Low initially 359 // GpioDataRegs.GPBSET.bit.GPIO61 = 1; // uncomment if −−>Set High initially
ANEXOS C. Ficheros .C 113 360 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 361 // GPIO−62 −PIN FUNCTION = −−Spare−− 362 GpioCtrlRegs.GPBMUX2.bit.GPIO62 = 0; // 0=GPIO, 1=SCIRX−C, 2=XD17, 3=Resv 363 GpioCtrlRegs.GPBDIR.bit.GPIO62 = 0; // 1=OUTput, 0=INput 364 // GpioDataRegs.GPBCLEAR.bit.GPIO62 = 1; // uncomment if −−>Set Low initially 365 // GpioDataRegs.GPBSET.bit.GPIO62 = 1; // uncomment if −−>Set High initially 366 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 367 // GPIO−63 −PIN FUNCTION = −−Spare−− 368 GpioCtrlRegs.GPBMUX2.bit.GPIO63 = 0; // 0=GPIO, 1=SCITX−C, 2=XD16, 3=Resv 369 GpioCtrlRegs.GPBDIR.bit.GPIO63 = 0; // 1=OUTput, 0=INput 370 // GpioDataRegs.GPBCLEAR.bit.GPIO63 = 1; // uncomment if −−>Set Low initially 371 // GpioDataRegs.GPBSET.bit.GPIO63 = 1; // uncomment if −−>Set High initially 372 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 373 374 // GPIO−84 −PIN FUNCTION = −−Spare−− 375 GpioCtrlRegs.GPCMUX2.bit.GPIO84 = 0; // 0=GPIO, 1=GPIO, 2=XA12, 3=Resv 376 GpioCtrlRegs.GPCDIR.bit.GPIO84 = 0; // 1=OUTput, 0=INput 377 // GpioDataRegs.GPCCLEAR.bit.GPIO84 = 1; // uncomment if −−>Set Low initially 378 // GpioDataRegs.GPCSET.bit.GPIO84 = 1; // uncomment if −−>Set High initially 379 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 380 // GPIO−85 −PIN FUNCTION = −−Spare−− 381 GpioCtrlRegs.GPCMUX2.bit.GPIO85 = 0; // 0=GPIO, 1=GPIO, 2=XA13, 3=Resv 382 GpioCtrlRegs.GPCDIR.bit.GPIO85 = 0; // 1=OUTput, 0=INput 383 // GpioDataRegs.GPCCLEAR.bit.GPIO85 = 1; // uncomment if −−>Set Low initially 384 // GpioDataRegs.GPCSET.bit.GPIO85 = 1; // uncomment if −−>Set High initially 385 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 386 // GPIO−86 −PIN FUNCTION = −−Spare−− 387 GpioCtrlRegs.GPCMUX2.bit.GPIO86 = 0; // 0=GPIO, 1=GPIO, 2=XA14, 3=Resv 388 GpioCtrlRegs.GPCDIR.bit.GPIO86 = 0; // 1=OUTput, 0=INput 389 // GpioDataRegs.GPCCLEAR.bit.GPIO86 = 1; // uncomment if −−>Set Low initially 390 // GpioDataRegs.GPCSET.bit.GPIO86 = 1; // uncomment if −−>Set High initially 391 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 392 // GPIO−87 −PIN FUNCTION = −−Spare−− 393 GpioCtrlRegs.GPCMUX2.bit.GPIO87 = 0; // 0=GPIO, 1=GPIO, 2=XA15, 3=Resv 394 GpioCtrlRegs.GPCDIR.bit.GPIO87 = 0; // 1=OUTput, 0=INput 395 // GpioDataRegs.GPCCLEAR.bit.GPIO87 = 1; // uncomment if −−>Set Low initially 396 // GpioDataRegs.GPCSET.bit.GPIO87 = 1; // uncomment if −−>Set High initially 397 // −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 398
114 ANEXOS C. Ficheros .C 399 EDIS; // Disable register access 400 } 401 402 // ============================================================================ 403 // NOTA (PLEXIM): 404 // IN MOST APPLICATIONS THE FUNCTIONS AFTER THIS POINT CAN BE LEFT UNCHANGED 405 // THE USER NEED NOT REALLY UNDERSTAND THE BELOW CODE TO SUCCESSFULLY RUN THIS 406 // APPLICATION. 407 // ============================================================================ 408 409 void WDogDisable(void) 410 { 411 EALLOW; 412 SysCtrlRegs.WDCR= 0x0068; 413 EDIS; 414 } 415 416 // This function initializes the PLLCR register. 417 //void InitPll(Uint16 val, Uint16 clkindiv) 418 void PLLset(Uint16 val) 419 { 420 volatile Uint16 iVol; 421 422 // Make sure the PLL is not running in limp mode 423 if (SysCtrlRegs.PLLSTS.bit.MCLKSTS != 0) 424 { 425 // Missing external clock has been detected 426 // Replace this line with a call to an appropriate 427 // SystemShutdown(); function. 428 while(1){ 429 continue; 430 } 431 //asm(” ESTOP0”); 432 } 433 434 // CLKINDIV MUST be 0 before PLLCR can be changed from 435 // 0x0000. It is set to 0 by an external reset XRSn 436 437 // Change the PLLCR 438 if (SysCtrlRegs.PLLCR.bit.DIV != val) 439 { 440 441 EALLOW; 442 // Before setting PLLCR turn off missing clock detect logic 443 SysCtrlRegs.PLLSTS.bit.MCLKOFF = 1; 444 SysCtrlRegs.PLLCR.bit.DIV = val; 445 EDIS;
ANEXOS C. Ficheros .C 115 446 447 // Optional: Wait for PLL to lock. 448 // During this time the CPU will switch to OSCCLK/2 until 449 // the PLL is stable. Once the PLL is stable the CPU will 450 // switch to the new PLL value. 451 // 452 // This time−to−lock is monitored by a PLL lock counter. 453 // 454 // Code is not required to sit and wait for the PLL to lock. 455 // However, if the code does anything that is timing critical, 456 // and requires the correct clock be locked, then it is best to 457 // wait until this switching has completed. 458 459 // Wait for the PLL lock bit to be set. 460 // The watchdog should be disabled before this loop, or fed within 461 // the loop via ServiceDog(). 462 463 // Uncomment to disable the watchdog 464 WDogDisable(); 465 466 while(SysCtrlRegs.PLLSTS.bit.PLLLOCKS != 1){ 467 // Uncomment to service the watchdog 468 // ServiceDog(); 469 } 470 471 EALLOW; 472 SysCtrlRegs.PLLSTS.bit.MCLKOFF = 0; 473 474 EDIS; 475 } 476 } 477 478 479 // Esta funci´on inicializa los registros de control PIE a un estado conocido 480 // 481 void PieCntlInit(void) 482 { 483 // Disable Interrupts at the CPU level: 484 DINT; 485 486 // Disable the PIE 487 PieCtrlRegs.PIECTRL.bit.ENPIE = 0; 488 489 // Clear all PIEIER registers: 490 PieCtrlRegs.PIEIER1.all = 0; 491 PieCtrlRegs.PIEIER2.all = 0; 492 PieCtrlRegs.PIEIER3.all = 0; 493 PieCtrlRegs.PIEIER4.all = 0; 494 PieCtrlRegs.PIEIER5.all = 0; 495 PieCtrlRegs.PIEIER6.all = 0; 496 PieCtrlRegs.PIEIER7.all = 0; 497 PieCtrlRegs.PIEIER8.all = 0; 498 PieCtrlRegs.PIEIER9.all = 0;
116 ANEXOS C. Ficheros .C 499 PieCtrlRegs.PIEIER10.all = 0; 500 PieCtrlRegs.PIEIER11.all = 0; 501 PieCtrlRegs.PIEIER12.all = 0; 502 503 // Clear all PIEIFR registers: 504 PieCtrlRegs.PIEIFR1.all = 0; 505 PieCtrlRegs.PIEIFR2.all = 0; 506 PieCtrlRegs.PIEIFR3.all = 0; 507 PieCtrlRegs.PIEIFR4.all = 0; 508 PieCtrlRegs.PIEIFR5.all = 0; 509 PieCtrlRegs.PIEIFR6.all = 0; 510 PieCtrlRegs.PIEIFR7.all = 0; 511 PieCtrlRegs.PIEIFR8.all = 0; 512 PieCtrlRegs.PIEIFR9.all = 0; 513 PieCtrlRegs.PIEIFR10.all = 0; 514 PieCtrlRegs.PIEIFR11.all = 0; 515 PieCtrlRegs.PIEIFR12.all = 0; 516 } 517 518 519 void PieVectTableInit(void) 520 { 521 int16 i; 522 Uint32 ∗Source = (void ∗) &ISR ILLEGAL; 523 Uint32 ∗Dest = (void ∗) &PieVectTable; 524 525 EALLOW; 526 for(i=0; i <128; i++) 527 ∗Dest++ = ∗Source; 528 EDIS; 529 530 // Enable the PIE Vector Table 531 PieCtrlRegs.PIECTRL.bit.ENPIE = 1; 532 } 533 534 interrupt void ISR ILLEGAL(void)// Illegal operation TRAP 535 { 536 // Insert ISR Code here 537 538 // Next two lines for debug only to halt the processor here 539 // Remove after inserting ISR Code 540 asm(” ESTOP0”); 541 for(;;); 542 543 } 544 545 //Inicializa los registro de control de la Flash, debe ser ejecutada fuera de la RAM 546 void InitFlash(void) 547 { 548 EALLOW; 549 //Habilitar Flash Pipeline modo, mejora el rendimiento del codigo ejecutado desde la FLASH 550 FlashRegs.FOPT.bit.ENPIPE = 1; 551
ANEXOS C. Ficheros .C 117 552 // Paged Waitstate 553 FlashRegs.FBANKWAIT.bit.PAGEWAIT = 3; 554 555 //Random Waitstate 556 FlashRegs.FBANKWAIT.bit.RANDWAIT = 3; 557 558 //Waitstate for the OTP 559 FlashRegs.FOTPWAIT.bit.OTPWAIT = 5; 560 561 FlashRegs.FSTDBYWAIT.bit.STDBYWAIT = 0x01FF; 562 FlashRegs.FACTIVEWAIT.bit.ACTIVEWAIT = 0x01FF; 563 EDIS; 564 565 //Frozar mediante flush para asegurar que la escritura en el ´ultimo registro configurado antes de que vuelva la funcion 566 567 asm(” RPT #7 || NOP”); 568 } 569 570 571 // Esta funci´on copia los contenidos de la memoria especificada a otro destino 572 // 573 // Uint16 ∗SourceAddr Puntero a la primera palabra que se quiere mover 574 // SourceAddr <SourceEndAddr 575 // Uint16∗SourceEndAddr Puntero a la ´ultima palabra que se quiere mover 576 // Uint16∗DestAddr Puntero a la primera direcci´on de memoria del destino 577 void MemCopy(Uint16 ∗SourceAddr, Uint16∗SourceEndAddr, Uint16∗DestAddr) 578 { 579 while(SourceAddr <SourceEndAddr) 580 { 581 ∗DestAddr++ = ∗SourceAddr++; 582 } 583 return; 584 } DSP2833x GlobalVariableDefs.c 1//#include ”DSP2833x Device.h” // DSP280x Headerfile Include File 2#include ”PeripheralHeaderIncludes.h” // DSP2833x Headerfile Include File 3 4// −−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 5// Define Global Peripheral Variables: 6// 7//−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 8#ifdef cplusplus 9#pragma DATA SECTION(”AdcRegsFile”) 10 #else 11 #pragma DATA SECTION(AdcRegs,”AdcRegsFile”); 12 #endif 13 volatile struct ADC REGS AdcRegs;
118 ANEXOS C. Ficheros .C 14 15 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 16 #ifdef cplusplus 17 #pragma DATA SECTION(”AdcMirrorFile”) 18 #else 19 #pragma DATA SECTION(AdcMirror,”AdcMirrorFile”); 20 #endif 21 volatile struct ADC RESULT MIRROR REGS AdcMirror; 22 23 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 24 #ifdef cplusplus 25 #pragma DATA SECTION(”CpuTimer0RegsFile”) 26 #else 27 #pragma DATA SECTION(CpuTimer0Regs,”CpuTimer0RegsFile”); 28 #endif 29 volatile struct CPUTIMER REGS CpuTimer0Regs; 30 31 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 32 #ifdef cplusplus 33 #pragma DATA SECTION(”CpuTimer1RegsFile”) 34 #else 35 #pragma DATA SECTION(CpuTimer1Regs,”CpuTimer1RegsFile”); 36 #endif 37 volatile struct CPUTIMER REGS CpuTimer1Regs; 38 39 40 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 41 #ifdef cplusplus 42 #pragma DATA SECTION(”CpuTimer2RegsFile”) 43 #else 44 #pragma DATA SECTION(CpuTimer2Regs,”CpuTimer2RegsFile”); 45 #endif 46 volatile struct CPUTIMER REGS CpuTimer2Regs; 47 48 49 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 50 #ifdef cplusplus 51 #pragma DATA SECTION(”CsmPwlFile”) 52 #else 53 #pragma DATA SECTION(CsmPwl,”CsmPwlFile”); 54 #endif 55 volatile struct CSM PWL CsmPwl; 56 57 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 58 #ifdef cplusplus 59 #pragma DATA SECTION(”CsmRegsFile”) 60 #else 61 #pragma DATA SECTION(CsmRegs,”CsmRegsFile”); 62 #endif 63 volatile struct CSM REGS CsmRegs; 64 65 66
ANEXOS C. Ficheros .C 119 67 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 68 #ifdef cplusplus 69 #pragma DATA SECTION(”DevEmuRegsFile”) 70 #else 71 #pragma DATA SECTION(DevEmuRegs,”DevEmuRegsFile”); 72 #endif 73 volatile struct DEV EMU REGS DevEmuRegs; 74 75 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 76 #ifdef cplusplus 77 #pragma DATA SECTION(”DmaRegsFile”) 78 #else 79 #pragma DATA SECTION(DmaRegs,”DmaRegsFile”); 80 #endif 81 volatile struct DMA REGS DmaRegs; 82 83 84 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 85 #ifdef cplusplus 86 #pragma DATA SECTION(”ECanaRegsFile”) 87 #else 88 #pragma DATA SECTION(ECanaRegs,”ECanaRegsFile”); 89 #endif 90 volatile struct ECAN REGS ECanaRegs; 91 92 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 93 #ifdef cplusplus 94 #pragma DATA SECTION(”ECanaMboxesFile”) 95 #else 96 #pragma DATA SECTION(ECanaMboxes,”ECanaMboxesFile”); 97 #endif 98 volatile struct ECAN MBOXES ECanaMboxes; 99 100 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 101 #ifdef cplusplus 102 #pragma DATA SECTION(”ECanaLAMRegsFile”) 103 #else 104 #pragma DATA SECTION(ECanaLAMRegs,”ECanaLAMRegsFile”); 105 #endif 106 volatile struct LAM REGS ECanaLAMRegs; 107 108 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 109 #ifdef cplusplus 110 #pragma DATA SECTION(”ECanaMOTSRegsFile”) 111 #else 112 #pragma DATA SECTION(ECanaMOTSRegs,”ECanaMOTSRegsFile”); 113 #endif 114 volatile struct MOTS REGS ECanaMOTSRegs; 115 116 117 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 118 #ifdef cplusplus 119 #pragma DATA SECTION(”ECanaMOTORegsFile”)
120 ANEXOS C. Ficheros .C 120 #else 121 #pragma DATA SECTION(ECanaMOTORegs,”ECanaMOTORegsFile”); 122 #endif 123 volatile struct MOTO REGS ECanaMOTORegs; 124 125 126 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 127 #ifdef cplusplus 128 #pragma DATA SECTION(”ECanbRegsFile”) 129 #else 130 #pragma DATA SECTION(ECanbRegs,”ECanbRegsFile”); 131 #endif 132 volatile struct ECAN REGS ECanbRegs; 133 134 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 135 #ifdef cplusplus 136 #pragma DATA SECTION(”ECanbMboxesFile”) 137 #else 138 #pragma DATA SECTION(ECanbMboxes,”ECanbMboxesFile”); 139 #endif 140 volatile struct ECAN MBOXES ECanbMboxes; 141 142 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 143 #ifdef cplusplus 144 #pragma DATA SECTION(”ECanbLAMRegsFile”) 145 #else 146 #pragma DATA SECTION(ECanbLAMRegs,”ECanbLAMRegsFile”); 147 #endif 148 volatile struct LAM REGS ECanbLAMRegs; 149 150 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 151 #ifdef cplusplus 152 #pragma DATA SECTION(”ECanbMOTSRegsFile”) 153 #else 154 #pragma DATA SECTION(ECanbMOTSRegs,”ECanbMOTSRegsFile”); 155 #endif 156 volatile struct MOTS REGS ECanbMOTSRegs; 157 158 159 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 160 #ifdef cplusplus 161 #pragma DATA SECTION(”ECanbMOTORegsFile”) 162 #else 163 #pragma DATA SECTION(ECanbMOTORegs,”ECanbMOTORegsFile”); 164 #endif 165 volatile struct MOTO REGS ECanbMOTORegs; 166 167 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 168 #ifdef cplusplus 169 #pragma DATA SECTION(”EPwm1RegsFile”) 170 #else 171 #pragma DATA SECTION(EPwm1Regs,”EPwm1RegsFile”); 172 #endif
ANEXOS C. Ficheros .C 121 173 volatile struct EPWM REGS EPwm1Regs; 174 175 176 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 177 #ifdef cplusplus 178 #pragma DATA SECTION(”EPwm2RegsFile”) 179 #else 180 #pragma DATA SECTION(EPwm2Regs,”EPwm2RegsFile”); 181 #endif 182 volatile struct EPWM REGS EPwm2Regs; 183 184 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 185 #ifdef cplusplus 186 #pragma DATA SECTION(”EPwm3RegsFile”) 187 #else 188 #pragma DATA SECTION(EPwm3Regs,”EPwm3RegsFile”); 189 #endif 190 volatile struct EPWM REGS EPwm3Regs; 191 192 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 193 #ifdef cplusplus 194 #pragma DATA SECTION(”EPwm4RegsFile”) 195 #else 196 #pragma DATA SECTION(EPwm4Regs,”EPwm4RegsFile”); 197 #endif 198 volatile struct EPWM REGS EPwm4Regs; 199 200 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 201 #ifdef cplusplus 202 #pragma DATA SECTION(”EPwm5RegsFile”) 203 #else 204 #pragma DATA SECTION(EPwm5Regs,”EPwm5RegsFile”); 205 #endif 206 volatile struct EPWM REGS EPwm5Regs; 207 208 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 209 #ifdef cplusplus 210 #pragma DATA SECTION(”EPwm6RegsFile”) 211 #else 212 #pragma DATA SECTION(EPwm6Regs,”EPwm6RegsFile”); 213 #endif 214 volatile struct EPWM REGS EPwm6Regs; 215 216 217 //−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−−− 218 #ifdef cplusplus 219 #pragma DATA SECTION(”ECap1RegsFile”) 220 #else 221 #pragma DATA SECTION(ECap1Regs,”ECap1RegsFile”); 222 #endif 223 volatile struct ECAP REGS ECap1Regs; 224 225
128 ANEXOS C. Ficheros .C 60 return((int16)SciaRegs.SCIRXBUF.all); 61 } 62 } 63 64 /∗ 65 ∗Transmit character 66 ∗/ 67 void SCIPutChar(char c){ 68 // make sure transmit buffer is ready 69 while(SciaRegs.SCICTL2.bit.TXRDY == 0){ 70 continue; 71 } 72 73 SciaRegs.SCITXBUF = (uint16 t)c; 74 } 75 76 /∗ 77 ∗Write string 78 ∗/ 79 void SCIWriteString(const char ∗s){ 80 uint16 t sc; 81 82 sc = (char)(∗s); 83 while(sc != 0){ 84 SCIPutChar(sc); 85 s++; 86 sc = (char)(∗s); 87 } 88 } 89 90 #ifndef USE SCI FIFO 91 #error SCIPoll() implementation assumes use of FIFO! 92 #endif 93 void SCIPoll() 94 { 95 while(SciaRegs.SCIFFRX.bit.RXFFST != 0) 96 { 97 // assuming that there will be a ”break” when FIFO is empty 98 PIL RA serialIn((int16)SciaRegs.SCIRXBUF.all); 99 } 100 101 int16 t ch; 102 if(SciaRegs.SCICTL2.bit.TXRDY == 1){ 103 if(PIL RA serialOut(&ch)) 104 { 105 SciaRegs.SCITXBUF = ch; 106 } 107 } 108 } pil ctrl.c
ANEXOS C. Ficheros .C 129 1#include ”includes.h” 2 3void PilCallback(PIL CtrlCallbackReq t aCallbackReq) 4{ 5switch(aCallbackReq) 6{ 7case PIL CLBK ENTER NORMAL OPERATION REQ: 8// enabling the hardware actuation (if desired by user) 9PIL inhibitPilSimulation(); 10 EnableActuation(); 11 return; 12 13 case PIL CLBK LEAVE NORMAL OPERATION REQ: 14 // stopping the hardware actuation or invoking a transfer to a safe system state 15 DisableActuation(); 16 PIL allowPilSimulation(); 17 return; 18 19 case PIL CLBK INITIALIZE SIMULATION: 20 // resetting the controller variables 21 ResetControl(); 22 return; 23 24 case PIL CLBK TERMINATE SIMULATION: 25 //Termination Request 26 PilInitCalibrations(); 27 break; 28 29 case PIL CLBK STOP TIMERS: 30 // stopping relevant timers 31 EALLOW; 32 SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 0; 33 SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 0; 34 SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 0; 35 EDIS; 36 return; 37 38 case PIL CLBK START TIMERS: 39 // starting relevant timers 40 EALLOW; 41 SysCtrlRegs.PCLKCR1.bit.EPWM1ENCLK = 1; 42 SysCtrlRegs.PCLKCR1.bit.EPWM2ENCLK = 1; 43 SysCtrlRegs.PCLKCR1.bit.EPWM3ENCLK = 1; 44 EDIS; 45 return; 46 } 47 } pil symbols c.c 1#include ”pil.h” 2#include ”includes.h”
130 ANEXOS C. Ficheros .C 3#include ”pidq.h” 4#include ”pi.h” 5 6// this file can be linked such that no Flash memory is consumed 7 8#ifndef PIL PREP TOOL 9#include ”pil symbols c.inc” // will be automatically generated 10 #endif 11 12 #pragma RETAIN(PIL D Guid) 13 PIL CONST DEF(unsigned char, Guid[], CODE GUID); 14 15 #pragma RETAIN(PIL D CompiledDate) 16 PIL CONST DEF(unsigned char, CompiledDate[], COMPILE TIME DATE STR); 17 18 #pragma RETAIN(PIL D CompiledBy) 19 PIL CONST DEF(unsigned char, CompiledBy[], USER NAME); 20 21 #pragma RETAIN(PIL D FrameworkVersion) 22 PIL CONST DEF(uint16 t, FrameworkVersion, PIL FRAMEWORK VERSION); 23 24 #pragma RETAIN(PIL D BaudRate) 25 PIL CONST DEF(uint32 t, BaudRate, BAUD RATE); 26 27 #pragma RETAIN(PIL D StationAddress) 28 PIL CONST DEF(uint16 t, StationAddress, 0); 29 30 #pragma RETAIN(PIL D FirmwareDescription) 31 PIL CONST DEF(char, FirmwareDescription[], ”FOC demo project”); pil symbols p.c 1#include ”pil.h” 2#include ”pi.h” 3#include ”includes.h” 4 5// this file can be linked such that no Flash memory is consumed 6#ifndef PIL PREP TOOL 7#include ”pil symbols p.inc” // will be automatically generated 8#endif 9// manual configurations 10 11 PIL CONFIG DEF(uint32 t, SysClk, SYSCLK HZ); 12 PIL CONFIG DEF(uint32 t, PwmFrequency, PWM HZ); 13 PIL CONFIG DEF(uint32 t, ControlFrequency, CONTROL HZ); 14 PIL CONFIG DEF(uint16 t, ProcessorPartNumber, 28335);
Simulaci´on de un convertidor DC/DC para aplicaci´on fotovoltaica mediante plataforma embebida Bibliograf´ıa [1] Djamila Rekioua yErnest Matagne Optimization of Photovoltaic Power Systems, pp. 1-17 y 113-145. Springer, 2012. [2] Sergio V´ azquez P´ erez yJuan Manuel Carrasco Sol´ ıs,Apuntes de Integraci´on de Energ´ıas Renovables. Departamento de Ingenier´ıa Electr´onica de la Universidad de Sevilla, 2016. [3] Plexim GmbH,PLECS User Manual. Plexim, Julio 2016. [4] Plexim GmbH,PIL User Manual. Plexim, Julio 2016. [5] David M.Alter,Running an Application from Internal Flash Memory on the TMS320F28xxx DSP. Application Report, Texas Instruments, Enero 2013. [6] Texas Instruments,TMS320x2833x, 2823x Enhanced Pulse Width Modulator (ePWM) Module Reference Guide, Julio 2009. [7] Texas Instruments,TMS320x2833x Analog-to-Digital Converter (ADC) Module Reference Guide, Julio 2009. [8] Texas Instruments,TMS320x2833x, 2823x System Control and Interrupts Reference Guide, Julio 2009. [9] Texas Instruments,TMS320x2833x, 2823x Serial Communications Interface (SCI) Reference Guide, Julio 2009. [10] Sun Power Corporation,305 SOLAR PANEL Exceptional Efficiency and Performance Cat´alogo, Octubre 2007. [11] Mariusz Malinowski,Jose I. Le´ on, y HaitHaM Abu-Rub,Solar Photovoltaic and Thermal Energy Systems: Current Technology and Future Trends, Art´ıculo procedente del IEEE. [12] C´ elulas fotovoltaicas,https://en.wikipedia.org/wiki/celulas_ fotovoltaicas. Wikipedia, 2017. 131