TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: johenrod en 17 de Agosto de 2021, 13:13:42
-
Cordial saludo, en esta oportunidad requiero de el concepto para leer un switch el cual tiene un común y otros 3 contactos los cuales va leyendo uno a la vez. La idea es saber cuando incrementa o decrementa, he encontrado algunos ejemplos con la función millis en arduino pero, no soy muy amigo de arduino y deseo hacerlo en CCS.
según lo investigado se necesitan crear una variable y actualizarlas en el proceso, me podrían sugerir algo por favor?
Gracias de antemano.
https://3.bp.blogspot.com/-U3pKHZX6ZIM/WYuFK-bE2GI/AAAAAAAAFY4/5OiLlMEI4f0Xo76n-9z_G6P1Lw2SV4dnACLcBGAs/s320/DSC_0787.jpg (https://3.bp.blogspot.com/-U3pKHZX6ZIM/WYuFK-bE2GI/AAAAAAAAFY4/5OiLlMEI4f0Xo76n-9z_G6P1Lw2SV4dnACLcBGAs/s320/DSC_0787.jpg)
-
Saludos. ¿Qué desea hacer? ¿Medir velocidad, conocer el sentido de giro o ambas cosas?
Yo una vez utilice uno para medir velocidad, una especie de tacómetro.
Las señales generaban los 3 terminales era algo a la imagen adjunta.
Utilizaba una interrupción externa por flanco de subida y mediante una OR a base de 3 diodos, cualquiera de las 3 señales producían la interrupción.
Para conocer el sentido de giro hacia lo siguiente:
En la interrupción, llamaba a un método o función donde leía el valor de las 3 señales, por ejemplo digamos que leía en binario 001, ese valor lo guardaba en una variable.
Luego esperaba una otra interrupción y leía las señales y si el nuevo valor era 010, entonces sabia que estaba girando para un lado, si obtenía 100, era que estaba girando para el otro lado.
En resumen, el código recuerdo que era algo similar a esto:
bool paraDondeGira(void)
{
switch (valorAnterior)
{
case 0x01: // b001
{
if (0x02 == valorActual) //b010 == valorActual
{
return true;
}
return false;
}
case 0x02: // b010
{
if (0x04 == valorActual) //b100 == valorActual
{
return true;
}
return false;
}
default:// equivale a case 0x04 o b'100'
{
if (0x01 == valorActual)
{
return true;
}
return false;
}
}
}
-
La OR con diodos es como se muestra en la imagen adjunta.
-
Saludos. ¿Qué desea hacer? ¿Medir velocidad, conocer el sentido de giro o ambas cosas?
Yo una vez utilice uno para medir velocidad, una especie de tacómetro.
Las señales generaban los 3 terminales era algo a la imagen adjunta.
Utilizaba una interrupción externa por flanco de subida y mediante una OR a base de 3 diodos, cualquiera de las 3 señales producían la interrupción.
Para conocer el sentido de giro hacia lo siguiente:
En la interrupción, llamaba a un método o función donde leía el valor de las 3 señales, por ejemplo digamos que leía en binario 001, ese valor lo guardaba en una variable.
Gracias por tu respuesta...
la idea es ver cuando se gira hacia un lado o hacia el otro para aumentar o disminuir volumen, por lo que siempre hay que recordar los valores previos.
-
Saludos. ¿Qué desea hacer? ¿Medir velocidad, conocer el sentido de giro o ambas cosas?
Yo una vez utilice uno para medir velocidad, una especie de tacómetro.
Las señales generaban los 3 terminales era algo a la imagen adjunta.
Utilizaba una interrupción externa por flanco de subida y mediante una OR a base de 3 diodos, cualquiera de las 3 señales producían la interrupción.
Para conocer el sentido de giro hacia lo siguiente:
En la interrupción, llamaba a un método o función donde leía el valor de las 3 señales, por ejemplo digamos que leía en binario 001, ese valor lo guardaba en una variable.
Gracias por tu respuesta...
la idea es ver cuando se gira hacia un lado o hacia el otro para aumentar o disminuir volumen, por lo que siempre hay que recordar los valores previos.
No comprendo a que te refieres con "volumen", pero con respecto a guardar o recordar valores previos era simplemente guardar el valor actual donde estaba el valor anterior luego de llamar a la función paraDondeDiga
if (paraDondeGira())
{
... //
}
valorAnterior = valorActual
-
No comprendo a que te refieres con "volumen", pero con respecto a guardar o recordar valores previos era simplemente guardar el valor actual donde estaba el valor anterior luego de llamar a la función paraDondeDiga
Código: [Seleccionar]
if (paraDondeGira())
{
... //
}
valorAnterior = valorActual
Lo que pretendo es aumentar el volumen de un radio de un coche y depende el giro del switch rotatorio, aumenta o disminuye.
-
Lo que pretendo es aumentar el volumen de un radio de un coche y depende el giro del switch rotatorio, aumenta o disminuye.
Entonces no es un encoder lo que tienes, lo que posees es un motor de pasos que va a mover el volumen del radio ¿Verdad?
-
pues aca se le conoce como swicth rotatorio
hay un comun central y va haciendo contacto uno a uno con los otros 3 contactos
https://3.bp.blogspot.com/-U3pKHZX6ZIM/WYuFK-bE2GI/AAAAAAAAFY4/5OiLlMEI4f0Xo76n-9z_G6P1Lw2SV4dnACLcBGAs/s320/DSC_0787.jpg (https://3.bp.blogspot.com/-U3pKHZX6ZIM/WYuFK-bE2GI/AAAAAAAAFY4/5OiLlMEI4f0Xo76n-9z_G6P1Lw2SV4dnACLcBGAs/s320/DSC_0787.jpg)
-
pues aca se le conoce como swicth rotatorio
hay un comun central y va haciendo contacto uno a uno con los otros 3 contactos
https://3.bp.blogspot.com/-U3pKHZX6ZIM/WYuFK-bE2GI/AAAAAAAAFY4/5OiLlMEI4f0Xo76n-9z_G6P1Lw2SV4dnACLcBGAs/s320/DSC_0787.jpg (https://3.bp.blogspot.com/-U3pKHZX6ZIM/WYuFK-bE2GI/AAAAAAAAFY4/5OiLlMEI4f0Xo76n-9z_G6P1Lw2SV4dnACLcBGAs/s320/DSC_0787.jpg)
Esa imagen no da mucha información, parecería cualquiera de las dos cosas. Pero si es básicamente un motor eléctrico, lo que tienes que hacer es generar la señal similar a la que adjunté al inicio y con transistores de potencia manejarías las cargas.
Ahora si deseas cambiar el volumen de sonido con un microcontrolador, personalmente sacaría el potenciómetro (volumen) del radio y colocara una resistencia SPI o I2C y cambiaría su valor con el microcontrolador. Las cosas que son mecánicas son mas tediosas para que funcionen correctamente. Sin partes mecánicas es mucho mejor.
-
Esa imagen no da mucha información, parecería cualquiera de las dos cosas. Pero si es básicamente un motor eléctrico, lo que tienes que hacer es generar la señal similar a la que adjunté al inicio y con transistores de potencia manejarías las cargas.
Ahora si deseas cambiar el volumen de sonido con un microcontrolador, personalmente sacaría el potenciómetro (volumen) del radio y colocara una resistencia SPI o I2C y cambiaría su valor con el microcontrolador. Las cosas que son mecánicas son mas tediosas para que funcionen correctamente. Sin partes mecánicas es mucho mejor.
Gracias por tu ayuda , parece que no me logro hacer entender, la imagen es de un switch rotatorio es decir, un encoder. y va generando 3 pulsos uno tras otro pero solo 1 a la vez dependiendo del contacto que vaya tocando. dependiendo hacia donde gire estará en dirección horaria o anti-horaria lo que requiero es identificar hacia que lado gira para actuar en consecuencia y enviar un pulso con el microcontrolador sea para un rele o un potenciometro digital etc.
-
Esa imagen no da mucha información, parecería cualquiera de las dos cosas. Pero si es básicamente un motor eléctrico, lo que tienes que hacer es generar la señal similar a la que adjunté al inicio y con transistores de potencia manejarías las cargas.
Ahora si deseas cambiar el volumen de sonido con un microcontrolador, personalmente sacaría el potenciómetro (volumen) del radio y colocara una resistencia SPI o I2C y cambiaría su valor con el microcontrolador. Las cosas que son mecánicas son mas tediosas para que funcionen correctamente. Sin partes mecánicas es mucho mejor.
Gracias por tu ayuda , parece que no me logro hacer entender, la imagen es de un switch rotatorio es decir, un encoder. y va generando 3 pulsos uno tras otro pero solo 1 a la vez dependiendo del contacto que vaya tocando. dependiendo hacia donde gire estará en dirección horaria o anti-horaria lo que requiero es identificar hacia que lado gira para actuar en consecuencia y enviar un pulso con el microcontrolador sea para un rele o un potenciometro digital etc.
Pues volvemos a la respuesta original. Leyendo un valor y el siguiente sabrás si gira a un lado o al otro
-
Que tal johenron,
No se como tengas conectado tu switch rotatorio, si estés usando resistencias de pull-up con el común a tierra o estés usando resistencias de pull-down con el común a VDD (5V).
Si es el primer caso, entonces una de las tres terminales siempre está en nivel bajo y las optras dos en nivel alto. Es decir si supones que los tres puntos de pull-up son A,B y C y que está seleccionado el punto A, entonces tienes lo siguiente 011, ahora bien si giras hacia la derecha y suponiendo que el punto B está hacia la derecha, entonces ahora tendrías 101. Si has registrado el estado anterior, con el microcontrolador lo que estas observando es precisamente el giro hacia la derecha.
Ahora bien si el selector ya está seleccionando el punto B, eso significa que ahora tienes 101, correcto? Lo que significa que ahora el switch lo puedes girar a la direcha o a la izquierda. Pues bien, si giras a un sentido y obtienes 110, estás girando a la derecha, pero si obtienes 011, entonces estás girando a la izquierda. Así de simple. Si en lugar de resistencias pull-up tienes resistencias pull-down, simplemente inviertes la lógica (100 cuando el contacto A está seleccionado, y si gira a la derecha tendrías 010).
Espero esto te sirva.
Elreypic.