Optimització i Control en Temps Real amb Microcontroladors

Enviado por Chuletator online y clasificado en Informática y Telecomunicaciones

Escrito el en catalán con un tamaño de 6,37 KB

Consideracions en Algorismes de Control en Temps Real

Per programar un algorisme de control que funcioni en temps real, cal tenir en compte els següents punts clau:

  • Actualització del temps: La variable temps s'ha d'actualitzar amb un timer, ja que no es veu afectada pels retards que pot patir la CPU.
  • Gestió de perifèrics per interrupció: Tots els perifèrics han de funcionar per interrupció, perquè l'actuació sigui el més ràpida possible i minimitzant el consum de CPU:
    • Per garantir un temps de mostreig estable, cal configurar una interrupció d'un timer.
    • Per donar una resposta ràpida en comunicacions, calen interrupcions de la USART.
    • En el mostreig de les variables analògiques, s'utilitzen interrupcions per estalviar el temps de latència provocat pel temps de conversió de l'ADC.
  • Optimització de les operacions matemàtiques: Cal simplificar i optimitzar les operacions a realitzar:
    • Simplificar expressions.
    • Agrupar totes les constants possibles en una sola constant multiplicativa.
    • Aplicar factor comú.
    • Utilitzar els tipus de dades ajustats.

Mesura de PWM: Interrupció Externa vs. Mode de Captura

Tots dos mètodes (interrupció externa INT0 o mode de captura ICF1) requereixen l'ús d'un timer per mesurar el temps transcorregut i utilitzen el mecanisme d'interrupció per alliberar la CPU de la tasca de detectar els flancs del senyal PWM.

Diferències de Precisió

La diferència principal rau en la precisió de la mesura:

  • Quan es produeix la interrupció INT0, encara passen uns cicles de rellotge fins que no es llegeix el temps.
  • En canvi, en produir-se la interrupció ICF1 (Mode de Captura), els polsos transcorreguts ja estan capturats al registre TCNT1.

Això fa que el temps mesurat amb el mode de captura sigui molt més precís, ja que no inclou la latència de servir la interrupció, permetent mesurar correctament ones de freqüència més alta.

Connexió Directa de Transistors de Potència al Microcontrolador

No. Generalment, no és possible accionar directament qualsevol transistor de potència utilitzant la sortida d'un microcontrolador.

Limitacions de Voltatge i Corrent

Els microcontroladors funcionen amb voltatges de 5 V o 3 V. El voltatge de control necessari per accionar transistors de potència (MOSFET o IGBT) en tot el seu rang és de l'ordre dels 10 V. Per tant, serà necessària una etapa intermèdia (amb un altre transistor petit) per elevar el voltatge de control.

En el cas més estrany que el transistor de potència sigui BJT, tampoc serà possible la connexió directa, ja que els 20 mA que pot subministrar la sortida del microcontrolador seran insuficients, necessitant també un transistor addicional per amplificar el corrent.

Aïllament Elèctric entre Controlador i Sortides de Potència

Per aïllar elèctricament el controlador de les sortides digitals de potència en un sistema encastat, s'utilitzen diferents mètodes segons la freqüència de commutació:

  • A baixa freqüència: Relés electromecànics. La bobina de control no està connectada als contactes de potència, i l'accionament es fa mitjançant un camp magnètic.
  • A alta freqüència: Optoacobladors. El fotodíode no està connectat al fototransistor, i l'enllaç es realitza mitjançant llum.

En tots dos casos, és essencial que no es comparteixi la massa entre el controlador i la part de potència, evitant qualsevol connexió elèctrica directa.

Diferències entre Timers 0, 1 i 2 per a Generació PWM

Els timers 0, 1 i 2 presenten diferències significatives en la seva capacitat de resolució i configuració per generar senyals PWM:

  • Timers 0 i 2 (8 bits): Són pràcticament idèntics a l'hora de generar senyal PWM, amb una resolució fixa de 8 bits. El període es genera comptant de 0 a 0xFF polsos.
  • Timer 0: Té dues possibilitats menys de prescaler, ja que es pot programar per comptatge extern de polsos.
  • Timer 1 (16 bits): Pot generar el període utilitzant el contingut del registre ICR1 com a valor màxim. D'aquesta manera, podem escollir la resolució a utilitzar fins a un màxim de 16 bits.

Generació de Senyal PWM d'Alta Freqüència (> 10 kHz)

El Timer 1 és l'únic amb què podem generar un senyal PWM amb un duty cycle amb resolució de més de 8 bits.

Càlcul de Freqüència i Resolució (Exemple 12 bits)

Per a una resolució de 12 bits, haurem de comptar de 0 a 0x0FFF, és a dir, 4096 (0x1000) polsos.

La fórmula del prescaler (PRE) és: f_pwm = f_clk / (PRE · Període).

Si volem f_pwm > 10 kHz, el càlcul del prescaler seria:

PRE < 16M / (10k · 0x1000) = 0,39

Com que el valor mínim del prescaler és 1, no és possible aconseguir 10 kHz amb 12 bits de resolució a 16 MHz. Amb PRE=1, la freqüència màxima obtinguda és:

f_pwm = 16 MHz / (1 · 4096) = 3,9 kHz

Si són necessaris f_pwm > 10 kHz, hauríem de reduir la resolució (per exemple, a 10 bits) i multiplicaríem la freqüència per 4.

Configuració del Timer 1 (12 bits)

Si triem el comparador A del Timer 1, la línia PWM és la OC1A, que correspon al pin 9 (PB1) de l'Arduino UNO.

void setup() {
  DDRB |= _BV(DDB1); // Configura el pin OC1A=PB1 de l'ATmega328 (pin 9 PWM de l'Arduino UNO) com a sortida
  
  // Timer 1 Control R A: pin OCR1A 1/0 normal (COM1A1,0=10) / Mode 14 Fast PWM (WGM11,0=10)
  TCCR1A = _BV(COM1A1) | _BV(WGM11); 
  
  // Timer 1 Control R B: Mode 14 Fast PWM (WGM13,2=11) / Prescaler=1 (CS12,1,0=001)
  TCCR1B = _BV(WGM13) | _BV(WGM12) | _BV(CS10); 
  
  TCCR1C = 0; // Per als modes estudiats
  
  // Input Capture Register = Número de polsos del període del senyal PWM: 2^12: 12 bits
  ICR1 = 0x0FFF; 
  
  OCR1A = 0; // Duty cycle per defecte
}

// Podem variar el duty cycle en qualsevol funció ISR o loop segons convingui, 
// modificant OCR1A entre 0 (0% mínim) i 4095 (100% màxim).
void loop() {
}

Entradas relacionadas: