Detección de voltaje con un pin digital

0

Soy relativamente nuevo con Arduino e hice un poco de investigación antes de esta publicación. Pero estoy tratando de detectar cuándo tengo voltaje proveniente de un convertidor de CA / CC (12Vdc) para poder cambiar de mi batería a mi convertidor de CA / CC. Estoy usando una interrupción en mi Arduino Mega para cambiar de manera eficiente entre las fuentes de alimentación. Intenté simplemente usar un divisor de voltaje y leer 5 voltios en mi pin digital, pero parece que el pin está "flotando" independientemente de si se suministra energía o no, y no detecto correctamente el voltaje proveniente de mi convertidor AC / DC. ¿Hay alguna manera de incorporar condensadores o algún otro circuito para detectar correctamente el voltaje con un divisor de voltaje? Cualquier ayuda es apreciada.

simular este circuito : esquema creado usando CircuitLab

    
pregunta Mason

2 respuestas

1

De tu comentario:

  

Medí el voltaje con un multímetro y estoy leyendo 4V, pero estaba imprimiendo la señal digitalRead desde ese pin mientras se estaba aplicando el voltaje, obtenía una serie de 1 y 0 que no me parecen correctas porque Estoy aplicando un voltaje.

El controlador lee los pines digitales y, si el voltaje está por encima del umbral, lee la entrada como '1'. Si no, es un '0'.

Sospecho que estás confundiendo digital como en 'una pantalla digital' con digital como en 'lógica binaria'.

Si realmente quiere medir el voltaje, entonces usa una entrada analógica y el valor entero digital que obtiene será proporcional al voltaje de entrada. La resolución será una en \ $ 2 ^ n \ $, donde n es el número de bits en el ADC.

    
respondido por el Transistor
1

Usted dice que está utilizando una tarjeta Arduino Mega que implica ATMega1280 o 2560. Ambos tienen un módulo de comparador analógico que está integrado. Las tarjetas Arduino salen del pin con la función alternativa de "AIN1" a la que Arduino llama "pin digital 5".

Si habilita el intervalo de banda interno como referencia para la fuente de "AIN0" (algo que se configura internamente), básicamente puede usar un divisor de potencial en D5 que se calcula de manera que cuando el voltaje de la batería caiga por debajo de cierto umbral, el centro del divisor (conectado al pin) cae por debajo de 1.1V. Cuando esto suceda, el comparador dentro de ATMega cambiará de estado y este evento se puede configurar para generar una interrupción ( ISR(ANALOG_COMP_vect) ).

El comparador se puede configurar utilizando el siguiente código C (compilable con avr-gcc):

//Code to enable comparator
ADCSRB &= ~(1 << ACME); //Connect AIN1/D5 to the comparator
DIDR1 |= (1 << AIN1D); //Disable digital functionality of AIN1 pin so we can use comparator
ACSR = (0 << ACD) | (1 << ACBG) | (1 << ACIS1) | (1 << ACIS0); //Enable comparator, connect bandgap, and set to rising edge sensitivity (AIN1 falls below AIN0)
//-------

//If you want to generate an interrupt, do this to enable it (make sure you have an ISR for ANALOG_COMP_vect):
ACSR |= (1 << ACIE); //Enable interrupt.
...
ISR(ANALOG_COMP_vect) {
    //Do something when voltage drops too low
}
//-------

//If you want to do it via polling mode, do this to check the value
if (ACSR & (1 << ACO)) {
    //Do something if the voltage drops too low
}
//-------
    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas