Led como fotodiodo de entrada [Arduino AVR]

0

Estoy tratando de usar un LED como un sensor de luz (entrada) conectado a un Arduino Nano. Conecté el led con el ánodo en el pin digital 8 (PB0) con una resistencia de 56 ohmios y el cátodo en un pin analógico A0 (PC0).     LaideaprincipalesmedirelvoltajeatravésdelacapacitanciadelparásitoenelLEDquesealmacenóduranteunimpulsocortode5V(girandoPC0altoyluegobajo)enpolarizacióninversa.    Elprimerejemploesmuysimple.

uint16_tsen_time=0;//Variableforcountingvoidsetup(){Serial.begin(9600);//Settingpin8toOUTPUTandtheresttoINPUTDDRB|=(1<<PB0);//SettingOUTPUTPB0PORTB&=~(1<<PB0);//SettingAnodeLOWTCCR1B|=(1<<CS10);//Settingtimer,noprescaling(f=16Mhz)}voidloop(){/*Reversebiaspulse*/DDRC|=(1<<PC0);//SettingA0toOUTPUTPORTC|=(1<<PC0);//SettingA0toHIGH/*SettingThreestateCathode*/DDRC&=~(1<<PC0);//SettingA0toINPUTPORTC&=~(1<<PC0);//SettingA0toLOWTCNT1=0;//Settingtimerthemomentweturnoff//Waitingfortheledtodischargeandcountingwhile(analogRead(A0)!=0){sen_time++;}Serial.print("TCNT:");
  Serial.println(TCNT1);
  Serial.print("sen_time:");
  Serial.println(sen_time);    //Print the value
  sen_time = 0;                //Setting the value to 0
}

Los resultados son los siguientes. En condiciones normales: Enlaoscuridad: En luz pesada:

La variable que se incrementa sen_time es bastante precisa, con valores altos para la oscuridad y valores bajos para la luz intensa. Pero no puedo entender por qué mi temporizador tiene valores de basura en todos los sentidos.

Estoy tratando de resolverlo con interrupciones (interrupciones de cambio de pin), pero al obtener el pin de tres puntos, solo se activa la interrupción en todos los sentidos. Además, el TCNT obtuvo valores trush cada vez que lo leí. Obtener resistencias pull-up solo mantiene el pin alto. Algunos consejos sobre cómo resolver este problema preferiblemente con interrupciones (debido a la restricción de tiempo en el proyecto futuro). Gracias y espero resolverlo lo antes posible!

    
pregunta Hriho

1 respuesta

2

Debe leer el valor TCNT1 en una variable inmediatamente después de su ciclo while y antes de comenzar a imprimir cosas, luego imprima el valor de esa variable.

¿Por qué? TCNT1 está contando a 16MHz. La velocidad en baudios de su puerto serie es 9600. Por lo tanto, un solo carácter (bit de inicio, 8 bits de datos, bit de parada) tardará unos 10,4 ms en transmitir. En esta cantidad de tiempo, TCNT1 se incrementará 16,666 veces. En el tiempo que tardan en transmitirse 4 caracteres, TCNT1 se reiniciará y comenzará a contar desde cero nuevamente.

    
respondido por el amb

Lea otras preguntas en las etiquetas