Mostrando entradas con la etiqueta analogico. Mostrar todas las entradas
Mostrando entradas con la etiqueta analogico. Mostrar todas las entradas

viernes, 11 de febrero de 2022

Arduino - Pulsos reloj analógico - Duración batería entre 2 y 3 meses

  Página principal

Arduino
Pulsos reloj analógico
Duración batería entre 2 y 3 meses

Como había prometido en mi anterior montaje, he aumentado la autonomía de la batería a 2 o 3 meses.
Lo primero es montar el ATMEGA328 solo, sin ningún componente externo.

Para reducir el consumo de mi reloj, se utilizara la técnica de hacer dormir el ATMEGA328 cuando no se necesite.
Este modo se llama SLEEP_MODE_PWR_DOWN, el oscilador externo se para.
Se despierta 4 veces por segundo para leer si cambian los segundos en el DS1302.
Para despertar el ATMEGA328 utilizo el
Watchdog(perro guardián).
Para reducir aún mas el consumo, deshabilito el convertidor A/D
Todo esto lo explico con detalle en el artículo  ardurab.html y ardurab.html

La alimentación se realiza mediante una batería 16850 de 3.7 V.
El consumo del circuito varía entre 0,2 mA micro dormido, y 2 mA cuando el procesador se despierta.
Cuando los segundos cambian y se necesita generar un pulso de 31mS, el consumo del circuito llega a 3mA.

Considerando una media de entre 1 y 1.5 mA de consumo, y con una
batería 16850 de 3.7 V  2000mA. la autonomía teórica es de entre 83 y 55 días.


Todos los cálculos son teóricos, no he esperado 2 meses para ver la duración de la batería.
Los cálculos dependen de la calidad de la batería 16850,
las baterías se autodescargan con el tiempo.
Espero que este montaje os haya parecido interesante.

PROGRAMAS

Saludos.
Juan Galaz



Bibliografía:
artime.html
arduds.html
ardurab.html
arduraa.html

jueves, 10 de febrero de 2022

Arduino - Pulsos reloj analógico

Página principal
Arduino
Pulsos reloj analógico

He realizado muchos relojes con el arduino, utilizando interrupciones internas, con el chip DS1302, e incluso utilizando delay, este último muy inexacto.
El otro día compré en un rastrillo un reloj analógico (de agujas), no funcionaba, era para experimentación.
Me encontré que tenía dos bobinas, una para segundos y otra para minutos (minutos/10).

Por lo cual debemos generar un pulso para los segundos, y otro pulso cada 10 segundos para los minutos.
Investigue de como funcionaban este tipo de relojes y que tipo de pulsos debía crear para mover las agujas.






Son pulsos de 31mS cada segundo.
Los pulsos deben ser positivos  y negativos alternativamente.

El primer circuito utiliza interrupciones internas que se generan cada segundo.

(16MHZ/1024)/15625= 1Hz

  TCCR1A=0;
  TCCR1B=0;
  OCR1A=15624;
  TCCR1B |= (1<<WGM12);   //  0 1 0 0 CTC OCR1A Immediate MAX
  TCCR1B |= (1<<CS10);    // clk I/O /1024 (From prescaler)
  TCCR1B |= (1<<CS12);
  TIMSK1=(1<<OCIE1A);     // Timer/Counter1, Output Compare A Match Interrupt Enable


 
Este circuito funciona bastante bien, pero con el paso de los días se adelanta o se retrasa algún segundo.


Está claro que para que sea bastante mas exacto debemos emplear un chip especial , el DS1302.
Este chip sirve para mantener la hora y la fecha, incluso con una pequeña batería de botón puede mantener la hora, aunque para este circuito no sea necesario, solo se emplea para generar los pulsos de reloj.

Al utilizar un cristal de 32768 Hz especial para relojes, la exactitud es la del cristal de cuarzo, bastante exacto.




Debido a que no tiene ajuste manual para las agujas, he añadido un pulsador para mover las agujas rápido.

La alimentación se realiza mediante una batería 16850 de 3.7 V.
El consumo del circuito con un arduino nano es de 14 mA, por lo cual la autonomía con este tipo de batería es de 6 días.

Espero que este montaje os haya parecido interesante.
En un próximo montaje explicaré como conseguir que la batería pueda llegar a durar alrededor de 3 meses. ;)

PROGRAMAS

Saludos.
Juan Galaz



Bibliografía:
artime.html
arduds.html
ardurab.html
arduraa.html

miércoles, 10 de noviembre de 2021

TECLADO ANALÓGICO PARA APLICACIONES CON MICROCONTROLADOR

  Página principal


DISEÑO DE UN TECLADO ANALÓGICO PARA APLICACIONES CON MICROCONTROLADOR

Ing. Alfredo Segura
México, 2011



DISEÑO DE UN TECLADO ANALÓGICO PARA APLICACIONES CON MICROCONTROLADOR

En algunos de nuestros diseños electrónicos con microcontroladores hemos de incluir un teclado para introducir datos o seleccionar opciones. Sin embargo pensar en un teclado matricial nos lleva a tener que elegir un microcontrolador (uC) con un mayor número de terminales para poder realizarlo. Son comunes los teclados matriciales de 4X4 (4 renglones por 4 columnas), para lo cual se requieren 8 pines de I/O en el uC.

Si el diseño requiere un teclado de las dimensiones adecuadas, podemos recurrir a un teclado analógico, el cual se puede lograr usando resistencias en serie y en cada unión de dos resistencias, se coloca el  botón que aterriza ese nodo. El arreglo se muestra en la siguiente figura:



Es conveniente utilizar una fuente de tensión muy estable, como por ejemplo el CI TL-431 o cualquier otro que se encuentre en el mercado. La razón de esto es porque el voltaje Vo a la salida del teclado analógico deberá ser siempre del mismo valor para una tecla específica y así para todas las teclas incorporadas al teclado.

La salida del teclado analógico deberá ser conectada a una entrada analógica en el uC debidamente programado para que haga la lectura o sondeo constante de dicha entrada. Es claro, según el diagrama anterior que, sin oprimir ninguna tecla, el voltaje Vo será el de la fuente estable y por lo tanto el programa en el uC, no hará acción alguna relacionada al teclado, sino que seguirá con sus actividades programadas.

Tan pronto se presiona una de las teclas, el uC recibirá por la entrada analógica la tensión correspondiente que resulta de la división entre Rv y la suma de R1 a Rn:


Vo = Vi(R1 + … + Rn) / [Rv + (R1 + … + Rn)]


Por supuesto que el diseñador podrá elegir libremente el nombre de cada tecla, de acuerdo con las actividades que el uC debe realizar al presionarse una de ellas. En el diagrama se han etiquetado como las típicas de un teclado con 16 posiciones, sin el punto(.):

0, #, D, C, 3, 2, 1, 4, 5, 6, B, A, 7, 8, 9


Así que el módulo ADC (Analog To Digital Converter) o Convertidor Analógico a Digital del microcontrolador podrá entregar un valor digital diferente por cada una de las teclas que se vayan presionando.

Para tener un span mas alto en los valores de cada tecla, Rv podrá elegirse del valor mas adecuado para que Vo sea el valor mas bajo apreciable cuando se presiona la tecla “0”.  Así, para cuando se presione la tecla “7”, la suma de todas las resistencias R1 + … + R15, involucradas en la ecuación de Vo, proporcionen el valor mas alto de tensión.

Hay que aclarar que este modelo de teclado analógico no se puede usar para oprimir varias teclas simultáneamente, porque al oprimir solamente una de ellas, se anulan las mas alejadas a la salida Vo. Sin embargo, se puede crear otro ramal de teclas, que serán exclusivas para usarse en forma simultánea con las primeras, para expandir las funciones. De todos modos, otro ramal de teclas en una misma PCB, no es muy difícil de obtener y el uC destinaría una entrada adicional analógica para recibir esta nueva señal.

A continuación se muestra un ejemplo de programa en Cpp para un microcontrolador PIC 12F675 que tiene únicamente 8 terminales:

/*
Programa con el 12f675 y un HT12E que sirve para leer un teclado analógico
usando una cadena de resistencias de 1k formando un divisor de tensión con otra
de 10K a Una fuente de voltaje regulado (Vi). Dependiendo de la tecla presionada
y del voltaje convertido se traduce en el numero BCD de la tecla que
corresponda.

Alfredo Segura enero de 2011, México.
*/

#include <12f675.h>
#define adc = 10
#fuses INTRC_IO, NOMCLR, NOWDT, PUT, NOBROWNOUT, NOCPD, NOPROTECT
#use delay(clock = 4000000)

#use fast_io(a)

#byte Port_A = 0x05

#bit ra0 = 0x05.0  // Entrada Analógica
#bit ra1 = 0x05.1  // D0
#bit ra2 = 0x05.2  // D1
#bit ra3 = 0x05.3
#bit ra4 = 0x05.4  // D2
#bit ra5 = 0x05.5  // D3

#rom 0x03FF = {0x3438 }  // solo poner si se usa el programador USP 3.0

int i = 0, cod1, cod2, dato, comd;

void enviar(comd) {    // comd viene como 0b000001, 0b0000111
  cod1 = comd << 1;    // Recorre una vez para acomodar D0 en D1 y D1 en D2
  cod2 = cod1 << 1;    // Recorre otra vez para acomodar D2 en D4 y D3 en D5
  cod1 = cod1 & 0x0F;  // Protege nibble bajo
  cod2 = cod2 & 0xF0;  // Protege nibble alto
  comd = cod1 | cod2;  // Reúne ambas partes
  Port_A = comd;       // saca dato por el puerto
  delay_us(200);       // lo exhibe un momento
}

void ini(void) {
  setup_adc(adc_clock_internal);
  setup_adc_ports(san0);
  setup_comparator(nc_nc_nc_nc);
  set_tris_A(0b00001001);
  Port_A = 0x00;
  i = 0;
}

void main(void) {
  ini();
  delay_ms(300);  // Retardo de 300 ms al encender el pic

  while (true) {
    dato = read_adc();
    delay_ms(100);

    if ((dato >= 111) && (dato <= 120)) {  // no hay dato
    }

    if ((dato >= 0) && (dato <= 5)) {  // tecla "1"
      comd = 0x01;                     // Tecla "1"
      enviar(comd);                    // envía dato
    }
    if ((dato >= 18) && (dato <= 30)) {  // tecla "2"
      comd = 0x02;                       // Tecla "2"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 36) && (dato <= 49)) {  // tecla "3"
      comd = 0x03;                       // Tecla "3"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 55) && (dato <= 65)) {  // tecla "4"
      comd = 0x04;                       // Tecla "4"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 68) && (dato <= 78)) {  // tecla "5"
      comd = 0x05;                       // Tecla "5"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 80) && (dato <= 89)) {  // tecla "6"
      comd = 0x06;                       // Tecla "6"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 91) && (dato <= 99)) {  // tecla "7"
      comd = 0x07;                       // Tecla "7"
      enviar(comd);                      // envía dato
    }
    if ((dato >= 101) && (dato <= 108)) {  // tecla "8"
      comd = 0x08;                         // Tecla "8"
      enviar(comd);                        // envía dato
    }
  }
}


Se ha elegido un microcontrolador de 8 terminales, con la finalidad de dejar claro que un teclado analógico es muy recomendable para el ahorro de terminales, pudiendo ser destinadas el resto a otras entradas o salidas.

En la siguiente imagen se muestra la tarjeta PCB únicamente del teclado analógico, en el cual se insertarán y soldarán las resistencias de 1 K y los botones, colocando un conector de 3 pines como interface con la tarjeta donde se instale el microcontrolador PIC12F675:




Ing. Alfredo Segura
México, 2011

miércoles, 14 de junio de 2017

Arduino - Analizadores de señal digital - analógico

Página principal

Arduino
Analizadores de señal
digital - analógico
xsetaseta@gmail.com

En un afán de ver soluciones fáciles y baratas para analizar señales tanto digitales como analógicas mediante la placa arduino, he realizado una búsqueda  en internet.
Seguro que hay muchas,  pero estas son la que yo he encontrado a primera vista.

LogicAnalyzer


Señal de 798Hz visto en el programa y en mi osciloscopio .

PROGRAMA
Este programa hecho por Raul Navarro http://raulnd.blogspot.com.es/ funciona solo en Windows bajo plataforma NET v4.
Funciona de dos modos:
-Como un analizador lógico de varios canales.
-Como analizador analógico de un solo canal.
Tiene la posibilidad de medida de tiempos, de esta forma se puede calcular la frecuencia.
Se puede medir mediante el cursor el voltaje en cada parte de la onda.
Para captar  una nueva señal hay que pulsar sobre el icono en forma de rayo.



Arduinoscope



PROGRAMA versión linux
Programa realizado por David Konsumer <david.konsumer@gmail.com> , realizado en java , funciona tanto en Linux como en Windows, y disponemos del código fuente.
Funciona como un analizador continuo de señal analógico señales A0-A5.


Para hacer publicidad propia  mostraré varios programas hechos por mi.

Arduino - Control de 12 salidas y 6 entradas analógicas mediante rs232- Librería SDL

Funciona en Linux y Windows.
Enlace


ARDUINO - OSCILOSCOPIO 66K MUESTRAS

Solo funciona en Linux bajo Gambas (VB)
Enlace


Un saludo.
Juan Galaz