ARM: Temporizadores

Los temporizadores son unos registros internos en la memoria del microcontrolador capaces de realizar retardos de precisión o tareas periódicas, valiéndose de la entrada de reloj para contar el número de veces que le llega un pulso y, tras dividir por el preescaler (para que no vaya demasiado rápido), sumarlo al registro.

Una vez dicho registro se “desborda”, es decir, excede el máximo o mínimo número posible, puede crear una interrupción.

Como conocemos con precisión la frecuencia a la que trabajan y nosotros le asignamos el preescaler, somos capaces de hacer un cálculo del tiempo aproximado que necesita para desbordar.

Un contador funciona de la misma forma, pero utilizando como reloj un pin externo, de forma que podemos contar eventos que ocurren en ése pin.

Además de crear retardos, el timer puede averiguar la frecuencia o periodo de algunos sensores y señales externas como códigos infrarrojos o de radiofrecuencia.

Uno de los pocos problemas de usar timers es que tienen que “hacer cola” a la hora de crear una interrupción por el tema de las prioridades asignadas. Aunque la solución es darles la prioridad máxima cuando sea totalmente necesario.

Entre las ventajas, la CPU no gasta recursos ni tiene que prestar atención a un timer hasta que éste desborda. Los timers tienen funciones listas para arrancar y parar la cuenta cuando sea necesario.

Los ARM Cortex-M tienen un timer principal de 24 bits (systick) y otros 14 de distintas capacidades y frecuencias.

¿Qué es el preescaler? Como he mencionado anteriormente, sirve para ralentizar la cuenta del timer. Si ponemos un preescaler de 2, por ejemplo, al registro del timer sólo se sumará 1 cuando hayan llegado 2 pulsos de reloj. En la tabla anterior podemos ver que llega hasta los 65536 pulsos, por lo que se puede alargar mucho más un sólo registro de timer.

El timer SysTick

Es el temporizador principal y más simple de hacer funcionar, no tiene preescaler. Éste timer, al contrario que los demás, no puede pararse. Sin embargo, sólo es necesaria una función para configurarlo al tiempo que necesitemos.

Por defecto, tiene la prioridad más alta entre las interrupciones.

El valor con el que se debe cargar la función del timer se calcula mediante la fórmula:

Valor_Systick = Systick_Clock (168 MHz) * Tiempo (s)

Teniendo en cuenta que no puede exceder 0xFFFFFF. Las funciones a utilizar son:

  • SysTick_Config(uint16_t Valor_Systick); //Inicializa el contador con el valor, y lo habilita junto a su interrupción
  • NVIC_SetPriority(SysTick_IRQn, Número_prioridad); //Si se desea cambiar la prioridad
  • En stm32f4xx_it.c se crea la función void SysTick_Handler(void) que es la ISR de éste timer

El resto de timers

Éstos ya no son tan simples de configurar, si bien tienen varias ventajas sobre el SysTick. Veamos un ejemplo donde se configura el TIM3 (16 bit, 84 MHz) para hacer una cuenta de 2 segundos, y cada vez que se desborde que cambie el estado de un LED:

Podemos hacer la configuración tanto en el archivo Main como en cualquier otra librería.

void main(){
   //Inicialización de los LED (no voy a dar detalles)
   LED_Init();
   TIM3_Config(); //Configura el timer 3
   TIM_Cmd(TIM3, ENABLE); //Habilita la cuenta e interrupción del timer 3

   while(1); //Se espera al desbordamiento
}

void TIM3_Confif(){
   //En primer lugar se decide el prescaler que se le va a asignar
   //Lo que busco es una frecuencia de reloj de forma que multiplicada
   //por un número menor que 2^16 - 1 de 2 segundos
   //Pongamos por ejemplo 10 KHz:
   //TIM_Pre = (84MHz / 10 KHz) - 1 = 8399
   //TIM_Value = 10 KHz * 2 s = 20000

   TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //La variable correspondiente

   TIM_TimeBaseStructure.TIM_Prescaler = 8399; //Asignamos prescaler
   TIM_TimeBaseStructure.TIM_Period = 20000; //Y el tiempo correspondiente
   TIM_TimeBaseStructure.TIM_ClockDivision = 0; //No divide el reloj del bus
   TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;//La cuenta es hacia arriba

   TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //Se configura
   
   //Estructura de NVIC para la interrupción
   NVIC_InitTypeDef NVIC_InitStructure;

   // Habilitar el reloj del TIM3
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

   //Configuración de la interrupción
   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);

   //Habilitar la interrupción
   TIM_ITConfig(TIM3, TIM_IT_CC1, ENABLE);
} 

Y ahora en el stm32f4xx_it.c:

void TIM3_IRQHandler (void)  {

   if (TIM_GetITStatus(TIM3, TIM_IT_CC1) != RESET)
   {
      TIM_ClearITPendingBit(TIM3, TIM_IT_CC1);
      LED_Toggle(LED4);	
   }	
}

Mando a distancia (IR)

Hace mucho me puse a trabajar en ésto, pero por errores que me daba la librería, la versión del IDE, y tras probar mil veces, lo dejé pasar. Pero ahora he encontrado la forma de que funcione. Vamos a manejar el arduino con un mando a distancia.

Para demostrar cómo funciona (las aplicaciones las dejamos a vuestra imaginación) usaremos unos LEDs.

En primer lugar, es necesario tener la librería. Hay varias, una llamada NECIRrcv (con el protocolo NEC), y otra que es IRremote, al parecer sin ningún tipo de descodificación. Ésta última es la que usaremos, la única que he conseguido que funcione. Podréis descargarla aquí. Tenéis que descomprimirla y pegar la carpeta IRremote en el directorio Program Files (Archivos de programa) / Arduino / libraries. Tras hacer ésto y abrir el Arduino IDE, aparecerá en Ejemplos.

Ahora vamos a proceder a conocer nuestro mando a distancia. Con mi pack de Arduino recibí uno como éstos:

Que venía acompañado por un receptor de IR:

Lo que nos interesa ahora es, cuando pulsamos un botón del mando ¿Qué código envía al receptor? Para ello utilizaremos un simple circuito de 3 cables y un programa que lea lo que recibe y lo envíe mediante puerto Serial al Monitor Serial.

Visto desde ésta perspectiva el receptor, la patilla de la izquierda es la transmisora de datos, la central es GND y la derecha del todo la de alimentación. Dicho con Paint:

receptorir

 

Simplemente hay que hacer  la conexión debida de alimentación (no necesita resistencia) y poner Datos en un pin de arduino que podamos configurar como entrada, en mi caso está en el pin 11.

Ahora cargamos el sketch:

 

#include 
int IRpin = 11
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn(); // Start the receiver
  
}

void loop() 
{
  if (irrecv.decode(&results)) 
    {
      Serial.println(results.value); // Print the Serial 'results.value'
      irrecv.resume();   // Receive the next value
    }  
}

Cuando se cargue el programa, abrís el Monitor Serial y apretáis botones del mando. Veréis que para cada botón corresponde un número diferente, anotadlo. Por ejemplo, mis números son:

 

// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// ON/OFF = 16753245

Otros mandos, como los de Sony, tienen números “más amigables”, del orden de 1000-4000. Ahora que ya tenéis los códigos, sólo es necesario modificar el programa inicial para que lleve a cabo unas acciones, por ejemplo, encender y apagar unos LED:

 

#include 
// 1 = 16724175
// 2 = 16718055
// 3 = 16743045
// - = 16754775
// + = 16748655
// ON/OFF = 16753245
int IRpin = 11, L1 = 3, L2= 4, L3=5;
IRrecv irrecv(IRpin);
decode_results results;

void setup()
{
  Serial.begin(9600);
  pinMode(L1,OUTPUT);
  pinMode(L2,OUTPUT);
  pinMode(L3,OUTPUT);
  irrecv.enableIRIn(); // Start the receiver
  
}

void digitalSwitch(char PIN){
  if(digitalRead(PIN)==1) digitalWrite(PIN,LOW);
  else digitalWrite(PIN,HIGH);
}

void loop() 
{
  if (irrecv.decode(&results)) 
    {
      if(results.value==16724175) digitalSwitch(L1);
      if(results.value==16718055) digitalSwitch(L2);
      if(results.value==16743045) digitalSwitch(L3);
      if(results.value==16748655) i=i+15;
      if(results.value==16753245){
        digitalSwitch(L1);
        digitalSwitch(L2);
        digitalSwitch(L3);
      }
      Serial.println(results.value); // Print the Serial 'results.value'
      irrecv.resume();   // Receive the next value
    }  
}

LED que parpadea 1 transistor

Un LED que parpadea no es gran cosa, de hecho ya sabemos cómo hacerlo con un microcontrolador y, quizás, un 555 sea una buena forma de hacerlo y controlar la frecuencia y el ancho de pulso. También está la forma de hacerlo con 2 transistores y un circuito bastante simple. Sin embargo, lo que hoy vengo a subir es un extraño circuito que con apenas 4 componentes y su debida alimentación consigue hacer parpadear un LED.

Quizás no se pueda controlar la frecuencia debidamente, pero hace su función, que es lo importante.

LED parpadea

 

El transistor a utilizar es un 2N2222, yo usé un BC337 que es lo que tenía cerca y también dió resultado. Por desgracia, el omnipresente BC548 no funcionó. Se puede jugar con distintos valores de tensión, resistencia y valor del condensador, con ésto lograréis diferentes frecuencias. De todas formas, el parpadeo del LED en éste circuito es algo aleatorio, ocurre más cuando le dá la gana que cada cierto tiempo.

Timers

El timer es un reloj de precisión que el PIC contiene, y que crea una interrupción cuando su registro se “desborda” (llega al máximo).

En ésta ocasión usaremos el PIC16f682A, porque contiene un TIMER0 (8 bits) y un TIMER1 (16 bits), que tendrán distintas duraciones.

En primer lugar cabe decir que el TIMER funciona de la siguiente forma: configuramos el registro, cargamos un número, el timer va sumando 1 a ése número según el oscilador y el preescaler que le asignemos, y cuando llega a su límite (256 o 65536), crea una interrupción y el PIC atiende a ésa ISR.

Concretamente, nos vamos a centrar por ahora en usar el TIMER como temporizador, porque también se puede usar como contador de eventos externos (suma 1 cada vez que cambia el estado de un pin). Aunque parezca un poco tonto, vamos a volver a hacer parpadear un LED cada segundo, pero ésta vez será con toda la precisión que pueda darnos un TIMER.

Empezaremos por el TIMER0. Éste se configura y controla desde el registro OPTION_REG (0x81h):

  • T0CS: selección de la fuente del timer (externa para contador, interna para temporizador). Se configura como externa con un 1 y como interna con 0.
  • T0SE: selecciona el flanco de conteo si la fuente es externa.
  • PSA: asigna el preescaler con un 1 al WDT y con 0 al modulo TIMER
  • PS (2 bits): asigna el valor del preescaler según unas tablas que se pueden ver en la datasheet.

También nos interesa el registro del módulo TIMER0, donde cargamos el número y se va sumando, TMR0 (0x01h). Y ya de paso el registro de interrupciones (INTCON, 0x0Bh) del cual usaremos el T0IE (5) y el T0IF(2).

Así pues, nos pondríamos a programar, pero ¿cuál es el valor que tengo que cargar al registro para que me dé el tiempo exacto que yo quiero? Para ello utilizamos una fórmula:

timer0

Pero no seamos optimistas, el tiempo que va a resultar no es en segundos, ya que el máximo que se puede conseguir con el TIMER0 es de 65.53 ms. Así que utilizaremos iteraciones para conseguir 1 segundo. Como habréis supuesto entonces, el valor de tiempo es de tiempo multiplicado por diez elevado a menos tres (tiempo(s)*10^-3 = tiempo(ms)), y el de frecuencia suele ser de 4Mhz por lo que será de 4*10^6. Lo que hacemos es despejar ValorTMR0.

Supongamos entonces que queremos una interrupción cada 50 ms, tendremos que sumar a un entero hasta que llegue a 20 veces, entonces tendremos 1 segundo y llevamos a cabo la acción.

Pero si calculamos el ValorTMR0 para 50ms no es un número entero y por lo tanto ya perdemos precisión. Dicho valor con un oscilador de 4MHz y un prescaler de 256 es 60’6875, así que podemos cargar el valor 61, que en hexadecimal es 0x3D.

Otra cosa que nos fastidia bastante es que no podemos usar el TIMER a la vez que una función delay, porque en el lapso de tiempo que ocurre un delay, el TIMER deja de contar y ése periodo se ha perdido. Ocurre lo mismo si el micro entra en sleep, por lo que hay que hacer un bucle infinito.

Vamos a empezar a programar.

#Include 
#Fuses NOPROTECT,NOWDT,INTRC_IO,PUT,NOLVP,BROWNOUT
//INTRC_IO indica que vamos a usar el oscilador interno del PIC, no un cristal
#use delay(clock=4000000)
#byte trisb=getenv("SFR:TRISB")
#byte portb=0x06
#byte TMR0=0x01
#Byte OPREG=0x81 //mucho ojo con no modificar otras configuraciones
#Bit GIE=0x0B.7
#Bit TMRI=0x0B.5
#Bit TMRF=0x0B.2
#bit led=0x06.0

int i=0; //usaremos ésto para la iteración

void TMR0INTSET(){
TMR0=0x3D; //Cargamos éste valor en el TIMER0 que empieza a contar desde ahí
GIE=1;
TMRI=1; //Pero ahora tiene una interrupción para cuando se desborde
TMRF=0;
}

#INT_TIMER0 //Ésta es la directiva para la interrupción
void tmr0isr(){
i++; //Suma 1 al contador cada 50ms
if(i>=20){ //si has llegado 20 o más veces hasta aquí
  led=!led //cambia el estado del led
  i=0; //y resetea la variable
}
TMR0INTSET(); //Una vez termine la ISR se vuelve a cargar y habilitar
}

void main(){
trisb=0x00; //Todo salidas
led=0; //que se inicie apagado
OPREG=0b00000111; //Reloj interno, prescaler modulo TIMER y con valor 256.
//También podemos usar la función setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256);
TMR0INTSET(); //Cargamos el registro y habilitamos la interrupción
while(1); //Bucle infinito para que no entre en sleep
}

Otras funciones que se pueden usar son:

enable_interrupts(INT_TIMER0); //Para habilitar la interrupción
enable_interrupts(GLOBAL); //Es como poner en 1 GIE
set_TIMER0(Valor); //Carga el registro TIMER0 con ése valor

Con el TIMER1 funciona de la misma forma, se configura en el T1CON (0x10h), se activa su interrupción en el PIE(0x8C), TIMER1IE (0) y su bandera en el PIR(0x0C), TIMER1IF(0). Tiene un bit en T1CON capaz de activar y desactivar éste temporizador, lo cuál le da algo más de posibilidades. La fórmula cambia:

timer1

Pero dado que el TIMER1 tiene dos registros de 8 bits cada uno para cargar el valor, se hace necesario usar la función set_timer1(Valor). Con éste timer, oscilador de 4MHz y prescaler de 8 se puede llegar a un tiempo de 524.288ms, lo cual está muy bien. La otra buena noticia es que para valores pequeños de tiempo casi siempre se encontrarán valores enteros para cargar en el registro, por lo que no hay pérdida de precisión. La función para configurarlo sería por ejemplo:

setup_timer_1(T1_INTERNAL | T1_DIV_BY_8);

Ésta función tiene a bien ponerlo en marcha a la vez.

Dimmer para LED

Mi problema surgió una de las primeras noches de invierno aquí en España, cuando aún son las 6 y media de la tarde y ya es de noche. Con la poca luz que tengo y la poca luz que entra, es imposible estudiar. La solución es lógica: un flexo. Pero no me gusta. Los flexos son caros, duran poco, consumen mucho y ocupan más espacio del que estoy dispuesto a dar.

Mi solución a ésto fue poner provisionalmente un par de tiras de LEDs de gran intensidad, que rondaban por ahí, a 12 voltios en la estantería que cuelga encima de mi mesa de estudio. Pero la palabra lo dice: “gran intensidad”, te vas a hartar a luz, te va a hacer daño a los ojos y aún vas a ver menos. La solución a ésto y a muchos más problemas es usar un dimmer.

Un dimmer no es un regulador de corriente, para éso tenemos los potenciómetros, sino que lo que hacemos con éste es generar un tren de pulsos a frecuencia constante pero ancho de pulso variable, lo que se llama PWM, pulse-width modulation. Es una técnica muy usada para variar la velocidad en motores DC.

Lo que ocurre es que en un extremo del potenciómetro tendremos una salida de 5 voltios en un tiempo muy corto seguida de otra de 0 voltios por un tiempo más extenso. Y al otro lado una salida de 5 voltios por un tiempo muy extenso, casi continuo, seguida de otra de 0 voltios por un tiempo muy muy corto. Lo que hace ésto es que al LED en cuestión le de más o menos tiempo a encenderse y apagarse, de forma que estaremos conmutando a muchísima velocidad y resultará en una variación del brillo para nuestros ojos. Las ventajas de ésto son mejores incluso, pues unos LED de gran intensidad trabajando continuamente se pueden calentar de más, pero con un dimmer se ahorra en potencia y disipación.

Concretamente, éste dimmer que me encontré por ahí funciona con un 555, a 12 voltios, y una frecuencia de unos 150 Hz mínimo, suficiente para que el ojo humano no sea sensible  a los pequeños intervalos donde el LED está apagado.

LED-Dimmer

 

Y según la web donde lo he encontrado (Pesadillo.com) y otras que comentan, éste dimmer es capaz de controlar el brillo de un LED entre el 5 y el 95%.

Cosas que me he cargado (quiero decir, que las he quitado):

– El condensador de 100 nF en la patilla 5. Siempre que lo pongo no funciona el 555, no me preguntéis por qué, así que me cae mal y lo quito.

– El LED a la salida, patilla número 3.

Pero oye, si te has cargado el LED ¿Qué coj**** hemos hecho? Es muy sencillo. Para pruebas el LED es bonito y verificas el funcionamiento genial, pero el 555 no es capaz de entregar una corriente suficiente para mis 2 tiras de LEDs de alto brillo, que rondará cerca de los 0.8 amperios.

Lo que he añadido ha sido un MOSFET de enriquecimiento canal N, que hace las veces de “relé” conmutando, además puede soportar corrientes muy grandes y lo hace fenomenal en ésta aplicación, apenas coge temperatura. El que he puesto yo es el IRF540 por tenerlo más a mano en la tienda, con 22 amperios de Ids máxima, pero hay otros que se ajustan mejor a la Vgs que nos puede proporcionar el 555 y la corriente que se necesita para las tiras de LEDs. La conexión es muy sencilla. He puesto el positivo de las tiras a alimentación, y el negativo al drenador. La salida con una pequeña resistencia (por si acaso, nunca se sabe) directa a puerta, y el surtidor a tierra. Funciona espectacular.

Transistores en saturación: luces intermitentes

Hoy os traigo un circuito de práctica sencillo que se basa en poner en saturación dos transistores alternadamente para encender dos LEDs. Es un bonito sustituto al típico 555, y además da unos tiempos bastante similares en alto y bajo. Ya de paso ponemos a prueba la carga y descarga de los condensadores.

intermitentecontransist

Analicemos el circuito porque es entretenido. Lo que ocurre es que los LED se encienden alternadamente. Los transistores pasan de corte a saturación (lo que llamamos conmutación), también alternadamente. Y todos sabemos, o deberíamos saber, que cuando los condensadores alcanzan la carga máxima, se comportan como circuitos abiertos.

Lo que viene a ocurrir es que un condensador se carga mientras otro se descarga, ésto sucede tan rápido que el transitorio es despreciable. Supongamos que el de la derecha está cargado, comportándose así como un interruptor abierto. En ése caso tendremos el transistor de la izquierda con una resistencia en base de 100K, y en su colector, una resistencia de 1k, suficiente para saturarlo. Mientras tanto, el otro transistor recibe una corriente muy baja (casi nula) en su base, de forma que está en corte, no dejando pasar corriente a través de él. Ésta corriente es desviada por la rama del LED derecho, que se enciende.

Lo mejor de éste circuito es su bajo consumo.

¿Y qué consumo tiene? Resulta que tenemos conocimientos de sobra para analizar el circuito equivalente y sacar conclusiones.

analisis

Como ya he señalado en el esquemático, hay 3 corrientes por calcular. Empezaremos por comprobar que el transistor está en saturación. Supondremos que Vbe=0.7V, B=250 y Vcesat=0.2V. Tomaremos primero la hipótesis de que está en conducción.

En la base hay una resistencia de 100kohm:

Ib = (5 – 0.7)/100 = 43uA

Calculamos la corriente de colector:

Ic = 250 * 43ua = 10.75 mA

Con éste dato calculamos Vce:

5 – 1k*10.75mA – Vce = 0

Vce = -5.75V < Vcesat

Por lo  tanto, el transistor está en saturación y su modelo equivalente es el de una batería de 0.2 V con el positivo en el colector. Recalculamos Ic:

Ic = (5-0.2)/1 = 4.8 mA

Ahora calculamos la rama del LED:

Iled = (5-1.5)/(1+0.22) = 2.858 mA

La corriente total que consume éste circuito es:

I = Iled + Ib + Ic = 7.71 mA

Aquí un vídeo de su (buen) funcionamiento. Se puede ver que lo he alimentado con mi fuente simétrica de 12V, luego un 7805, las 6 resistencias, 2 condensadores, 2 LED y 2 transistores

Diodos

Éste tema es más bien de aplicación práctica, no quiero introducir la teoría porque es  espesa e inútil en su mayoría. La estructura interna de un diodo no nos interesa.

El diodo tal como lo conocemos se conforma de dos semiconductores, uno tipo P y otro tipo N, para nosotros tiene dos partes: ánodo (A) y cátodo (K). El diodo normal conducirá de ánodo a cátodo cuando la tensión Vak sea mayor que la tensión de codo Vd. Ésta tensión la podemos encontrar fácilmente haciendo la resta Vak= Vanodo – Vcatodo.

En esquemáticos de circuitos electrónicos lo encontraremos representado de la siguiente forma:

Y su componente real es tal como se ve. Es decir, no he visto yo componente más parecido a su símbolo. Es un pequeño cilindro en cuyo cátodo (K) tiene un anillo de diferente color. Los hay de varios tipos. Por lo general los de silicio tienen la pinta de un 1n4148 o 1n4007. Dos series muy utilizadas y conocidas como diodos de propósito general. En dicho orden:

Se puede ver perfectamente la banda o anillo que distingue el ánodo del cátodo. Y luego están los diodos de germanio, cuya pinta más común es:

¿Y a qué viene ésta distinción? Bien, los diodos pueden estar mayoritariamente hechos de distintos materiales, los predominantes son de silicio y de germanio. Los de silicio tienen mayor tensión de codo que los de germanio. Ésta diferencia es útil si queremos que la caída de tensión en el circuito sea menor. También hay otros componentes, como en los diodos LED, mayoritariamente arseniuro de galio (GaAs) junto con otros con los que se dopan para cambiar la longitud de onda en la que emiten (color). Su tensión de codo es mucho más alta y va desde 1’2 a 2’2 voltios.

La definición de diodo es: dispositivo semiconductor unidireccional. Es decir, la corriente siempre va de ánodo a cátodo. ¿Qué ocurre si hay más de la que el diodo puede soportar? Se fríe. ¿Qué ocurre si va de cátodo a ánodo? La tensión máxima inversa que puede soportar un diodo varía mucho y viene en las hojas de características. Si se excede dicho valor, hay una avalancha de corriente inversa que fríe el diodo.

Luego tenemos diodos Zener, que están hechos a posta para conducir inversamente cuando la tensión Vka (fijaos que está al revés) tiene o excede determinado valor, que suele venir inscrito en su encapsulado. Su símbolo es:

También hay unos diodos llamados “diodos rápidos” o diodos Schottky, cuya tensión de codo es de entre 0’2 y 0’4 voltios y son capaces de pasar entre estado de conducción y de corte mucho más rápidamente sin problemas. Por supuesto ésta facultad les hace subir en precio y si realmente no lo necesitas, no vale la pena ni rascarse el bolsillo. Y su símbolo es:

Ahora viene una parte más densa: las especificaciones y cálculos.

El diodo común no tiene un funcionamiento completamente lineal, es decir, no pasas de la tensión de codo y empieza a conducir toda la corriente que tengas en el circuito y ya está. Presenta más bien una curva, y cada diodo tiene una curva distinta:

En la imagen se puede ver la curva y los valores de tensión de codo (Vd) y tensión de ruptura (Vr). Muy exagerados, pero efectivamente, entre el 0 y la tensión de codo hay una pequeña conducción y entre el 0 y la tensión de ruptura hay una pequeña conducción que se llama corriente de fuga o corriente inversa. Ésta corriente normalmente es del orden de los nanoamperios, despreciable respecto a los valores que un circuito normal va a mostrar.

¿Y cómo vamos a hacer cálculos con ésta curva? La respuesta es otra pregunta: ¿Quién ha dicho que los vayamos a hacer? Lo que haremos será, siempre y cuando Vak en nuestro circuito supere la tensión Vd, marcar Vak en su eje, y calcular la corriente que pasaría por nuestro circuito si el diodo no existiese, y marcar el valor en el eje de la corriente, normalmente llamado Id, aquí Ia. Trazaremos una recta que una los dos puntos y hallaremos el punto donde corta con la curva del diodo, que es el punto de polarización. Dado ése punto, trazaremos una recta hacia el eje de Id, y con ello hallaremos la corriente que realmente pasa por él. Con ésto nos damos cuenta de que tiene una pequeña resistencia. ¿Pero hasta qué punto podemos hacer ésto? Normalmente, las gráficas de los fabricantes están en intervalos pequeños, y en valores de uso normal la corriente que pasa por el diodo está en un punto en el que la curva es casi una recta vertical, por lo que no se va a poder usar casi nunca. Tomamos modelos.

El modelo más correcto de un diodo sería el de un interruptor abierto o cerrado (según esté en conducción o no), una fuente de tensión igual a la tensión de codo del diodo, con el positivo en el ánodo, y una resistencia. El modelo sencillo es interruptor y fuente, que es el que voy a usar. Voy a analizar el siguiente circuito:

d1

Vin es positiva y la tensión del codo es… No nos importa. ¿Por qué? fijaos, la tensión de cátodo es Vin, y la de ánodo es 0. Vak = 0 – Vin < 0. El diodo no se polariza y por lo tanto no conduce hacia tierra. La tensión Vout es igual a Vin. Otro:

d2

¡Es el mismo pero le he dado la vuelta! En éste caso, la tensión en el ánodo es mayor que en el cátodo y se polariza. La tensión de codo es 0.7V, vamos a sustituirlo por su equivalente:

d3

Si medimos en Vout respecto de tierra, lo que vamos a obtener es 0.7. Es decir, la tensión de codo. Vout = Vd. Otro más:

d4

Va > Vk, conduce. Sustituimos por equivalente. Cálculo: Vout = Vin – Vd. Y esto es todo lo que puede hacer un diodo común. No hay sustos. Otro tema es que esté acompañado.

El zener se comporta igual con la excepción del tema de la región inversa. En vez de una tensión de ruptura, en su curva se marca la tensión de zener. Voy a hacer un, y sólo un, ejercicio sobre éste, que quisiera que intentéis hacer antes de leer la respuesta. Calcular la corriente que circula por R2 dado el siguiente circuito, la tensión de zener es 8.2V y Vin son 12V.

d5

¿Y bien? La solución es simple: las resistencias conforman un divisor de tensión, la tensión en el cátodo es de 6 voltios, no se supera la tensión de zener y no polariza como tal. La corriente es la misma en R1 que en R2, igualito que si no existiera la rama del diodo ¿Os he pillado? Si Vin fuera 20 voltios el tema ya cambia, el diodo “se traga” una parte de corriente, por lo que si medimos la tensión en el cátodo, siempre será de 8.2V.

Parece brillante y sencillo pero los diodos, más bien la gente que los utiliza, esconden maldad en sí. Es la rectificación. Si tomamos Vin como senoidal alterna en el tercer ejemplo, obtendremos sólo la parte positiva de la señal, menos (en nuestra cruda realidad) un pedacito que corresponde a la tensión de codo. Es el rectificador de media onda:

En ésta aplicación el diodo soporta toda la corriente inversa que le viene. Dato a tener en cuenta. Luego podemos hacer una combinación de los ejemplos 1 y 2, poniendo 2 diodos en antiparalelo. Es decir, uno con el cátodo al circuito y el ánodo a tierra, y el otro al revés. En distintas ramas, o no, depende del diodo. Es lo que llamamos un recortador de onda y es más útil hacerlo con zener o LED. Y obtenemos ésto:

Es igualito a una señal salida de un operacional saturado.

La maldad continuaría con la conjunción de fuentes en distintas posiciones y orientaciones. Otra aplicación es con 4 diodos, para hacer un rectificador de onda completa. Es tal que:

Como se ve, durante el semiciclo positivo de la onda conducirán 2 diodos de tal forma que en la carga veremos una tensión positiva, y durante el semiciclo negativo conducen los otros 2 diodos de tal forma que en la carga veremos una tensión positiva ¡Otra vez! Aquí la corriente inversa que soporta cada diodo es de la mitad de la total. Obtenemos la onda:

Y ésto es lo que hacemos para obtener una corriente continua con un transformador de alterna. Pero la corriente continua no tiene picos y bajadas. Añadamos un zener al circuito de carga. ¡Ups! Ahora hay llanos en vez de picos, pero los picos bajos siguen estando. Lo que hacemos es añadir un condensador de tal forma que eliminamos los picos bajos, quedando sólo los picos altos y ligeras pendientes entre ellos. El zener se añade luego, con una tensión de zener menor a la mínima de las pendientes. Con ésto obtenemos una corriente completamente contínua. Por cierto, si tenemos un transformador de dos secundarios podemos hacer lo siguiente, y ya de paso os enseño la señal tras un condensador:

Lo siguiente son los transitores…

Puerto digital Arduino

Ahora ya sabemos que podemos utilizar los pines 2 a 13 como puerto digital. El inconveniente es que *de momento*, tendremos que declarar los pines uno a uno. ¿Os acordáis del LED que parpadea para indicar que la placa está bien nada más llegar a casa? Pues es un programa genial para explicar la estructura general y varias instrucciones:

Cabe destacar que éste programa es de dominio público y se encuentra, junto a muchos más programas de ejemplo, en la web de Arduino y en nuestro software.

La estructura es la siguiente: declaración de variables, setup y loop. En la declaración de variables indicamos al programa que usaremos un tipo de variable con un nombre concreto durante todo el programa. En setup ponemos las cosas que sólo se ejecutarán una vez, por ejemplo la configuración de pines.

La configuración de pines es muy sencilla, sólo tienes 2 opciones:

pinMode(númerodepin,OUTPUT), para salida

pinMode(númerodepin,INPUT), para entrada

Observad que en éste programa se ha declarado “led” asignandole el numero 13 y luego hemos usado “led” como “número de pin”, así se hace más sencillo recordar qué tienes en cada pin. Recordemos que en el pin 13 no puede haber INPUT porque hay un LED que actúa como diodo unidireccional, sólo salida.

Una vez hemos configurado nuestro dispositivo pasamos a la parte del programa que se va a repetir infinitas veces si lo dejamos conectado: el loop. Sencillamente programamos aquí lo que queremos que haga. Es simple como programar en C pero con varias instrucciones. No sirve de nada ponerle a la variable 1 o 0 porque no lo entiende.

Para escribir un 1 o un 0 en un pin, tenemos que usar las instrucciones:

digitalWrite(númerodepin,HIGH) si queremos ponerlo en estado alto (1)

digitalWrite(númerodepin,LOW) si queremos ponerlo en estado bajo (0)

Para indicar al programa que se tiene que esperar un tiempo x, en milisegundos, escribimos la función delay(x).

Recordemos que al pasar a la práctica, cualquier dispositivo LED que pongamos a una salida deberá llevar una resistencia acorde a la tensión de salida y a la corriente máxima. Lo mismo haremos en una entrada, para limitar la corriente que pasa por ella y dirigirla a HIGH o LOW como convenga, sin cortocircuitar la placa.

Para comprobar el estado de una entrada utilizaremos la función:

var = digitalRead(númerodepin)

La función digitalRead devolverá un 1 o un 0 dependiendo de si el pin está en estado alto o bajo, respectivamente. Para que un pin esté en estado bajo deberá estar conectado a GND, no servirá si dejamos el cable suelto. Después haremos la acción que queramos con un if(var==1) o if(var==0) según convenga.

Ésto es lo básico y os animo a que entrenéis un poco el tema. Una buena práctica es hacer las luces del coche fantásitico. Ésto se basa en poner 8 LED que se encienden y apagan individualmente. En vez de escribir 2000 líneas de código, podéis utilizar un for o un while. Más tarde podéis implementar un botón para que se ejecute ésa acción u otra cualquiera al estar cerrado o abiero. Mucha atención de poner resistencias mínimo 220 ohms a las salidas.

Cualquier duda es bien recibida en comentarios y será resuelta o por lo menos se intentará.

Starter Kit de Arduino

Como vamos a hacer un cursillo de introducción a lo “básico” de Arduino, necesitábamos un kit o por lo menos tener las piezas en casa. Los organizadores pedían 25 euros por el cursillo pero por unos 35 más te traen éste:

http://www.aliexpress.com/snapshot/260781748.html

Ahora mismo su precio se sitúa por los 39’90 US$ (aprox. 30€) por pack, envío gratis como suele ocurrir con éstas páginas chinorris que, si bien el producto es bueno, el tiempo de llegada puede ser desesperante (20 a 40 días). Incluye:

  • Placa Arduino Uno Rev. 3
  • Mini placa de pruebas con base
  • Placa de pruebas de 830 puntos
  • Caja para componentes
  • 15 LEDs rojos, amarillos y verdes (5 de cada)
  • 2 Buzzers (uno pasivo)
  • 4 interruptores
  • 2 dígitos LED
  • 2 interruptores de vuelco “tilt switch”
  • 3 fotoresistores
  • 1 potenciometro
  • 1 sensor de llamas
  • 1 receptor infrarrojo
  • Resistencias de 220, 1K y 10K (5 de cada)
  • Sensor de temperatura LM35
  • 1 cable USB
  • 30 cables jumper
  • 1 porta pilas de 9V
  • 1 control remoto infrarrojo
  • Pantalla LCD 1602
  • 1 servomotor 9G
  • 1 motor paso a paso 5V + placa driver ULN2003
  • 1 74HC595 (shift register, para manejar matriz de LEDs)
  • 1 Matriz de LEDs 8×8

Como se ve, vale la pena y esperamos que el producto sea de gran calidad como ha llegado en otras ocasiones. Ellos se ocuparán de testearlo antes de dar el cursillo, que empezará, si no hay retrasos en el envío, el 28 de septiembre.

En todo caso para más info y mis agradecimientos a MakersVLC.

Habrán más ediciones si ésta resulta buena.

 

Fuente de alimentación ATX

Atención: la fuente de alimentación trabaja a tensión de línea e incluso más, pudiendo alcanzar los 350 voltios en su interior, trabajar siempre con precaución y protección, la fuente siempre desconectada y los condensadores descargados. Riesgo de muerte.

Éste es un tema muy visto, pero es posible que la forma más barata y sencilla de obtener una fuente “de laboratorio” sea modificando una vieja fuente de ordenador, que rondan los 20-30 euros y si son viejas, ya no se usan. Así que quería postear aquí mi progreso, que es lento,  ya que el estudio y la vida no me dejan avanzar.

La fuente de alimentación va a tener las siguientes características:

– Fuente fija 5V, 16A

– Fuente fija 9V, 1A

-Fuente fija 12V, 8A

-Fuente variable 1.2-12V, 1.5 A

– Dejaré el ventilador activo para evitar sobrecalentamientos

– LED indicador de encendido

Para ello necesitaré:

– Fuente de ordenador ATX vieja

– LM7809, regulador voltaje a 9V, 1A

-LM317, regulador voltaje variable, 1.2 – 35V, 1.5A

-LED cualquiera, reutilizado, o ya comprados.

– Potenciómetro 5K

– 4 condensadores 0.1 pF

– Un par de resistencias de 220 o 240 ohmnios

– 5 o 6 conectores hembra, a ser posible banana perforada

– Placa de silicio perforada, soldador y estaño

El primer paso fue abrir la fuente de alimentación e identificar cada uno de los cables y algunos componentes. No tengo pensado modificar ningún parámetro de la fuente, pero hay que saber donde están los condensadores principales (son unos enormes) para descargarlos y poder tocar la fuente con seguridad cuando se trabaje en los últimos detalles.

atx

Pude ver que hay cables de muchos colores: amarillo, amarillo con negro, rojo, naranja, blanco, violeta, marrón, verde, gris y negro.

Cada uno cumple su función:

– Amarillo: 12V

– Amarillo con negro: 12V con mayor corriente

– Rojo: 5V

– Naranja: 3.3V

– Blanco: -12V, éste no lo usaré en ésta ocasión.

– Verde: conectado a tierra permite la activación de la fuente

– Marrón: en algunas fuentes, como la mía, hay que conectarlo a 3.3V para que arranque

– Violeta y gris: son los de comprobación, envian 1 o 0 alternadamente según la fuente está trabajando o no, así que los aprovecharemos para el LED indicador.

– Negro: común

cables

Lo del cable marrón lo descubrí tras montar el 7809 en la placa de pruebas y ver que aquello no arrancaba. Fue curioso que cuando lo conseguí, el cable morado quedó suelto, tocó un disipador y saltaron unas chispas de miedo ¡Mucho cuidado!

19/4/2013

Monté el 7809 en la placa de silicio perforada junto con sus correspondientes 2 condensadores de 0.1 pF que recomienda el fabricante en la datasheet, intentando ocupar el mínimo espacio posible y estañar bien los cables y conexiones, lo cual es casi imposible con el material del que dispongo. Sin duda tengo que cambiar la punta del soldador y el rollo de estaño, que está negruzco, además de que es con cobre cuando para electrónica se utiliza estaño con plomo. Comprobé con el MD la continuidad y desde todos los puntos de los cables, parecía dar buen resultado.

Trato de ocupar el menor espacio que pueda, porque teniendo en cuenta que la placa va dentro de la fuente, y que el ventilador va a estar girando, no queda mucho hueco para plantar todo el tema ahí, si encima contamos con los demás componentes externos, apaga y vámonos.

Todavía no tengo el resto del material, no tengo dinero ni tiempo.

26/4/2013

He decidido que la circuitería y demás no cabe en la caja en la que viene la fuente y que habrá que crear una nueva, un poco más grande, y que cambiaré el ventilador por otro más pequeño. Tendré más espacio y posiblemente una fuente más segura y personalizada.

4/5/2013

Ya tengo lo que me faltaba, unos bornes, caros pero sus 2 euros y medio por unidad valen la pena, y el LM317. Mi padre me ha traído un cable largo que me viene genial para colocar en cualquier sitio.

He hecho las conexiones de los cables verde y marrón dentro de la FA y los he dejado como he podido. El resto siguen por ahí desperdigados, por lo menos la fuente arranca y da voltajes correctos. He probado el regulador y sólo me da un máximo de 8 voltios, pero vamos, para lo que lo voy a utilizar, no va a ser muy necesario. La idea es que ya desecharé ésta fuente cuando me pueda hacer otra mejor y reutilizaré los circuitos.

Ya puestos he hecho el circuito sensor de oscuridad y he descubierto que uno de los potenciómetros que tengo no funcionan. Vaya chasco. Además, he necesitado una resistencia de 100KOhms para que funcionase con la luz de casa.

Con los cables de +12 y – 12 voltios de la fuente se pueden hacer 24, sí, pero nadie suele mencionar que éso limita la corriente a 0.5 A máximo. Además de sólo puedo utilizar 17 con el regulador.

Está dando de sí la fuente, dentro de poco ya tendré mi laboratorio, soldador nuevo y todo.

10/5/2013

Ya tengo soldador nuevo y he terminado con los reguladores, he cambiado un par de cosas y ha quedado así:

fuente

Como veis he añadido conectores ¡Qué gran invento! Son fáciles de soldar, discretos y quedan bonito, además de que sólo hay que atornillar los cables y listo. Hay 2 de 3 puntos para salidas y entradas de corriente, incluido el común, y uno de 2 para el potenciómetro que va en el panel. Creo yo que con ésto cumplo mis expectativas de espacio reducido.