User Tools

Site Tools


tutorials:arduino:00_arduino_basic:017_interrupcions

Interrupcions

Ja ampliaré el tema perquè es un tema important, de moment deixe aquest pdf, que es el primer que veig mes o meyns ben explicat. gammon_forum_electronics_microprocessors_interrupts_e.g.pdf

Son necessàries?

No soc molt partidari de les interrupcions, preferisc fer programes que no bloquejadors, que no tinguen cap delay(). Es una preferència personal.

El program plantejat està pensat per calcular el factor de potencia, es a dir, el desfasament entre corrent i tensió a 50Hz(10ms, 10000us mig cicle). El calcul, amb radians es el següent: fdp = cos(f*dt);

on dt=temps en segons i f=freqüència

I al reves:

acos (fdp) = f * dt

dt = acos(fdp) / f

Per exemple un

fdp de 0,6 dt= 0,0129 segons = 12900 us

fdp de 0,99 dt= 0,0028 segons = 2800 us

Així que les mesures normals entre 0,6 i 0,99 en microsegons podrien oscil·lar entre els 2000 i 12000 microsegons, el programa amb un arduino a 16MHz tarda a executar-se uns 8-12 us, com ara comprovarem, sense enviar dades, te temps de sobra.

Es un programa molt interessant perquè ens diu el temps que tarda en avaluar les entrades i fer alguns càlculs.

mesurafp_simulide.zip

El programa es el següent:

unsigned long previousMillis = 0;
const long intervalDades = 2000;          

bool eventTensio=0;
bool eventCorrent=0;
bool enviantDades=0;
long eventTensio_us=0;
long eventCorrent_us=0;
long interval_us=0;
int pinTensio=8;
int pinCorrent=9;

void setup() {
  pinMode(pinTensio, INPUT);
  pinMode(pinCorrent, INPUT);
  Serial.begin(9600);
}

void loop() {
////////////////////
// mesura microsegons
if (digitalRead(pinTensio)==HIGH
    && eventTensio==0
    && eventCorrent==0
    && enviantDades==0) {
  eventTensio_us=micros();
  eventTensio=1;
  }

if (digitalRead(pinCorrent)==HIGH &&
    eventTensio==1 &&
    eventCorrent==0 &&
    enviantDades==0
  ){
  eventCorrent_us=micros();
  eventTensio=0;
  interval_us=eventCorrent_us-eventTensio_us;
  eventCorrent=1;
}
/////////////////////////////
// enviament de dades cada interval Dades

  unsigned long currentMillis = millis();
  if (currentMillis - previousMillis >= intervalDades) {
      previousMillis = currentMillis;
      enviantDades=1;
      Serial.print("interval=");
      Serial.println(interval_us);
      interval_us=0;
      enviantDades=0;
      eventCorrent=0;
    } 
  
}
tutorials/arduino/00_arduino_basic/017_interrupcions.txt · Last modified: 2021/09/19 14:41 (external edit)