Buen día estimados, tengo el siguiente circuito:
(https://i.ibb.co/XJB5bvP/circuito.png) (https://imgbb.com/)
El mismo es un resumen de un circuito más complejo, donde se obtiene una señal de voltaje variable, en función del nivel de agua en un tanque.
Si el interruptor A - genera el voltaje que denominaremos V1 correspondiente al 25%.
B - genera el voltaje que denominaremos V2 correspondiente al 50%.
C - genera el voltaje que denominaremos V3 correspondiente al 75%.
D - genera el voltaje que denominaremos V4 correspondiente al 100%.
Mi consulta 1 es la siguiente:
Quiero saber como podría implementar una función en C, para el siguiente caso:
Si el interruptor A,B,C o D se cierra, independientemente de cuál lo haga primero tendría que obtener un valor del 25% de la función.
Si por ejemplo A y B o C y D o cualquier combinación de 2 interruptores se cierra, obtener un valor del 50% de la función.
Si por ejemplo cualquier grupo de interruptores se cierra, obtener un 75% de la función.
Si los 4 interruptores se cierran, obtener el 100% de la función.
Mi implementación funciona solo en manera ascendente:
Si A se cierra -> 25%
Si A+B se cierra -> 50%
Si A+B+C se cierra -> 75%
Si A+B+C+D se cierra -> 100%
Consulta 2:
Teniendo en cuenta el circuito, como se podría calcular el arreglo de divisores de tensión para obtener la relación de voltaje lo más diferenciada posible
según el interruptor deseado.
Para explicarlo de otra manera, en vez de tener saltos de 500mV....o 300mV....como poder tener una escala de aprox 1.2...o 1.5v entre saltos.
Saludos y espero puedan entender mi consulta.
A cada interruptor A, B, C, D, de hago corresponder las variables a, b, c, d, que solo toman valor 0 ó 1, abierto/cerrado respectivamente.
Sumo las cuatro variables, y obtendria, 0, 1, 2, 3, ó 4
Con esos valores le voy a una elección múltiple, (case), y asigno el porcentaje que corresponda.
// Lee el nivel de batería.
int nVoltageRaw = analogRead(A0);
float fVoltage = (float)nVoltageRaw * 0.01024;
float fVoltageMatrix[22][2] = {
{4.2, 100},
{4.15, 95},
{4.11, 90},
{4.08, 85},
{4.02, 80},
{3.98, 75},
{3.95, 70},
{3.91, 65},
{3.87, 60},
{3.85, 55},
{3.84, 50},
{3.82, 45},
{3.80, 40},
{3.79, 35},
{3.77, 30},
{3.75, 25},
{3.73, 20},
{3.71, 15},
{3.69, 10},
{3.61, 5},
{3.27, 0},
{0, 0}
};
int i, perc;
perc = 100;
// Procesa el porcentaje del nivel de batería.
for(i=22; i>=0; i--) {
if(fVoltageMatrix[i][0] >= fVoltage) {
perc = fVoltageMatrix[i + 1][1];
break;
}
}
No pensaste en usar una inductancia variable, en función del nivel, se genera una frecuencia con un circuito en el que participa esta reactancia, se mide la frecuencia, y se le hace corresponde a distintos niveles, ahora, la variable, puede ser continua, y no discreta de solo cinco punto.
Las ultimas generaciones de lavarropas emplean éste mecanismo que indico, para ser muy finos con el nivel de agua.
¿Por qué no conectas directamente cada interruptor a terminales o pines del microcontrolador y te olvidas del ADC? ¿Es tu microcontrolador muy pequeño?
Tal vez tu arreglo de resistencias debería ser así:
En el diseño original está así, una entrada por señal. Pero ahora se está rediseñando la placa para ahorrar espacio y costo.
En mi caso los "interruptores" son salidas de amplificadores operacionales, por lo que tendrían que estar si o si colocados a través de una resistencia a la red de división de tensión.
Para darle un poco más de claridad a lo que quiero hacer, este sería el circuito que se está implementando.
(https://i.ibb.co/9g46qBw/circuito.png) (https://ibb.co/r0pYZqb)
Todo el circuito funciona ok hace ya un par de años, sin problema de ruido o falsas lecturas. Lo que se está ensayando es la red de división de tensión y la lógica para procesar el nivel.
Si, ahora se comprende, y ese circuito si posee un filtro con el último operacional.
Respecto a tu pregunta, si deseas mantener el mismo circuito original o uno parecido, es decir analógica la salida final, el análisis para resolver la consulta 1 puede ser un poco complejo y creo que tomaría algo de tiempo.
Sigo pensando que las salidas de los operacionales deberían ir directamente a entradas del microcontrolador, al menos que no poseas más entradas disponibles.
el análisis para resolver la consulta 1 puede ser un poco complejo y creo que tomaría algo de tiempo.
Podrías simular tu circuito para determinar que voltaje obtienes con las combinaciones mencionadas, pero tu primer circuito con interruptores, creo que está mal, ya que cuando un interruptor no está presionado, la salida del operacional está en 0 lógico, es decir está conectada a tierra.
// los límite deben estar en orden ascendente
const int8 limites[] = {0 , 24 , 45 , 130 ,...} ;
// los rangos deben corresponderse con cada límite
const int8 rango[] = {25 , 50 , 35 , 12 , 84 ,...} ;
int LeoSwitchs(void){
int k ;
voltaje = ADC_Read() ; // Lee el voltaje
for(k=Nestados; voltaje < limites[k] ;k--); // Se detiene cuando el voltaje
// está entre dos de la tabla
return rango[k] ;
}
Datos obtenidos luego de las pruebas y mediciones.
(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)
Ahora queda hacer unas pruebas de código y ver que pasa.
El circuito final que estoy usando es este.
(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)
Pues creo que deberías usar otro diseño, ya que si la salida 1 y 2 están activas (izquierda), el voltaje es 0.441V, mientras que si las salidas 3 y 4 están activas, el voltaje es 2.647.Al tratarse de un nivel de varillas, sólo pueden darse las condiciones 1, 1-2, 1-2-3 y 1-2-3-4, si consideramos que el nivel mínimo arranca por el 1.
Y según lo que mencionaste, al estar activas dos de las 4 salidas (cualquiera), el voltaje debería ser el mismo.25% (O eso entendí)
(https://pbs.twimg.com/media/FzPgmHKWcAIc74k?format=png&name=large)
Datos obtenidos luego de las pruebas y mediciones.En tu tabla, hay condiciones que jamás podrían darse, ya que estamos hablando de niveles por varilla.
(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)
Ahora queda hacer unas pruebas de código y ver que pasa.
El circuito final que estoy usando es este.
(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)
Pues creo que deberías usar otro diseño, ya que si la salida 1 y 2 están activas (izquierda), el voltaje es 0.441V, mientras que si las salidas 3 y 4 están activas, el voltaje es 2.647.Al tratarse de un nivel de varillas, sólo pueden darse las condiciones 1, 1-2, 1-2-3 y 1-2-3-4, si consideramos que el nivel mínimo arranca por el 1.
Y según lo que mencionaste, al estar activas dos de las 4 salidas (cualquiera), el voltaje debería ser el mismo.25% (O eso entendí)
(https://pbs.twimg.com/media/FzPgmHKWcAIc74k?format=png&name=large)
Por lo tanto, la condición 3 y 4 solamente, jamás pordrían darse.
Datos obtenidos luego de las pruebas y mediciones.En tu tabla, hay condiciones que jamás podrían darse, ya que estamos hablando de niveles por varilla.
(https://i.ibb.co/SVQBgt2/Sin-t-tulo.png) (https://ibb.co/3Sfcbpw)
Ahora queda hacer unas pruebas de código y ver que pasa.
El circuito final que estoy usando es este.
(https://i.ibb.co/1XGC4Wc/2.png) (https://ibb.co/xgqnrTZ)
Tendrás en el caso mínimo, ningún sensor actuado, y en máximo estarán todos actuados, por lo tanto las condiciones serán empezando por mínimo: 0001, 0011, 0111 y 1111, tendrás sólo cuatro estados posibles, o al menos eso comprendí de tu sistema de detección.
void setup() {
Serial.begin(9600);
}
void loop() {
// Lee el nivel de agua.
int nVoltageRaw = analogRead(A0);
float fVoltage = (float)nVoltageRaw/1023*5.0;
Serial.println(fVoltage);
delay(500);
if (fVoltage <=0) {Serial.println("0%");}
if (fVoltage > 1.116 && fVoltage < 1.5) {Serial.println("25%");}
else if (fVoltage > 2.21 && fVoltage < 2.7) {Serial.println("50%");}
else if (fVoltage > 3.33 && fVoltage < 4.07) {Serial.println("75%");}
else if (fVoltage > 4.44 && fVoltage < 5.43) {Serial.println("100%");}
}
Dudo que el sistema pueda detectar, si una varilla está mal conectada. Creo y me parece coherente que debe conectarse como corresponde, ya que no hay nada redundante que detecte un error de manipulación. Tienes que asegurarte de manera mecánica, que las varillas se conectan correctamente, por ejem. utilizando algún conector que evite ser insertado al revés, o bien utilizar varillas de diferente diámetro para evitar ser conectadas en un terminal que no coincide.