Skip to content

Lectura asíncrona del pletismógrafo

La lectura del pletismógrafo se realizará a una frecuencia fija de 30Hz (aunque se podría a 50 Hz, 100Hz o más) utilizando el modo de bajo ruido de lectura analógica del arduino, para lo que será necesario dormirlo.

Para iniciar conversiones a intervalos regulares, se utilizará Timer1 en modo CTC match ICR1. Con ICR1=65535, se ejecuta la interrupción a 30Hz; con ICR1=20000 se ejecuta la interrupción a 100Hz.

El código de configuración del Timer1 es el siguiente:

TIMSK1 = B00100000 ; // 00,ICR1 match interrupt:1,00,match B int:0, match A int:0, Overflow interrupt: 0
TCCR1A = B00000000 ;
ICR1= 65535 ; // 20000(p8)=> 100Hz con prescaler 8
TCCR1C = B00000000 ;
TCCR1B = B00011010 ; // 00-,Modo CTC con ICR1: 11, prescaler de 8:010

La interrupción generada es TIMER1_CAPT_vect, en la que se iniciará una conversión A/D.

ISR(TIMER1_CAPT_vect ,ISR_NOBLOCK) {
  SMCR = B00000011 ; // 0000, ADC noise reduction: 001, sleep enable:1
  sleep_cpu() ; // Al dormir, se inicia automáticamente la conversión, gracias a la configuración en SMCR
  SMCR = B00000000 ; // power mode idle:000, sleep disabled:0

  // Se puede iniciar una conversión sin entrar en modo sleep de conversión A/D de bajo ruido mediante
  // ADCSRA |= B01000000
}

Previamente en setup() es necesario configurar el conversor A/D para leer del puerto A0:

ADMUX = B01000000 ; // REF:01, ADLAR:0,0,ADC0:0000
DIDR0 = B00111111 ; // Disable digital inputs, menor ruido y consumo
ADCSRB = B00000000 ;
ADCSRA = B10001111 ;// Enable:1,Start:0,Autotrigger:0,Interrupt flag:0
                    // Interrupt enable:1, prescaler:111

Y hay que declarar la interrupción ADC_vect que se ejecutará cada vez que se termine una conversión:

ISR(ADC_vect,ISR_NOBLOCK) {
  uint8_t analogLow = ADCL ;
  uint8_t analogHigh = ADCH ;
  Serial.print(0xF1,BYTE) ; // Envío del comando con el dato leído al visualizador
  Serial.print(analogHigh) ;
  Serial.print(analogLow) ;
}

Señal leída por el pletismógrafo

Bugs

Se han encontrado ciertos bugs del arduino:

  • La asignación de un valor a OCR1A antes de asignar un valor a TCCR1A implica que OCR1A será borrado en la asignación de un valor a TCCR1A.
  • El modo CTC mediante match OCR1A: 01 en TCCR1B no funciona.
  • Si el módulo de conversión está activado (ADCSRA:7 = 1), entrar en modo sleep IDLE inicia una conversión A/D, cuando no debería

Post a Comment

Your email is never published nor shared. Required fields are marked *