Вы находитесь на странице: 1из 142

Aprende a diseñar tu propio PLC.

Se prohíbe la reproducción total o parcial de


este libro sea cual fuere el medio, electrónico o
mecánico sin el consentimiento del autor.

Autor:
Carlos Alan González Cortéz
Primera edición.
05/12/18
Monterrey, Nuevo León, México.
DEMOSTRACION
Temario
Entradas digitales de baja velocidad……10

Entradas digitales de alta velocidad…30

Entradas de AC…39

Entradas analógicas…

Salidas electromecánicas…63

Salidas de estado solido…75

Salidas PWM…81

Salidas analógicas…88

Expansiones I/O…107

Expansion ADC…117

Expansion PWM…120

Expansion RTC…127

Expansion EEPROM…130

Implementación de comunicación I2C a distancia…133

Comunicación serial UART y RS232…137

Puerto USB…146

Diseño de alimentación…153

Consideraciones generales de diseño…167

Selección e implementación de microcontrolador…176

Diseño final de PLC y expansión…349


Introducción
Los microcontroladores son dispositivos increíbles que han
facilitado, entre muchas cosas, los proyectos de automatización.

Nos han permitido crear sistemas para todo tipo de necesidades.

Pero, a pesar de que son dispositivos increíbles, sufren de varios


problemas.

Son sensibles al ruido eléctrico, no soportan voltajes mayores al


nivel TTL, necesitan una alimentación muy estable, tienen un
enorme límite de corriente de salida, etc.

Es por esto que NO podemos meterlos a un ambiente para


automatización y esperar que no existan problemas.

Posteriormente, al implementar entradas y salidas, comenzamos


a notar problemas que muy posiblemente no tengamos ni idea
de que son.

Y esto es, por que diseñar un sistema de automatización que


pueda lidiar con diversos problemas, especialmente en un
ambiente industrial, no es sencillo.

El objetivo de este libro es que aprendas los parámetros


necesarios para diseñar un sistema de automatización o un PLC.

Pero para ser más específicos ¿Qué vas a aprender realmente en


este libro?
Lo que si vas a aprender:

Vas a aprender todas las consideraciones, cálculos y


requerimientos necesarios para poder implementar entradas
digitales, analógicas, salidas digitales, analógicas, etc.

Vas a aprender la importancia del aislamiento, sus consecuencias


de no hacerlo apropiadamente, los pasos a seguir, etc.

Vas a aprender las consideraciones generales para la


implementación de ciertos tipos de salidas.

Vas a aprender consideraciones generales al momento de la


implementación de alimentación y etapas de regulación.

Vas a aprender a implementar correctamente


microcontroladores (En cuestión de alimentación, desacoplo,
selección de I/O, etc).

Vas a aprender de manera superficial sobre programación en C


para poder usar el microcontrolador en cuestión junto con los
periféricos de la expansión.
Que NO vas a aprender:

A pesar de que en este libro vas a aprender las consideraciones


generales al momento del diseño de PCB, este NO es un curso de
diseño de PCB’s con “X” software.

Vas a aprender de manera superficial sobre programación de


microcontroladores PIC, pero este NO es un curso de
programación de microcontroladores, por lo que para dominar
estos micros, deberás profundizarte más en el tema.

No vas a aprender sobre lenguaje ladder, ya que en este libro se


enfoca la implementación de microcontroladores en un
ambiente de automatización.

Este libro NO es un curso de electrónica básica, para poder


comprender en mayor parte el libro debes tener conocimientos
previos de electrónica básica e intermedia.

En caso de no tener estos conocimientos, puedes adquirir mis


libros previos “Aprende electrónica”, “La guía maestra de los
amplificadores operacionales” y “La guía maestra de las
resistencias, capacitores e inductores” en los cuales se tocan
todos los temas teóricos contenidos en este libro.
¿Por qué diseñar nuestro propio PLC?

Uno puede hacerse la cuestión anterior. ¿De qué sirve diseñar un


plc cuando podemos adquirir uno ya hecho y certificado?

La cuestión anterior tiene total valides, puede sonar poco


práctico el tener que hacer un plc desde cero, cuando bien
podríamos simplemente comprar uno, pero este no siempre es el
caso.

Por contrario de lo que podríamos pensar, diseñar y hacer


nuestro propio PLC nos brinda una serie de ventajas que no
podríamos considerar a primera vista, pero que al pensarlo bien,
tienen mucho sentido, veamos por qué en los siguientes puntos.

1.- Precio
Aunque hacer nuestro propio PLC no es lo más barato del
mundo, existen ocasiones donde podemos ahorrar mucho
dinero, esto se va amplificando en función a la cantidad de
entradas, salidas o periféricos que necesitemos.

Un plc de propósito general de pocas dimensiones puede vencer


en cuestión de precio a un plc hecho por nosotros, pero cuando
la cantidad de entradas/salidas aumenta, requerimos otros
periféricos, etc. Es donde la diferencia de precio se torna a
nuestro favor.
2.- Flexibilidad
Como mencionamos anteriormente, diseñar nuestro propio PLC
solo se convierte en una ventaja enorme cuando tenemos que
cumplir con requerimientos complejos. Cuando necesitamos una
gran cantidad de puertos ADC, salidas PWM, salidas analógicas,
etc.

Obtener esto mediante un PLC de fábrica, va a requerir de


muchas expansiones, lo cual puede incrementar duramente el
precio total.

Al hacer nuestro propio PLC, lo que hacemos es diseñar el PLC


justo a nuestras necesidades, ya que no será para propósito
general si no para una aplicación personalizada.

Esto es algo muy importante a considerar.

3.- Aprendizaje
Dejando a un lado el punto comercial, un PLC es un excelente
proyecto para las personas que se adentran en el diseño en
ingeniería electrónica.

Son demasiados factores que debemos de considerar al diseñar


un PLC, que el proceso de diseño se convierte en una
oportunidad grande de aprendizaje.
Sección de hardware
Vamos a comenzar con la sección de diseño.

En esta sección vamos a aprender todo lo relacionado con el


diseño de entradas y salidas, junto con la expansión de
periféricos para nuestro PLC.

Cabe recalcar que todas las consideraciones para el diseño están


basadas bajo “condiciones generales”.

Por condiciones generales, nos referimos a condiciones que NO


sobrepasen los límites de operación de los componentes.

Como pueden ser:

-Voltaje máximo de operación.

-Corriente máxima de operación.

-Potencia máxima de operación.

-Temperatura máxima de operación.

Todo diseño debe hacer acorde al ambiente donde se vaya a


implementar.

De lo contrario, vamos a toparnos con demasiados problemas.

Es por esto que si tu aplicación es especial, por ejemplo con


voltajes muy altos o temperaturas muy altas, debes consultar el
datasheet de los componentes y verificar si el o los componentes
pueden soportar esas características de trabajo o si debes hacer
modificaciones.
Diseño de entradas digitales de baja
velocidad

El diseño de entradas digitales puede parecer sencillo… pero no


lo es precisamente.

Existen diversos factores que debemos de tener en cuenta o de


lo contrario tendríamos una serie de enormes problemas.

¿Qué problemas te preguntas? Veamos.

Problema#1: Ruido eléctrico y riesgo eléctrico.

Supone que tenemos el siguiente escenario, tenemos nuestro


microcontrolador funcionando, su función es la de controlar el
arranque y paro con timer de diversos motores de 220VAC.
Debido a la gran carga inductiva, estos producen una serie de
ruido en la línea y por este motivo pueden ser un problema.

Si tenemos la necesidad de añadir 2 botones manuales de


arranque y paro, lo sencillo seria usar un puente rectificador y un
diodo zener de 5V para poder conectarlo a las entradas del
microcontrolador.

Continuación en version completa…


Diseño de entradas para DC

Lo primero que debemos hacer al iniciar, es conocer el rango de


voltajes de entrada que tendremos.

Usualmente en corriente directa, podemos tener voltajes tan


bajos como 3.3V hasta 24V. Pero, los más comunes siendo 12V y
24V.

Este es un factor muy importante, pues a partir de aquí vamos a


calcular la corriente que necesitamos para el foto diodo.

Debido a que nuestra aplicación es solamente transferir una


señal digital (0 y 1) no necesitamos de una ganancia relevante en
el foto transistor.

Si queremos un máximo de 10mA en el fotodiodo y vamos a


trabajar con un voltaje mínimo de 12V y uno máximo de 24V,
entonces hacemos el cálculo de la resistencia a partir del valor
máximo.

Entonces, con la ley de ohm obtenemos:


𝑉 24𝑉
Ω= = = 2400Ω
𝐼 0.010𝐴

Ya tenemos entonces el valor de la resistencia de entrada.


Ya que tenemos la resistencia de entrada, ahora toca el valor de
resistencia de polarización.

La resistencia de polarización, es una resistencia necesaria en


electrónica digital para tener como 0 la entrada.

Si no colocamos esta resistencia, tendremos la entrada flotando


y tendremos toda clase de errores en el funcionamiento.

La selección del valor es sumamente sencilla, puede ser un valor


de entre 5KΩ a 100kΩ. ¿Pero porque este rango?

Valores muy cortos consumirían mucha corriente, valores muy


altos generan tiempos de respuesta más lentos debido al efecto
RC.

En mi opinión, el valor optimo es de 10K, de esta manera


tenemos un balance entre consumo y velocidad de respuesta.

Entonces, colocamos la resistencia en el emisor del foto


transistor y este nodo a la entrada del microcontrolador.
Ya tenemos los valores que necesitamos… pero falta algo muy
importante. ¡Aún no seleccionamos el optoaislador!

Seleccionar un optoaislador no es una tarea tan sencilla como


parece. Pero como en este caso nuestra aplicación será para
entradas digitales únicamente, los optoaisladores de propósito
general funcionan bien.

¿Pero cuál usar?

Debido a que los optoaisladores de propósito general comparten


muchas características, el punto más relevante para nuestra
selección es el siguiente: El espacio que requiere en nuestra PCB.

Un optoaislador como el 4n25, el cual es through hole, es fácil de


conseguir, barato, pero ocupa demasiado espacio y solo contiene
un optoaislador dentro del encapsulado.
En su lugar, podemos usar un optoaislador SMD (Montaje
superficial) el cual tiene dimensiones más reducidas, montarlo es
más rápido e inclusive cuenta con 4 optoaisladores en un mismo
encapsulado, una maravilla para nosotros.

En esta ocasión, usaremos el TL291-4, fabricado por Toshiba.

Aunque podríamos pensar en cierta ocasión que el 4n25 es


mejor opción debido a que es through hole, esto solo es cierto
cuando realizamos nuestro PCB en una placa perf board, de
prototipo o una PCB casera en la cual es muy complicado montar
componentes SMD.

Pero, esto es todo lo contrario al fabricar nuestra PCB de manera


profesional. Los componentes SMD son más sencillos y rápidos
de soldar, más baratos, más pequeños, etc. Por lo que para toda
aplicación comercial o de múltiples unidades, opta por
encapsulados SMD.
Consideraciones y precauciones al usar un
optoaislador
Existen diversas precauciones que debemos tomar al usar un
optoaislador, al igual que ciertas recomendaciones de aplicación
para evitar cualquier problema.

1.- Los optoaisladores NO son dispositivos de potencia: Uno de


los problemas más comunes con optoaisladores es que se
queman. ¿Y porque se queman? Por exceso de corriente o
potencia.

Dado que los optoaisladores son dispositivos de baja potencia


(Menos de 500mW) es muy sencillo dañarlos al quemar el
fotodiodo o el fototransistor interno.

Es por esto que debemos tener extrema precaución en nuestros


cálculos y no solo eso, si no también dejar un margen de por lo
menos 30% para situaciones no deseadas.

2.- La mayoría de optoaisladores NO son aptos para altas


frecuencias: Debido a las altas capacitancias de entrada y de
salida, los optoaisladores de propósito general no son aptos para
altas frecuencias. Debido a que usualmente tienen tiempos de
bajada y subida de 3uS, no es la mejor opción para nosotros.

Existen optoaisladores especiales para estas aplicaciones y esto


lo veremos en diseño de entradas de alta velocidad.
3.- Los optoaisladores NO son amplificadores de voltaje: Los
optoaisladores pueden entregar un voltaje menor al de su
entrada, pero no mayor.

Veamos estos dos casos:

El primero es una señal de entrada de 24V y un voltaje de


colector de 5V.

Nuestra señal de salida, en el emisor, será de 5V, dado que este


es el voltaje de nuestro colector.

Pero ahora, con el siguiente caso, con una señal entrante de 5V y


un voltaje de colector de 24V.

Aquí nuestra señal de salida será de 5V, esto es algo que


debemos de tener a enorme consideración.
4.- Cuidado con la polarización inversa: Debemos de tener
mucha precaución con la polarización inversa en los
optoaisladores.

Fácilmente podemos dañar un optoaislador si no polarizamos


correctamente el foto diodo interno, por lo que debemos
fijarnos muy bien. Podemos añadir un diodo en serie para
proteger la entrada, o podemos usar optoaisladores con acoplo
AC.

Como podemos ver en la imagen, tenemos la polarización


correcta del diodo.

“A” representa el ánodo y corresponde al polo positivo del


diodo.

“K” representa el cátodo y corresponde al polo negativo del


diodo.

Como dijimos, NUNCA polarices inversamente porque vas a


terminar dañando el optoaislador. Añadir un diodo en serie
protege totalmente al optoaislador:
5.- Añadir aislamiento físico: Una práctica importante en el
diseño es añadir aislamiento físico al colocar nuestro
optoaislador.

Esto se consigue haciendo un slot o corte debajo, que haga un


aislamiento físico total entre ambas secciones del optoaislador
(fotodiodo y fototransistor).

Continuación en versión completa…


Diseño de entradas analógicas
Las entradas digitales son especiales para eventos donde solo
tenemos 2 estados, encendido y apagado o 0 y 1.

Esto sucede, por ejemplo, en switches, relevadores, limit switch,


etc.

Pero, no todo en esta vida es digital…

Existen dispositivos o situaciones, cuyo valor puede variar


infinitamente entre valores, lo cual es el caso en una señal
analógica.

Las señales analógicas, como mencionamos, pueden adquirir una


serie de valores en función al parámetro del dispositivo.

Ya sea un sensor de temperatura, humedad, un potenciómetro,


etc.
Entonces, en caso de que necesitáramos medir la temperatura
utilizando el sensor, no podríamos. O viceversa.

Es por esto que existen las entradas analógicas.

Las entradas analógicas nos permiten hacer mediciones de


señales analógicas y de esta manera implementar estas
funciones en nuestro software.

En este apartado no hablaremos de cómo funcionan los puertos


conversores analógicos a digitales, ya que de eso hablaremos en
el apartado correspondiente

Aquí hablaremos de cómo implementar el diseño para aislar las


señales analógicas y poder hacer la lectura mediante nuestro
microcontrolador.

Pero, antes de todo esto, debemos de conocer un concepto


importantísimo en la electrónica y más en concreto, en la
amplificación y adquisición de señales.

El término: Impedancia de entrada.

La impedancia de entrada, o resistencia de entrada, se refiere


efectivamente a la resistencia que existe en la entrada del
sistema que va a adquirir la señal.

¿Por qué es importante conocer esto?

Como sabemos, por ley de ohm, entre menor sea la resistencia,


mayor será la corriente consumida.

Y, entre más corriente se consume, más cae el voltaje.


Si nuestro sistema de medición, al momento de medir causara
una perturbación tal que el voltaje de la señal cae, sería un
desastre.

Esto porque nuestro sistema NO debe de causar ninguna


perturbación en la señal.

Es por esto que los multímetros y osciloscopios, entre otros


dispositivos de medición, cuentan con lo que se le llama “Alta
impedancia de entrada”

Esto se refiere a que la resistencia de entrada es tan elevada, que


la corriente que consume del circuito a medir es tan baja que no
causa perturbaciones.

Es por esto que todo sistema de medición debe contar con esta
característica tan importante.

Bien, ya que sabemos que significa este término ¿Qué tiene que
ver con nuestro diseño?

Recuerda que los optoaisladores necesitan de una corriente


“algo elevada” para poder activarse por completo.

Esta corriente, de entre 10mA a 30mA es totalmente necesaria


para poder que el optoaislador opere bien.

Entonces ¿Qué sucedería en el siguiente caso?


Si tenemos, por ejemplo, un LM35 cuya corriente de salida es
bajísima y lo conectamos directamente a nuestra entrada, cuya
impedancia de entrada no es menor a 1K.

En este caso no pasará nada, no habrá lectura ni tendremos


sensor funcionando.

Esto es precisamente por la impedancia de entrada tan baja que


tenemos.

Aquí es donde entran los buffers.

Para no tener que lidiar con este problema, implementamos los


buffers.

Los buffers, como ya hemos visto, son amplificadores


operacionales en función de amplificación de corriente. Ya que la
ganancia es 1.
La corriente que consume un amplificador operacional es
bajísima.

Esta corriente, que en este caso por ejemplo es de 10nA, es tan


baja que se le considera como impedancia de entrada alta.

Ya que no va a causar ninguna perturbación en el circuito que


vayamos a medir.

Por lo tanto, debemos emplear un buffer. Este buffer va a tomar


la señal de entrada y dará la misma señal de salida, pero ahora
con una capacidad de corriente de salida muy superior.

De esta manera no perturbamos en lo absoluto la señal de


entrada y al mismo tiempo seremos capaces de manejar el
optoaislador.

Pero, como de costumbre, las cosas no son tan sencillas.

Existen diversos detalles que debemos de tratar antes de


implementar nuestro buffer.

El primero es, que el voltaje de alimentación de nuestro opamp


NO debe ser el mismo que el del resto del PLC, este voltaje de
alimentación debe provenir de la misma alimentación que recibe
el sensor o sistema en cuestión.

¿Por qué debe ser así?

Porque de lo contrario, no tendríamos un aislamiento real. Ya


que si alimentáramos el amplificador operacional desde nuestra
regulación interna, tendríamos que unir el GND interno con el
GND externo y dejaríamos de tener aislamiento.

Entonces, debemos de tener la alimentación externa.

Pero, existe otro detalle.

Los amplificadores operacionales son MUY delicados.

Son delicados con la corriente de salida, son delicados con el


voltaje de alimentación… Y son más delicados aún con la
POLARIDAD.

Si por algún motivo llegamos a equivocarnos y colocamos la


alimentación de manera inversa, podemos despedirnos del
amplificador.

Y el error de polaridad inversa en la alimentación pasa tan


seguido que no vale la pena recordarlo.

¿Qué podemos hacer en este caso entonces?

Lo que debemos hacer es implementar una protección con un


diodo en VCC.
En este caso, usaremos un diodo schottky para tener la menor
caída de voltaje posible.

¿Qué función cumple el diodo?

Para que el voltaje de entrada llegue al opamp, debe estar en


polaridad correcta.

Si conectamos la polaridad de manera inversa, lo que sucederá


es que el diodo no se activará, por lo tanto no existirá un flujo de
corriente y nuestro opamp estará a salvo de todo problema.

Esta protección es demasiado necesaria ya que problemas como


este pueden aniquilar rápidamente al amplificador.

Tanto en este diseño como en otros, debemos de pensar en


todos los problemas que se pueden presentar, para que de esta
manera podamos prevenirlos directamente en la etapa de
diseño.

El segundo aspecto a tener en cuenta es el filtrado de


alimentación.

El filtrado de la alimentación es muy importante, ya que si


tenemos la alimentación con demasiado ruido, la salida tendrá
igual mucho ruido.
Esto obviamente va a afectar en la precisión de nuestra lectura y
por lo tanto tendremos una serie de problemas de
funcionamiento.

Existen dos maneras de combatir y atenuar este ruido.

La primera es añadiendo un buen filtrado capacitivo en las


entradas de alimentación del opamp.

En este caso, debemos colocar un filtro “grande” para atenuar la


baja frecuencia y el voltaje de rizo, por ejemplo un capacitor de
10uF a 25V.

Y posteriormente necesitamos implementar un capacitor


pequeño para atenuar la componente de alta frecuencia. En este
caso un capacitor de 100nF.

Ambos capacitores deben colocarse lo más cerca posible del


amplificador operacional, esto para poder tener la mayor
efectividad posible.

También, debemos colocarlos posteriormente al diodo de


protección.

Por lo que tendríamos la etapa de buffer de la siguiente manera:


De esta manera, pasamos de esto:

A esto:

Bien, ya que tenemos esto, podemos comenzar a diseñar la parte


de entrada completa.

Posterior al buffer, vamos a implementar nuestro optoaislador.

En este caso, dado que tendremos un voltaje de salida máximo


de 5V, y la corriente máxima de entrada del optoaislador será de
30mA, entonces el valor de la resistencia será de:
𝑉 5𝑉
𝑅= = = 160Ω
𝐼 0.03𝐴
Y, ahora solo falta añadir otro buffer en la salida de nuestro
amplificador operacional y ya tenemos nuestro aislamiento
analógico.
Ya tenemos nuestro aislamiento analógico… bueno, no tan
rápido.

Nuestro sistema de aislamiento analógico “funciona”, pero


existen unos detalles que debemos de aclarar.

La mayoría de los optoaisladores cuentan con una propiedad de


funcionamiento llamado “No linealidad” la cual significa
básicamente que no tenemos una relación lineal en entrada-
salida, como podemos ver en la siguiente gráfica:
Entonces, el problema que tendremos es que en ciertas
circunstancias, si tenemos por ejemplo 3.3V en la entrada,
podríamos tener 3.8V en la salida.

Esto podría no ser tan relevante en ciertos casos, porque


podemos compensar este factor de no linealidad mediante
software, pero, aun así nuestro offset o factor de precisión
puede convertirse en ciertos problemas.

Aparte de que dar con el factor de compensación puede


convertirse en algo complejo de calcular.

Este no es el único factor real que puede presentarse y darnos


problemas.

Existe otro factor, el cual puede tener un efecto negativo en


cualquier aplicación donde se les incluye, el cual es el “LED
degradation” o degradación del led.

Todo LED cuenta con una vida útil, la cual puede variar
seriamente con aspectos como temperatura, humedad, corriente
IF, etc.

Al degradarse este LED, tenemos un porcentaje de transferencia


reducido y por lo tanto el performance de igual manera se verá
afectado.
Este factor de igual manera no podría afectar tanto en
aplicaciones digitales, pero SI en aplicaciones analógicas.

Si el factor de precisión es totalmente necesario, entonces


tenemos una solución más cara pero al mismo tiempo más
sencilla.

Para esto, debemos implementar un optoaislador de


transferencia lineal, aunque existen un montón en el mercado,
aquí te presento la mejor opción.

El optoaislador HCPL-7510

Este optoaislador, fabricado por Agilent technologies, cuenta


internamente con todo lo necesario para poder hacer el
aislamiento lineal de las señales analógicas de entrada.
Como podemos ver, este integrado funciona a un máximo de
5.5V por lo que vamos a necesitar regulación lineal exclusiva
para estos integrados.

Este integrado cuenta con dos variantes de encapsulados, siendo


8-DIP y 8-Dip winggull.

En este caso, usaremos la versión DIP 8 ya que es la más sencilla


de encontrar.

A pesar de que el costo unitario de este optoaislador es mucho


mayor que un optoaislador convencional, dentro contiene todo
lo necesario, por lo que ahorramos en cantidad de componentes
y al mismo tiempo en footprint.

¿Cómo vamos a implementar el integrado?

Como dijimos previamente, vamos a necesitar de regulación de


5V para poder que el optoaislador funcione, ya que es el voltaje
máximo u óptimo de operación.

Entonces, usamos un simple regulador LM2940-5V para obtener


nuestra salida fija y nuestro optoaislador funcionando.

Bien, lo que sigue es lo siguiente.


Ya que tenemos los pines VDD1 y GND conectados
respectivamente a lo que les corresponde, siguen las entradas.

La entrada Vin+, será la entrada de la señal analógica


proveniente.

Se recomienda usar un filtro de desacoplo, en este caso


usaremos un capacitor cerámico de 100nF.

Esto para suprimir cualquier ruido proveniente.

De igual manera debemos colocar un capacitor de desacoplo en


los pines de alimentación, igual de 100nF.

Entonces, nuestro lado primario quedaría de la siguiente


manera:

Bien, ahora vayamos al lado secundario.

En el lado secundario, tenemos de nuevo los pines Vin y GND.

Estos NO deben conectarse con la alimentación de la parte de


entrada, ya que tenemos el funcionamiento aislado.

Aquí debemos alimentar el optoaislador con el riel de 5V interno,


con el mismo que alimentamos el microcontrolador.
Recuerda no mezclar ambos GND ya que dejaríamos de tener
aislamiento.

Posteriormente tenemos los pines Vout y Vref.

Vout es la salida del optoaislador, esta la conectaremos a la


entrada del ADC de nuestro microcontrolador.

Posteriormente, tenemos el pin Vref. Este pin corresponde al


apartado de voltaje de referencia y debemos conectarlo a la
misma referencia que tenemos en el microcontrolador. En
nuestro caso, nuestra referencia es de 5V, entonces conectamos
el pin directamente a 5V. Tenemos entonces este circuito final:

Ahora, como ya nos dimos cuenta, nuestro rango de lectura para


este caso es un máximo de 5V.

Es decir, que señales con una amplitud mayor no podremos


medirlas, ya que dañaríamos el optoacoplador.

¿Qué podemos hacer en estos casos?

Para esto, debemos implementar un divisor de voltaje.


Con este divisor de voltaje podemos incrementar el voltaje de
entrada máximo, pero con un pequeño detalle.

Hay un precio que debemos pagar y este es la perdida de


precisión.

Ya que la referencia que tomamos en el software va a


incrementarse en función al voltaje máximo de entrada.

O de la misma manera podemos decir que se multiplica por el


factor de división.

Por ejemplo, con un voltaje de entrada de 5V y una resolución de


10 bits que equivale a 1024 tenemos:
5𝑉
𝑅𝑒𝑠𝑜𝑙𝑢𝑐𝑖ó𝑛 = = 4.88𝑚𝑉 ∗ 𝑏𝑖𝑡.
1024
Entonces, al tener esto, si incrementamos nuestro voltaje
máximo de entrada a 12V, obtenemos lo siguiente:
12𝑉
= 11.7𝑚𝑉 ∗ 𝑏𝑖𝑡.
1024
Aunque sigue siendo una precisión aceptable, podemos ver que
perdemos precisión de lectura.

Es por esto que bajo factores críticos, no es buena idea


implementar esto.
Si necesitamos leer entonces señales con una amplitud máxima
mayor al voltaje de referencia del microcontrolador, podemos
diseñar el divisor de voltaje de la siguiente manera:

Primero, la fórmula de un divisor de voltaje es la siguiente:

𝑅2
𝑉𝑜𝑢𝑡 = 𝑉𝑖𝑛 ∗ ( )
𝑅1 + 𝑅2

Continuación en versión completa…


Diseño de salidas
Este capítulo debemos dividirlo en las siguientes secciones:

Salidas digitales electromecánicas

Salidas digitales de estado solido

Salidas de PWM

Salidas analógicas.

Salidas electromecánicas
Por gran parte de la existencia de los PLC, estos han utilizado un
componente presente desde hace mucho tiempo, los
relevadores.

Los relevadores son switches electromecánicos. ¿Por qué se les


llama electromecánicos? Porque su activación o acción sucede al
energizar la bobina que tiene en su interior, la cual activa un
mecanismo interno (el switch o contactos).

Los relevadores cuentan con ventajas y desventajas muy


polarizadas entre sí, veamos cuales son.
Ventajas
Facilidad de uso: Los relevadores son muy sencillos de usar, no
necesitamos más que un amplificador Darlington para poder
controlarlos.

Robustez: Los relevadores pueden trabajar a voltajes muy altos y


también con corrientes muy altas.

Versatilidad: Los relevadores pueden conducir desde el voltaje


más pequeño, hasta el voltaje más alto (establecido por su
límite). Señales de corriente directa, alterna, etc. Esto los hace
perfectos para aplicaciones de propósito general.

Variedad: Existen una enorme cantidad de tipos de relevadores,


con distinta cantidad de contactos, posiciones, etc.

Desventajas
Tamaño: Los relevadores pueden llegar a tomar un área
considerable de la placa, según la cantidad de contactos,
potencia, etc.

Consumo de energía: Los relevadores son una mala opción en


cuestiones de eficiencia energética. Estos pueden consumir
mucha corriente en función a cuantos tengamos presentes.

Desgaste: Debido al accionamiento mecánico constante, los


contactos se dañan, rompen o erosionan causando problemas.

¿Cómo podemos seleccionar un relevador?

En nuestro caso, debemos considerar dos parámetros.


Voltaje de operación y configuración necesaria.

El voltaje de operación es el voltaje con el cual se accionan las


bobinas.

Un error que debemos evitar cometer es el alimentar los


relevadores con el mismo voltaje con el que alimentamos la
parte lógica digital. Ya sean 5V o 3.3V.

¿Por qué es un error? Por 3 motivos.

Motivo #1: Inducimos ruido al riel de alimentación.

Al tener estas cargas inductivas, vamos a estar generando


oscilaciones en el voltaje que pueden comprometer gravemente
al funcionamiento del microcontrolador. Esto es algo que
debemos evitar a toda costa.

Motivo #2: Disipación.

Los relevadores de 5V pueden consumir hasta 60mA en el peor


de los casos. Imagina que tenemos 8 relevadores de 5V en
nuestro PLC. En total tendremos una carga de 480mA
únicamente en relevadores. Si nuestro riel de 5V es dado por un
regulador lineal como el 7805 y tenemos un voltaje de entrada
de 24V, este regulador deberá disipar la siguiente potencia:

𝑃 = (𝑉𝑖𝑛 − 𝑉𝑜𝑢𝑡) ∗ 𝐼 = (24𝑉 − 5𝑉) ∗ 0.48 = 9.12𝑊


Es demasiada potencia para un regulador lineal de este tipo, por
lo que tendrías que colocar un regulador masivo, cosa
totalmente innecesaria.
Motivo #3: Eficiencia.

Como vimos anteriormente, entre menor es el voltaje de


operación, mayor la corriente consumida. Mayor corriente
consumida es igual a mayor cantidad de pérdidas en forma de
calor.

Es por esto que NO es nada recomendable que los relevadores se


alimenten desde el voltaje de lógica digital.

¿Entonces que voltaje debemos emplear?

La solución está en alimentarlos desde el voltaje DC que


obtenemos en la alimentación del PLC.

Ya sean 24V o 12V. Este es el voltaje que necesitamos emplear


para poder operar los relevadores sin problemas.

Supongamos que vamos a obtener 12V de nuestra salida


rectificada, entonces nuestros relevadores serán de 12V.

Ahora, la configuración necesaria.

Esta configuración se refiere a la cantidad de switches internos


necesarios.

Tenemos básicamente dos opciones, SPST o SPDT.


La configuración SPST hace que el relevador sea más pequeño,
pero la configuración SPDT nos otorga una variante útil en
diversas ocasiones, pues en ciertas ocasiones, donde
necesitamos hacer selección entre 2 señales hacia un mismo
destino, nos ahorramos el usar 2 relevadores.

Esto dependerá de cada necesidad, pero en nuestro caso


usaremos relevadores SPDT.

Ya que hemos seleccionado el tipo de relevador necesario, toca


ver el siguiente paso. La operación o accionamiento de los
relevadores.

No podemos conectarlos directamente a las salidas de un


microcontrolador, pues estos quemarían a las salidas
instantáneamente.

Lo que debemos hacer, es utilizar transistores… pero existe un


problema.

Utilizar un transistor individual para cada relevador incrementa


el tiempo de ensamble y hace el routeo más complicado, aparte
de que debemos añadir un diodo anti flyback a cada bobina para
evitar quemar los transistores.

Por suerte, tenemos una solución práctica y sencilla, un


amplificador Darlington.

En este caso, utilizaremos el amplificador Darlington ULN2803A.


Este integrado cuenta dentro de sí con 8 amplificadores
Darlington, junto con su diodo de protección.

Por lo que al tener todo dentro de un mismo integrado, se hace


más sencillo el routeo, es más barato y mejor en todos los
aspectos.

Este integrado está disponible en encapsulados through hole y


SMD SOIC.

Ambos encapsulados cuentan con las mismas características


eléctricas, por lo que por conveniencia utilizaremos la versión
SMD.

Por último, falta implementar la iluminación indicadora.

Para este caso, debemos usar diodos led, los cuales colocaremos
en paralelo con los relevadores en la conexión del ULN2803A.

Podemos implementar cualquier tipo de diodo led, solo que


debemos de calcular la resistencia en función a dos cosas.

La primera es en base al voltaje de entrada y la segunda es en


función a la luminosidad.
Esto puede variar demasiado en función a preferencias, puede
que prefieras una luminosidad alta o una luminosidad baja.

Una luminosidad alta será más fácil de percibir, pero al mismo


tiempo va a consumir más corriente.

Esto no es tan relevante si alimentamos el PLC con entrada AC,


pero con baterías hay que pensarlo dos veces.

Una luminosidad baja podrá no ser tan perceptible, pero


consumirá menor corriente por lo que será una configuración
más apta para baterías.

Podemos deducir rápidamente, que si queremos una


luminosidad alta, usamos resistencias de 1k y si queremos
luminosidad baja usamos resistencias de 10k.

Ya con la iluminación led, entonces nuestra configuración de


relevadores queda de la siguiente manera:

Continuación en versión completa…


Salidas analógicas

Nos falta hablar del último tipo de salidas que vamos a


implementar.

A pesar de que implementar salidas digitales es algo muy


sencillo, pues solo tenemos un cero y uno.

Los ceros y unos NO siempre son lo único necesario en nuestro


sistema, como ya podremos habernos dado cuenta en ciertas
situaciones.

Por lo que, es hora de implementar el segundo tipo de salidas,


las salidas analógicas.

Las salidas analógicas, como su nombre lo indica, son salidas


cuyo valor varia ampliamente desde el mínimo al máximo.

¿Cuándo vamos a necesitar salidas analógicas?


Los escenarios donde podemos requerir salidas analógicas son
tan amplios como en las salidas digitales, pueden ser en caso de
servomotores, servo válvulas, control de corriente de una carga,
etc.

Es por esto que no podemos dejar pasar la implementación de


estas salidas en nuestro sistema.

¿Pero cómo podemos generar salidas analógicas?

Existen dos maneras principales para esto, el método de PWM y


el método de R2R, así que veremos la implementación de ambos
métodos para nuestro sistema.
Método PWM
¿Cómo podemos obtener una salida analógica usando una señal
de PWM?

Esto es muy sencillo.

En nuestra señal de PWM, tenemos el factor llamado “Duty


cycle” el cual significa duración de ciclo.

Este representa el porcentaje de tiempo de encendido en


nuestro periodo.

Por ejemplo, en nuestra señal anterior tenemos un duty cycle de


70%. Si la señal dura un total de 1ms. Entonces el tiempo de
encendido es de 700us.

¿De qué nos sirve el duty cycle entonces?

Conociendo el duty cycle de la señal, o más bien manipulándolo,


podemos obtener una variación de voltaje analógica
aprovechando la propiedad de “Voltaje eficaz”.

Para esto debemos conocer ahora otra propiedad de la señal.


La otra propiedad de la señal es la amplitud.

La amplitud es básicamente el voltaje pico de nuestra señal de


PWM.

Dado que tenemos una duración de ciclo que no siempre es de


100%, entonces podemos decir que nuestro voltaje efectivo en
realidad NO es la amplitud de la señal.

El voltaje efectivo en realidad es la amplitud multiplicada por la


duración de encendido.

Por lo que si tenemos una amplitud de 5V y una duración de


50%, entonces el voltaje efectivo es de 2.5V.

¿Y de que nos sirve todo esto?

Bien, aquí lo importante es lo siguiente.

Si variamos la duración de ciclo, vamos a tener un voltaje eficaz


constante, entre menor sea la duración, menor será el voltaje y
entre mayor sea la duración, mayor será el voltaje.
Entonces, lo que debemos hacer es variar esta duración y
obtendremos distintos voltajes eficaces de salida.

Pero, aunque tengamos estas variaciones, seguiremos teniendo


una señal cuadrada ¿Qué debemos hacer entonces?

Lo que debemos hacer, es filtrar la señal para obtener esta salida


analógica.

Entonces, debemos usar un filtro pasa bajos RC.

La función de un filtro pasa bajos, es básicamente bloquear la


propiedad alterna de una señal y convertirá en una señal estable,
dentro de lo posible por el filtro.
Por lo que al emplear este filtro, pasaremos de una señal
cuadrada:

A una señal estable:

Es por esto que debemos emplear el filtro, para poder obtener


un voltaje de salida fijo.

Los valores de nuestro filtro no deben ser tan precisos ya que el


caso no lo amerita, pero vamos a establecer un valor de R de
2.2k y el capacitor de 1uF para tener un funcionamiento estable.

Pero, esto no es suficiente aun.

Dado que cualquier carga, por más mínima que sea, va a suponer
un rizado como este:
Esto nos puede arruinar el día ya que esas oscilaciones pueden
darnos graves problemas a la hora del funcionamiento.

¿Qué ocasiona este rizado?

La corriente consumida.

A pesar de que lo repetimos hasta el cansancio, este tipo de


salidas NUNCA deben alimentar cargas, eso ya lo sabemos.

Pero, en este caso, aun la carga más mínima como un led nos
puede ocasionar un rizado considerable y esto es debido a la
baja capacitancia.

Continuación en versión completa…


Diseño de expansiones
Por más complejo que sea el microcontrolador que usemos,
siempre vamos a toparnos con un problema, no tenemos
suficientes puertos para la cantidad de entradas y salidas que
necesitamos en nuestro PLC.

Obviamente este no siempre es el caso, pero si llegáramos a


necesitar una mayor cantidad de salidas y entradas de las que
nuestro microcontrolador, la idea no es hacer otro PLC replica, la
idea es añadir una expansión.

Las expansiones no se limitan necesariamente a entradas y


salidas, estas pueden ser puertos ADC, PWM, DAC, etc.

Entonces, podemos diseñar módulos de expansión para poder


extender las capacidades de nuestro PLC en caso de requerirlo.

¿Pero cómo funciona una expansión?

Como dijimos anteriormente, una expansión es implementada


cuando nos quedamos sin puertos disponibles.

¿Pero si nos quedamos sin puertos disponibles entonces como


hacemos funcionar la expansión?

Aquí es donde entra la comunicación serial.

La comunicación serial es un método de transmisión y recepción


de datos que sin duda revolucionó la electrónica digital.

Anteriormente, para enviar datos teníamos que hacerlo de


manera paralela, entonces para enviar datos de 8 bits teníamos
que usar 8 pines del microcontrolador, esto no solo gasta
muchos pines si no que genera conectores enormes.
La comunicación paralela sigue implementándose aun dado que
es la manera más rápida de enviar datos.

Pero, para velocidades más bajas esto se volvió un problema,


pues las dimensiones de los puertos son muy grandes y se
genera demasiada interferencia entre sí.

Para solucionar este problema se desarrolló una solución


perfecta, la comunicación serial.

La comunicación serial, en lugar de asignar un pin para cada bit,


envía bit por bit en serie el cual luego es recibido y convertido en
un byte.

Existen muchos protocolos de comunicación serial disponibles,


pero en este caso hablaremos del protocolo que
implementaremos, el protocolo I2C.
El protocolo I2C es un protocolo serial síncrono, es decir, que
cuenta con una señal de reloj implementada en la transmisión.

Este protocolo es half dúplex, significa que se pueden enviar y


recibir datos, pero no al mismo tiempo.

Esto es debido a que este protocolo funciona únicamente


mediante 2 pines, datos y reloj, denominándose de la siguiente
manera:

SDA: datos.

CLK: reloj.

Este protocolo es excelente para nuestro caso, pues nos permite


una capacidad de expansión enorme con la necesidad de
únicamente 2 pines.

Esto hace que sea implementado en una gran variedad de


aplicaciones. Este protocolo de comunicación suele llamarse
como “TWI” o “Two wire interface”
¿Con que características vamos a diseñar nuestra expansión?

Podemos implementar gran cantidad de periféricos en nuestra


expansión, siempre y cuando la cantidad de direcciones nos
permita, junto con las características físicas de la placa.

En nuestro caso, para maximizar el factor didáctico, vamos a


implementar las siguientes características:

-Expansion de entradas digitales (Con misma caracteristica que


en placa principal).

-Expansion de salidas a relevador(Con misma caracteristica que


en placa principal).

-Expansión de entradas analógicas.

-Expansión de salidas a PWM.

-Expansión de memoria EEPROM.

-Expansión de RTC.

-Implementación de buffer para transmisión prolongada.

Bien, comencemos con el análisis completo.


Diseño de entradas/salidas digitales
Selección de integrado
Para este caso vamos a implementar el integrado PCF8574.

Este integrado es un expansor de entradas y salidas digitales


hecho por Philips. Este integrado es excelente para nuestra
aplicación.

Este integrado cuenta con un único puerto de 8 bits, los cuales


pueden funcionar de manera independiente entre sí (Como
entradas o salidas).

Este integrado puede operar a un máximo de 6V, puede


comunicar a una velocidad máxima de 400KHz en fast mode y
tiene una capacidad de corriente sink de 25mA.
Implementación
Existe una precaución que debemos tomar al implementar este
integrado.

Y es que existen dos versiones, el PCF8474 y el PCF8574A.

¿Cuál es la diferencia?

Ambos integrados operan de la misma manera, pero cuentan


con direcciones distintas.

Debido a que la dirección solo es configurable del bit 0 a 2, esto


puede ocasionar un cierto conflicto en dado caso que
requiriéramos implementar más.

Es por esto que con una dirección de solo 3 bits tenemos un


límite de hasta 7 integrados en un mismo bus de datos.

Pero, con esta variante A tenemos ahora una posibilidad de 14


integrados iguales en un mismo bus de datos.
Nuestro integrado funciona a un máximo de 6V, pero como en
cualquier dispositivo digital debemos de brindar una
alimentación estable, en nuestro caso de 5V para asegurar un
funcionamiento óptimo.

Direcciones y modos de operación


Para hacer que el integrado funcione como expansor de entradas
o salidas, debemos de asignarle esa función cada vez que le
hagamos un llamado.

Es decir, que si vamos a usar el integrado en función de entradas,


primero debemos de asignarle la función de entrada.

Esto se hace mandando primero la dirección de entrada en el


integrado y posteriormente se recibe el byte.

De igual manera para funcionar como salidas, primero enviamos


la dirección en función a salidas y luego enviamos el byte.

Esto es sumamente importante, pues de lo contrario nuestros


integrados no funcionarán.

Estas direcciones son configurables únicamente por los 3


primeros bits y esto lo hacemos simplemente mandando los
pines A0 a A2 a tierra para establecerlos como 0 o VCC para
establecerlos como 1.

Esto significa que la dirección de nuestros integrados será fija.

¿Por qué?

Porque si tenemos dos integrados con una misma dirección, no


podrían funcionar independientemente y prácticamente harían
lo mismo, esto no nos sirve.

Estas direcciones establecidas por nosotros tendrán un valor


compartido entre lectura y escritura, como indica la siguiente
tabla.

Como regla general, las direcciones de escritura serán números


pares y las de escritura números impares.

Es extremadamente importante configurar correctamente la


dirección de cada integrado, pues de lo contrario vamos a tener
problemas en el funcionamiento.
Salidas
Aunque el funcionamiento es teóricamente el mismo, existe un
detalle que hace necesario un rediseño.

Los pines en función de salida de nuestro integrado, son quasi


bidireccionales, no bidireccionales.

¿Qué significa?

Que la corriente de salida en 1 o en modo source es muy


limitada.

Y si, obviamente sabemos que no vamos a controlar


directamente a los relevadores conectándolos a estos pines.

¿Entonces cuál es el problema?

Como ya hemos visto, la manera de hacer esto es usando un


amplificador Darlington, como el que hemos usado, el
ULN2803A.

Pero, el detalle está ahí.

La corriente que consume cada entrada de este amplificador


Darlington es de aproximadamente 500uA, lo cual es mayor a la
corriente maxima de nuestros pines
Es por esto que no podemos conectar nuestras salidas
directamente a las entradas del amplificador Darlington.

¿Qué debemos hacer entonces?

Previo al amplificador Darlington, debemos añadir una etapa de


buffer, pero que consuma una cantidad muy baja de corriente.

¿Cuál es la mejor opción? Un opamp.

Los opamps consumen una cantidad muy baja de corriente en


sus entradas, en nuestro caso, el lm324 consume una corriente
de 100nA aproximadamente, esto es 100 veces menor a la
corriente maxima que podemos obtener directamente de la
salida en 1 de nuestro expansor.

Continuación en versión completa…


Expansor ADC
Ya que tenemos nuestros expansores de entradas y salidas
digitales diseñados, es hora de diseñar los expansores para
nuestras entradas analógicas.

Para este caso, usaremos el integrado ADS1115.

Este integrado es un ADC externo, con 4 canales y opera a una


resolución de 16 bits.

Este integrado opera mediante el puerto I2C, por lo que


podemos implementarlo en el mismo bus que en los demás
integrados que ya tenemos mediante este bus.

Al mismo tiempo, debemos considerar que este integrado posee


una resolución superior al ADC que poseemos en nuestro
microcontrolador, por lo que tenemos una clara ventaja respecto
a esto.

Para este caso, vamos a implementar el integrado en su variante


de encapsulado “PDSO 10”.
Bien, comencemos por revisar las características eléctricas del
integrado.

En este caso, poseemos lo siguiente:

Debemos recordar que estos valores no debemos pasarla, de lo


contrario podemos dañar el integrado.

Para este integrado vamos a utilizar el mismo procedimiento de


aislamiento de señales analógicas utilizando el integrado HCPL-
7510

Continuación en versión completa…


Expansion de EEPROM
Para concluir con el diseño de nuestra expansión, vamos a incluir
una memoria EEPROM de 4KB para poder guardar información.

En este caso, vamos a utilizar la memoria ATMEL 24c32, la cual


es una eeprom de 4kB que opera mediante el puerto I2C.

Esta es una eeprom que opera mediante el puerto I2C, por lo que
se implementa fácilmente con nuestra expansión.

¿Cuál es el motivo de incluir una EEPROM adicional a la


expansion?

Dado que la eeprom en nuestro microcontrolador es de


únicamente 256 bytes, esto podría limitarnos en caso de que
desearamos tener la posibilidad de hacer data logging y poder
guardar una gran cantidad de datos que vayamos adquiriendo a
lo largo de una aplicación.

Continuación en versión completa


Implementación de comunicación
Aunque tengamos todo en perfecto orden, si nuestra
comunicación palidece ante diversas situaciones, no
obtendremos nada funcionando.

Ahora veremos cómo implementar la comunicación sin tener


problema alguno con esta serie de pasos.

1.- La comunicación i2c es directa y no es cross talk.

A diferencia del protocolo USART y UART, donde la comunicación


se hace cruzada, es decir, TX a RX y viceversa, en el protocolo i2c
es lo contrario.

Aquí, conectamos directamente SDA con SDA y CLK con CLK.

Aparte, como podrás darte cuenta, tenemos 2 resistencias en


configuración pullup ¿Pero qué función cumplen?

Estas resistencias pullup son necesarias debido a la configuración


interna de los puertos I2C.

Debido a que son quasibidireccionales, es decir, únicamente el


estado 0 es generado por un transistor, mientras que el estado 1
es generado por la resistencia pullup.

Esto hace más sencilla la configuración interna del periférico.


2.- La comunicación es half dúplex.

Half dúplex significa que es bidireccional, PERO no podemos


enviar y recibir al mismo tiempo.

Este es el sacrificio de requerir únicamente 2 pines, nos hace la


vida fácil, pero tiene un inconveniente.

Obviamente nuestra velocidad de comunicación se ve afectada.

Para aplicaciones de baja velocidad esto es irrelevante y nuestra


aplicación es de baja velocidad.

Pero si tuviéramos el caso donde la velocidad es prioridad, como


adquisición de datos de un ADC o envío de datos a un DAC, este
puerto no es la mejor opción.

3.- Efecto RC

A pesar de que el protocolo i2c es increíble para expansiones,


como toda comunicación serial, sufre de un problema, el efecto
RC.

El efecto RC, en resumen, causa un delay en los flancos de subida


y bajada, deformando nuestra señal y dañando parcial o
totalmente nuestra comunicación.

Esto es debido a que a mayor distancia, mayor impedancia, esto


se resume en menor corriente y mayor capacitancia, lo que
equivale a problemas.
¿Cómo podemos solucionar esto?

Utilizando un buffer para transmisión de i2c.

En nuestro caso, vamos a utilizar el 82B715.

Este integrado es un reductor de impedancia o buffer.

Lo que hace es aumentar la cantidad de corriente de nuestros


puertos.

Mientras que un puerto i2C dentro de un microcontrolador


puede únicamente manejar hasta 5mA, de lo contrario
dañaríamos el puerto, este integrado extiende este valor hasta
30mA.

¿Esto de que nos sirve?

Este integrado nos permite usar resistencias pullup de menor


valor debido a este aumento en corriente máxima.

¿Y qué significa un valor de resistencia menor?

Un valor de RC menor, lo que resulta en una comunicación


estable.
Este integrado, expande nuestra capacidad que usualmente seria
de un máximo de 1m, a 20m.

Debemos recordar que este buffer debe implementarse en


ambas partes, tanto en nuestra expansión como en el sistema
principal.

De lo contrario la amplificación estaría ocurriendo únicamente


del lado del expansor.
Puerto de comunicación USB
El último puerto a implementar en nuestro PLC será el puerto
USB.

Todos conocemos el puerto USB, este puerto arrasó


completamente la industria e hizo un cambio magnifico con el
manejo de periféricos externos.

Este puerto está presente actualmente en casi cualquier sistema,


sobretodo en computadoras, por lo que no podemos dejar a un
lado y no implementarlo.

El protocolo USB, no es más que un método de transmisión


UART, de la misma manera que sucede con el método de RS232.

Solo que de esta manera obtenemos un baud rate superior por


este nuevo método de comunicación.

Entonces, no podemos conectar directamente un puerto USB a


nuestro microcontrolador.
Por desgracia, los conversores USB a TTL no suelen ser tan
accesibles como un simple convertidor TTL a RS232.

Existen una gran cantidad de integrados que se encargan de


realizar esta tarea, como es el caso de FTDI.

O prolific.

Estos son de los integrados más populares hoy en día. Pero existe
un problema.

Dado que estos integrados se han pirateado hasta el cansancio,


las compañías fabricantes han implementado medidas drásticas
como inhabilitar estos integrados por completo mediante drivers
al detectar chips no auténticos.

Y como sabrás, hoy en día es muy fácil ser engañado y comprar


integrados piratas, por lo que a menos que consigamos
directamente con el fabricante, corremos un alto riesgo de sufrir
por estos problemas.

Es por esto que mejor usaremos un integrado que ha ido


incrementando su popularidad y que es muy barato de adquirir,
el CH340G.

Este integrado nos proporciona las mismas características de


conversión a TTL, con un tamaño reducido y un precio más que
competente.

¿Por qué vamos a implementar este integrado?

Porque por el contrario de los anteriores, este integrado no nos


va a dar problemas con drivers, con bloqueos por copias no
autorizadas, por precios elevados, etc.
Como puedes ver en el pinout, todo el sistema de conversión es
muy sencillo de implementar.

Solo necesitamos extra un cristal oscilador de 12MHz y listo, ya


tenemos nuestro conversor USB a TTL.

Estas son las características eléctricas de nuestro conversor:

Y este el encapsulado y pinout:


Continuación en versión completa…
Diseño de alimentación
Por cuestiones de complejidad, vamos a diseñar nuestro PLC
para poder ser alimentado con baterías o con un transformador
de frecuencia de línea.

Implementar una fuente conmutada desde cero incrementaría la


complejidad del circuito enormemente.

Dado que los PLC no son dispositivos de potencia, no es


necesario preocuparnos por la cantidad de corriente que este va
a consumir.

Transformador y etapa de rectificación

Primero debemos seleccionar el transformador necesario para


nuestra aplicación.

En nuestro caso, deseamos que nuestro PLC pueda alimentarse


desde 12V hasta 32V AC.

Segundo, debemos saber aproximadamente cuanto consume


nuestro PLC.

La sección del PLC que más corriente consume son los


relevadores, en nuestro caso un relevador de 12V puede
consumir entre 15mA a 25mA. Esto debemos confirmarlo en el
datasheet.

Si tenemos 10 relevadores podemos esperar un consumo


únicamente de relevadores de hasta 300mA.

Dado que enfocamos el diseño de nuestro PLC más hacia el lado


de la eficiencia, no debería consumir más de 800mA.
Entonces podemos usar cualquier transformador de propósito
general de 12VAC a 32VAC.

Ya que hemos seleccionado nuestro transformador, ahora


vayamos a la sección de filtrado.

Primero debemos seleccionar el puente rectificador apropiado


para nuestra aplicación.

Como no esperamos consumir más de 1A, podemos seleccionar


un puente rectificador de baja potencia, en nuestro caso será de
encapsulado SMD para ahorrar costos.

Entonces el puente rectificador a usar será el DF02S.

Este es un puente rectificador de baja potencia, opera a un


voltaje máximo de 200V y una corriente máxima de 1.5A.
Esto es más que suficiente para nuestra aplicación.

Antes que nada ¿Qué factores debemos tener en cuenta al


implementar nuestro puente rectificador?

El primer factor y muy importante es la corriente máxima de


operación.

Como en todo componente, este es un valor que no debemos


exceder a menos que queramos quemar nuestro puente.

Segundo, el voltaje de caída.

Este es el voltaje de caída que podríamos esperar de cualquier


diodo, pero, en este caso, al tener básicamente 2 diodos
operando en serie en cada semiciclo, nuestro voltaje de caída
sería realmente el doble.

Este valor va a variar según el puente, existen unos más


eficientes que otros en este aspecto, pero un valor común es de
aproximadamente 1.4V a 1.7V.

Estos valores de caída DEBEMOS de tenerlos a consideración.


Primero para darnos cuenta que no debemos de usar un voltaje
de entrada muy cercano al deseado.

Segundo, mayor voltaje de caída significa mayor ineficiencia y


puede resultar en temperaturas de operación mayores.

Ahora debemos de diseñar nuestro filtrado.

Nuestro capacitor de filtro no demanda demasiado dado la baja


corriente de consumo.

¿Cómo debemos diseñar nuestro filtro? En base a un parámetro


muy importante. El voltaje de rizo.
Continuación en versión completa…
Consideraciones generales de diseño
Ya que hemos visto todo el tema relacionado al hardware,
probablemente te hayas hecho la siguiente pregunta.

¿Qué tipo de encapsulado debo usar para el diseño?

Este factor, a pesar de que no podría tener tanta relevancia para


alguien que recién se adentra en la electrónica, sí que tiene una
gran importancia en general.

¿Debemos elegir entonces los encapsulados through hole o los


encapsulados SMD?

¿Qué parámetros debemos de considerar antes de elegir los


componentes en un encapsulado u otro?

Los parámetros que vamos a emplear para este análisis, podrían


decirse que son de “propósito general” ya que cada tipo de
componente tendrá ciertas condiciones exclusivas a considerar.

Pero, a pesar de esto, esta guía a seguir es muy importante de


consultar previo a cualquier diseño que tengamos en mente.

Entonces ¿Cuáles son los parámetros que debemos a seguir?

1.- Área disponible en nuestra PCB (Dimensiones)

2.- Costo total de componentes.

3.- Factores eléctricos

4.- Costo total de ensamble

5.- Disponibilidad.

Veamos entonces a detalle cada parámetro.


Área disponible en nuestra PCB
Uno de los factores críticos con los que podemos toparnos, es el
de poder meter un sistema completo en un área reducida.

Esto puede ser por mil y un motivos, pero en caso de que


nuestra área del PCB sea muy reducida, tenemos que recurrir a
ciertas técnicas de diseño. Una de ellas es la implementación de
los componentes SMD.

La mayor parte de componentes de dimensiones muy reducidas


se encuentran en encapsulado SMD, ya que su montaje
superficial le da la habilidad de poder tener estas dimensiones.

Comparando por ejemplo, 2 resistencias, una through hole y la


otra SMD:

Podemos apreciar que las resistencias SMD, representan un área


mucho menor dada su construcción, aparte de que no
necesitamos de pads taladrados. Lo cual simplifica demasiado el
diseño.

Siempre y cuando el diseño nos lo permita o sea necesario,


debemos emplear componentes SMD.
Costo total de componentes
El segundo factor importante es el costo total de componentes.

Bajo ciertas circunstancias, por ejemplo si fuese únicamente un


prototipo o producción a muy baja escala, puede ser que la
diferencia de precio entre basar un diseño en mayoría SMD o en
mayoría Through hole no sea significativo.

Pero, al momento de que hacemos análisis económico para


producción en gran escala de un producto, es donde ya
comenzamos a ver la diferencia.

Dado que los componentes Through hole son más grandes,


ocupan un volumen mayor y en general cuentan con más
material, son más caros.

Esto es porque son más caros de transportar, almacenar y


distribuir.

En cambio, los componentes SMD son de menor tamaño y


volumen, esto permite que al comprar en una escala grande
tengamos un ahorro enorme.

Por ejemplo, comprando nuestras resistencias, leds, capacitores,


inductores, transistores, etc en reel.
El reel es un método de almacenamiento de componentes en lo
que denominamos “Bulk” o gran cantidad.

A pesar de que existen otros métodos de almacenamiento, en


caso de manufactura en serie ¿Por qué es conveniente usar el
Reel?

El reel cuenta con diseño optimizado para usarse en las


máquinas de pick and place.

Esto evita que la fábrica que realiza el ensamble tenga que


colocar individualmente cada componente en un reel.

De esta manera evitamos cargos extra por esto, ahorrándonos


dinero que puede ser una suma considerable.
Factores eléctricos
Este es un factor un poco más complicado.

Como vimos, la mayoría de componentes SMD cuentan con


dimensiones muy reducidas, y esto es por una cosa, la potencia
máxima de disipación es limitadísima.

Para resistencias, en este caso, de baja potencia como 1/16W,


1/8W o 1/2W es muy sencillo encontrarlas en su formato SMD.

Pero, en potencias mayores, como 2W,5W,10W o mayor valor,


esto sí que se vuelve un problema, ya que solo podemos
encontrar estos valores en versión through hole.
Lo mismo pasa en el caso de transistores, para casos de
transistores de baja potencia podemos encontrar una gran
cantidad de encapsulados.

Pero, para el caso de potencia, necesitamos encapsulados


through hole, esto debido a que tenemos que emplear disipación
pasiva, de lo contrario, quemaríamos nuestro transistor.

Entonces, debemos tener esto mucho a consideración, habrá


ocasiones donde sea obligatorio usar un encapsulado por
motivos de características eléctricas.
Costo total de ensamble
Otro factor económico importante, es el costo total de
ensamble.

Como mencionamos anteriormente, los componentes SMD


pueden comprarse en Reels especiales para el proceso de pick
and place.

Pero, en el caso de los componentes through hole, este no es el


caso.

Estos deben de colocarse manualmente y soldarse manualmente


por operadores, esto significa un incremento en el costo total de
ensamble.

Por lo que es un factor a tomar a consideración en caso de que


sea necesario realizar ensamble total o parcial de las placas.

Para optimizar este factor, será necesario entonces que la mayor


parte de componentes (mientras te sea posible) sea en SMD.
Disponibilidad
El último factor y más obvio es la disponibilidad.

Este factor, al igual que el factor eléctrico, dependerá mucho de


la situación, en este caso será del fabricante.

Van a existir componentes que se consigan exclusivamente o


más fácilmente en un tipo de encapsulado.

Por ejemplo, relevadores, transistores de potencia, conectores,


capacitores de alta capacitancia, etc, serán más fácil de
encontrar (O en algunos casos se consiguen únicamente) en
encapsulado through hole.

Por el contrario, componentes como microcontroladores,


circuitos integrados específicos, componentes de muy baja
potencia, etc, vamos a conseguirlos más fácilmente (o
únicamente) por encapsulados SMD.
Implementación de microcontrolador y
software
Ya hemos terminado con el apartado de diseño de hardware,
ahora toca el siguiente apartado, la implementación del
microcontrolador y el software.

Dado que ya sabemos cómo hacer los diseños previos, ahora


debemos aprender a usar el microcontrolador y realizar código
en él. Aparte de saber implementar las expansiones y periféricos
que serán necesarios.

OJO: En este libro NO vas a aprender a dominar los


microcontroladores PIC ni abordaremos todos los temas que
giran alrededor de.

Pero si aprenderemos lo básico o necesario para poder utilizar el


sistema completo.

Esto dado que no existe un software 100% confiable en el que


podamos realizar código mediante lenguaje ladder.

Tenemos que aprender a usar el lenguaje C. Eso sí, de una


manera simple usando librerías sin tener que adentrarnos tan
profundamente en la electrónica digital.
Selección de microcontrolador
Este es el apartado en el cual podemos, por así decirlo, tomarnos
las mayores libertades. En realidad cualquier microcontrolador
de hoy en día tiene el potencial suficiente para poder ser
implementado en un PLC. Esto solamente si cuenta con los
periféricos que necesitamos obviamente.

En nuestro caso, vamos a utilizar el PIC16f887.

Este microcontrolador cuenta con la cantidad de entradas,


salidas y periféricos que necesitamos para esta ocasión.

Tenemos 8KB de flash y 256 bytes de ram, más que suficiente


para gran parte de aplicaciones.
Este es un microcontrolador que opera a 5V. Consume
aproximadamente 800uA.

Continuación en versión completa…


Módulos PWM

La modulación por ancho de pulso consiste en controlar el


tiempo de encendido o duty cycle en una señal cuadrada.

Esto como hemos visto previamente tiene un sinfín de usos


practicos para nosotros.

Los modulos de PWM en un microcontrolador cuentan con una


resolución definida, siendo usualmente de 8 a 12 bits.

La precisión está definida porque % del dutycycle pertenece a


cada bit.

Si tenemos una resolución de 8 bits = 256 muestras.


100
Entonces 𝑃𝑟𝑒𝑐𝑖𝑠𝑖ó𝑛 = = 0.39% ∗ 𝑏𝑖𝑡
256

Entonces por cada bit del valor podemos controlar ese


porcentaje del duty cycle.

Esta resolución es más que suficiente para nuestra aplicación de


PWM.

La frecuencia de operación de nuestra señal de PWM va de 1KHz


a 20Khz.

La frecuencia puede o no ser un factor determinante para ciertas


aplicaciones.

Por ejemplo, para control de motores es buena, pues pasa


(aunque por poco) el rango de frecuencias audible por los
humanos.
Pero, para otras aplicaciones, como el diseño de una fuente
conmutada manejada directamente desde nuestro micro, esta
frecuencia se puede quedar muy corta.

Debemos recordar, que nuestra salida PWM será única y


exclusivamente una señal de voltaje de referencia. Es decir, no se
puede usar directamente para controlar una carga.

Como hemos visto previamente para controlar una carga


efectivamente usando esta señal, debemos de amplificar el
voltaje y posteriormente usar un semiconductor de potencia,
como un mosfet o un BJT para poder disipar la carga que
necesitemos.
Memoria FLASH del microcontrolador
Esta es la memoria más grande presente en el microcontrolador,
es la que mayor velocidad de acceso tiene y por ende es donde
se aloja el código.

La memoria FLASH puede usarse para almacenar datos aparte de


la EEPROM… PERO no es muy recomendable, pues podemos por
accidente sobreescribir algún sector ocupado por el código y
entonces tendremos serios problemas de funcionamiento.

En nuestro caso tenemos una FLASH de 8.192KB de tamaño


total.

Memoria EEPROM
Esta es una memoria significativamente más pequeña que la
FLASH. Aparte de que es de menor velocidad.

¿Cuál es su propósito entonces?

El propósito de la memoria EEPROM es la de guardar


información de baja densidad.

Por ejemplo, variables.

Podemos guardar resultados de lecturas, variables de


contadores, etc.

Las memorias EEPROM cuentan con un ciclo de vida muy


superior que las FLASH.

En nuestro caso la capacidad total de la EEPROM es de 256 bytes.

Prácticamente el espacio para guardar el valor de 256 variables


de 1byte de tamaño.
Puerto USART

El pic16f886 cuenta con un único puerto USART, el cual es de


nivel lógico a 5V. Este puerto puede operar a un máximo de
128Kbps, el cual suele ser el standard máximo para RS 232.

Debemos recordar que nuestra comunicación serial no puede


transmitirse por sí sola a largas distancias, usualmente no a más
de 3m. Por lo que si deseamos transmitir a una distancia más
lejana, por ejemplo, 80m, debemos usar un transceiver
amplificador como el MAX232. El cual nos otorga esa posibilidad.
Puerto MSSP

El o los puertos MSSP, consisten de la comunicación serial SPI y


I2C internos del microcontrolador.

Es necesario mencionar que ambos protocolos comparten los


mismos pines, por lo que no podremos implementar SPI y i2C en
un mismo puerto.

Aunque se pueden usar otros pines mediante software, esto no


es tan eficiente como usar los puertos dedicados.
Puerto de programación

“Imagen de puerto de programación”

Nuestro puerto de programación, denominado ICSP consiste de 3


pines y son los siguientes:

VPP: Voltaje de programación. Esta señal es generada por el


programador y pone en modo programación al microcontrolador

DAT: Puerto de datos, este es el puerto por el cual nuestro


microcontrolador recibe los datos.

CLK: Puerto de reloj.


Antes de implementar el microcontrolador, primero veamos una
serie de pasos y precauciones a seguir con la implementación de
microcontroladores.

1.- Usar una fuente de voltaje estable y con el


voltaje exacto necesario.
Un microcontrolador necesita una fuente de voltaje muy estable
para poder funcionar adecuadamente.

Debido a que la frecuencia de operación puede variar si variamos


el voltaje de alimentación, junto con otros periféricos, los
microcontroladores cuentan con una función llamada “Brown
out”.

La cual es una función que resetea o impide el funcionamiento


del microcontrolador en caso de que el voltaje de alimentación
caiga por debajo del límite funcional.

Aparte, de que los microcontroladores son muy sensibles ante


voltajes mayores a los especificados, por lo que fácilmente
pueden dañarse si no se tratan con la precaución necesaria.

2.- No invertir la polaridad de


alimentación
Si invertimos la polaridad en los pines de alimentación, vamos a
quemar el microcontrolador internamente. Es por esto que es
sumamente importante el reconocer la polaridad correcta de
alimentación y estar totalmente seguros de que no vamos a
quemar nuestro micro.

3.- Alimentar el microcontrolador


mediante todos los pines de alimentación
Ciertos microcontroladores cuentan con 2, 3 o más pares de
pines de alimentación, otros como el pic16f886 cuentan con 2
GND.

Estos pines NO son opcionales, debemos de alimentar los


microcontroladores mediante todos los pines, si no podría ser
que no funcione bien nuestro microcontrolador o inclusive no
funcione en su totalidad.

Continuación en versión completa…


Módulo PWM
Ahora veamos el módulo PWM.

Antes de comenzar, debemos de aprender a localizar los puertos


PWM en nuestro pic.

Los puertos PWM se encuentran como “CCP” seguido del


número que le corresponde.

En el caso del PIC16f886 tenemos 2 puertos PWM, por lo que los


encontramos como CCP1 y CCP2

Bien, ahora comencemos a aprender como emplearlos.

Primero debemos de definir la frecuencia con la que deseamos


trabajar.

En el caso del pic16f887, el rango de frecuencias puede ser de


1KHz hasta 20Khz.
La frecuencia de operación va a variar en función a la aplicación
que le vayamos a dar, por lo que esto debemos de investigarlo
previamente.

Ahora, ya que tenemos nuestra frecuencia de operación, vamos


a conocer la instrucción de inicio.

La primera instrucción se llama “PWMX_Init(F)”

Esta instrucción de encarga de definir la frecuencia de operación


de nuestra señal de PWM.

La letra X se reemplaza por el puerto PWM que vayamos a


utilizar. Si vamos a usar el puerto 1 colocamos este número y
viceversa.

La letra F dentro del paréntesis representa la frecuencia y


debemos reemplazarla por el valor en Hertz de nuestra señal.

Si vamos a operar nuestra señal a 20KHz, colocamos dentro


20000.

Entonces, quedaría asi: PWM1_Init(20000);

Es muy importante no olvidar definir la frecuencia de operación y


al mismo tiempo colocar el numero correcto del puerto que
vamos a emplear, de lo contrario, no tendremos una señal de
salida.

Tampoco debemos de pasar el valor de frecuencia maxima de


nuestro microcontrolador, si no tampoco tendremos una señal
de salida.
Posteriormente tenemos la instrucción “PWMX_Start()” y
“PWMX_Stop()”.

Ambas instrucciones sirven para iniciar o parar el módulo de


PWM.

Estas instrucciones debemos de usarlas con cuidado.

Por ejemplo, PWMX_Start() debemos de usarla previamente en


nuestra Void main para iniciar nuestro puerto en caso de que
vaya a operar directamente. En caso de que nuestro puerto solo
se active en condiciones específicas, entonces este Start
debemos colocarlo donde necesitemos.

De la misma manera el PWMX_Stop debemos colocarlo donde


vayamos a requerir que se apague nuestra señal. Ya sea por la
lectura de una entrada, un timer, etc.

Por último, tenemos la instrucción “PWMX_Set_Duty(DC)”.

Esta instrucción nos sirve para definir el duty cycle de nuestra


señal.

Algo muy importante que debemos recordar. Este valor de duty


cycle no lo podemos escribir como un porcentaje (0% a 100%).
Este valor debemos de escribirlo como valor decimal según la
resolución de nuestro puerto PWM.
¿Qué significa esto?

Debemos de primero conocer la resolución de nuestro puerto.

En nuestro caso, tenemos una resolución de 8 bits, esto equivale


a 255 en decimal.

Ahora toca convertir este valor máximo en equivalencias.

Si 255 es el valor máximo, esto quiere decir que es el 100% del


duty cycle.

Entonces para obtener el valor de porcentaje equivalente en


decimal dividimos 100 sobre 255.
100
= 0.39% ∗ 𝑏𝑖𝑡
255
Entonces, si quisiéramos obtener un porcentaje de duty cycle de
65%, debemos dividir este valor sobre el resultante.
65
= 167 𝐵𝐶𝐷.
0.39
Este será el valor que debemos emplear en nuestra instrucción
para obtener el duty cycle deseado.
Ejemplo:
Para este ejemplo tendremos obviamente el control del duty
cycle de una señal. Esta señal de duty cycle variable nos servirá
principalmente para controlar la potencia efectiva que recibe
una carga. Esta carga puede ser puramente resistiva como un
LED o inductiva como un motor.

Veamos en código como tendríamos nuestro control.

short duty;

void main(){

TRISA = 1;

TRISC = 0;

PORTA = 0;

ANSEL = 0;

ANSELH = 0;

C1ON_bit = 0;

C2ON_bit = 0;

PWM1_Init(20000);

PWM1_Start();

duty = 0;
while(1){

if(RA0_bit == 1){

delay_ms(100);

duty = duty + 5;

if(RA1_bit == 1){

delay_ms(100);

duty = duty - 5;

if(duty < 0){

duty = 0;

if(duty>255){

duty = 255;

PWM1_Set_Duty(duty);

} //// end while

} ///////////// end void main


Bien, veamos bien que sucedió en el código.

Tenemos 2 entradas las cuales nos van a servir para incrementar


o disminuir el duty cyle. Estas son RA0 y RA1.

En este caso usamos el método de anti rebote de delay, esto


porque puede ser funcional el incremento al dejar presionado el
botón.

Aquí tenemos dos protecciónes en el código, estas son:

if(duty < 0){

duty = 0;

if(duty>255){

duty = 255;

Estas protecciones evitan que duty llegue a un valor menor que


cero o que llegue a un valor mayor que 255.

Esto es necesario porque nuestro puerto de PWM es de 8 bits,


por lo que no podemos establecer un valor mayor a 255.

Y de esta manera obtenemos el control del duty cycle.


Para controlar el duty cycle de un led, lo único que necesitamos
es una resistencia de 1k, esto debido a que el led consume una
cantidad muy pequeña de corriente.

Pero, por ejemplo, si tuviéramos que controlar un motor de 9V,


necesitamos lo siguiente:

Para este caso, la señal tiene que pasar técnicamente por 2


fases, la primera es amplificación de voltaje y la segunda es
amplificación de corriente.
La amplificación de voltaje es necesaria debido a que el voltaje
de salida de nuestro microcontrolador es de únicamente 5V, por
lo tanto, si tenemos un motor de 9V no daremos la potencia
suficiente para poder hacerlo girar adecuadamente.

Por lo tanto, usamos el amplificador operacional con ganancia de


2, para obtener un PWM de salida con una amplitud de 10V.

Pero, dado que los amplificadores operacionales a duras penas


pueden soportar corrientes de salida mayores a 20mA, no
podemos conectar nuestro motor directamente a la salida o
tendríamos un opamp dañado instantáneamente.

Por lo tanto utilizamos un transistor de mediana potencia como


el TIP31C o IRF540 para que disipe la potencia y de esta manera
podemos controlar el motor sin problemas.
Conversor DAC
Previamente ya vimos el conversor analógico a digital, el cual nos
sirve para realizar lecturas sobre una señal analógica.

Pero… ¿Qué sucede con lo contrario?¿Qué hacer cuando


necesitamos convertir ahora una señal digital en una señal
analógica?

Aquí es donde entran los conversores digitales a analógicos o


DAC.

Los DAC son conversores usados para obtener una señal de


salida analógica mediante un sistema digital.

Existe una variedad de métodos disponibles para realizar esto,


pero en esta ocasión vamos a revisar dos métodos:

PWM.

R2R.
Método DAC mediante PWM
Una de las funciones importantes que podemos obtener
mediante nuestra salida de PWM es un conversor digital a
analógico.

¿Cómo funciona esto? Veamos lo siguiente.

En una señal PWM tenemos un factor llamado “Duty cycle” el


cual representa básicamente el porcentaje de encendido de una
señal de PWM.

Pero, al mismo tiempo, esto representa de igual manera el


voltaje efectivo de una señal.

¿Qué es el voltaje efectivo?

El voltaje efectivo es básicamente el voltaje eficaz o el que


realmente toma importancia en la señal.
¿Cómo obtenemos el valor del voltaje efectivo?

Como podemos ver en la señal anterior, tenemos un duty cycle


de 50% y una amplitud de señal de 5V.

Nuestro voltaje efectivo o eficaz será la amplitud multiplicada


por el duty cycle.

En este caso:

𝑉𝑜𝑙𝑡𝑎𝑗𝑒 𝑒𝑓𝑖𝑐𝑎𝑧 = 𝑉𝑚𝑎𝑥 ∗ 𝑑𝑢𝑡𝑦 𝑐𝑦𝑐𝑙𝑒 = 5𝑉 ∗ 0.5 = 2.5𝑉

Entonces, nuestro voltaje eficaz será de la mitad, es decir, 2.5V.

¿Pero qué tiene que ver esto con un DAC?

Bien, podemos aprovechar esta propiedad de voltaje eficaz para


obtener una variación o salida analógica usando el PWM. Pero
no nos sirve únicamente usando la señal.

Para lograr obtener una salida analógica, debemos emplear un


filtro llamado “Filtro pasa bajos”.

No vamos a meternos en profundidad con los filtros pasa bajos,


pero en resumen, aprovechamos la propiedad de los capacitores
de oponerse a los cambios de voltaje para obtener una salida
estable.

Mediante este filtro, pasamos de tener una señal cuadrada:


A esto:

Ya con este filtro no veremos la señal variando de duty cycle, si


no que veremos una señal estable con el valor de voltaje eficaz
correspondiente.

Existen varios parámetros que debemos considerar previo a


implementar el filtro.

El primero son los valores de la resistencia y capacitor del filtro.

Con estos valores no es necesario ser tan precisos, con una


resistencia de entre 1k a 10k y un capacitor de entre 100nF a 1uF
será suficiente.

Posteriormente tenemos la frecuencia de operación, lo


recomendable en este caso es que nuestra señal de PWM esté lo
más cercana al máximo, esto es debido a que a mayor frecuencia
de operación, menor es el tamaño del capacitor necesario.
PERO, debemos recordar que este es únicamente un voltaje de
referencia, no debemos conectar ninguna carga de lo contrario
perderíamos estabilidad por completo.

Para evitar todo tipo de estabilidad, debemos implementar


entonces un buffer utilizando un amplificador operacional.

Lo único necesario para recalcar, es que nuestro voltaje de


operación del opamp debe ser por lo menos 2V mayor al voltaje
máximo de la señal, esto para poder tener el rango completo de
salida.

El último punto importante con esto es la resolución.

La resolución de salida será la misma que la resolución de


nuestro módulo PWM.
En nuestro caso con el pic 16f886, tenemos una resolución de 8
bits, lo que equivale a 255 en decimal.

Si tenemos entonces un voltaje de salida máximo de 5V y nuestra


resolución es de 8 bits, entonces por bit tendremos una
resolución de:
5𝑉
= 19.6𝑚𝑉
255

La implementación de este método no cambia realmente la


estructura o implementación de nuestro código.

No necesitamos usar librerías u otras instrucciones aparte de las


instrucciones de PWM que ya hemos utilizado previamente.

Esta resolución de 8 bits en la mayoría de los casos es más que


aceptable, podría haber situaciones donde requerimos de una
precisión superior, es entonces donde tenemos otro método más
preciso…
Ejemplo
Para este caso, vamos a implementar el circuito a continuación,
pero en modo buffer, para obtener una salida máxima
equivalente a TTL y obtener la amplitud anterior.

En esta ocasión, vamos a poder ver el incremento y decremento


del voltaje establecido por bit, en este caso 19.6mV.

Al presionar cada botón podremos ver que da saltos en el valor


analógico de ese valor.
short duty;

void main(){

TRISA = 1;

TRISC = 0;

PORTA = 0;

ANSEL = 0;

ANSELH = 0;

C1ON_bit = 0;

C2ON_bit = 0;

PWM1_Init(20000);

PWM1_Start();

duty = 0;

while(1){

if(RA0_bit == 1){

delay_ms(100);

duty = duty + 1;

if(RA1_bit == 1){

delay_ms(100);
duty = duty - 1;

if(duty < 0){

duty = 0;

if(duty>255){

duty = 255;

PWM1_Set_Duty(duty);

} //// end while

} ///////////// end void main

De esta manera podremos apreciar el voltaje de salida que


obtendremos con el método de PWM.

Según el tamaño de la capacitancia veremos que la velocidad con


la que varía el valor será más lenta. Pero al mismo tiempo será
más estable al conectarle cargas.
Si colocamos una carga directamente al filtro previo al opamp,
podemos ver el enorme rizado que vamos a obtener, inclusive
con cargas tan livianas como 2mA.

Pero, al implementar el buffer ya obtenemos la señal estable y


sin problemas. A esto le podemos llamar un “Ripple killer” o
reductor de rizado.
Puerto I2C
Este puerto es muy importante pues es el que nos permite el
control de nuestra expansión.

Este puerto no es obligatorio de aprender a implementar para el


PLC principal, pero debes aprender a manejarlo si deseas
aprender a controlar la expansión.

El protocolo I2C es un método de comunicación serial síncrono


que consiste únicamente de dos pines, SDA y SCL.

Siendo:

SDA (Bus de datos).

SCL (Bus de reloj).

Este protocolo es half dúplex, es decir, que solo podemos enviar


o recibir datos en un instante de tiempo, dado que solo tenemos
un bus para datos.

Caso contrario es por ejemplo SPI o USART. Los cuales si son full
dúplex.

Estos pines se deben conectar directamente con los pines de los


dispositivos con los que nos deseamos comunicar.
Por contrario de USART por ejemplo, cuya comunicación es
cruzada:

En el protocolo I2C tenemos que conectar directamente los pines


del maestro con el esclavo.

Si conectamos la comunicación de manera cruzada (SDA con SCL


o viceversa) no lograremos establecer comunicación en lo
absoluto.

Ya has notado que en este protocolo se comunican diversos


dispositivos mediante un único bus de datos. ¿Cómo funciona
esto?

En USART por ejemplo, solo podemos efectuar comunicación


entre 2 dispositivos mediante un bus de datos.
En SPI utilizamos pines CS o slave select, los cuales se mandan a
0V para seleccionar el esclavo con el cual deseamos establecer
comunicación.

¿Pero si en I2C tenemos únicamente 2 pines operando como se


realiza la selección entre dispositivos?

Aquí es donde entran las direcciones.

Las direcciones son valores que debemos de enviar previo al


envio o recepción de datos.

Podemos ver que primero debemos enviar la dirección para


indicar a que esclavo deseamos comunicarle algo.

Las direcciones son valores en 1 byte que contiene la dirección


del dispositivo con el que deseamos comunicarnos.

A pesar de que la dirección entera es de un byte o 8 bits, en


realidad solo 7 bits pertenecen a la dirección configurable, ya
que el primer bit o el LSB pertenecen a la instrucción “Lectura” o
“Escritura”.
Posteriormente, al enviar esta dirección, recibimos o escribimos
el byte según sea el caso.

Algo que tenemos que tener demasiado en conocimiento es el


concepto de “Escritura” y “Lectura” ya que es aquí donde
muchos principiantes se equivocan.

Como sabemos, existen esencialmente 2(o más) participantes en


la comunicación. El maestro y el esclavo.

Entonces, existe el siguiente standard de definición al momento


de hacer comunicación.

Cuando decimos que establecemos la comunicación en modo


“Escritura” significa que el maestro enviará datos al esclavo.

Mientras, que cuando decimos “Lectura”, el maestro va a recibir


datos del esclavo.

Es muy importante que tengas estos conceptos claros para evitar


problemas o confusiones al usar este protocolo.

Para efectuar la comunicación, necesitamos de 2 resistencias


pullup, dado que el sistema funciona por “open colector drive” o
sistema de colector abierto.
Ahora, existe un error GRAVISIMO que cometen muchos
principiantes con esto. Ya que hacen la siguiente analogía.

“Si es un sistema digital, y llevo usando valores arbitrarios de 10k


en la mayoría de las situaciones, entonces puedo usar este valor
y no abra problemas”.

¿Por qué es esto un problema? Por el efecto RC.

En realidad, tenemos capacitancias parasitas en nuestro bus de


comunicación.

Es por esto que es terriblemente mal deducir estas resistencias


de manera aleatoria.
Debemos de primero deducir la capacitancia total presente en el
bus de comunicación.

Esto no es tan sencillo de deducir, pero existen dos maneras de


hacer un análisis rápido.

Primero, debemos establecer qué tipo de ambiente tenemos.

Vamos a dividirlo en 2 ambientes: ambiente alto y ambiente alto.

Ambiente alto
Los ambientes altos, son aquellos con altas capacitancias
presentes, estos son principalmente los protoboards, PCB’s de
más de 2 capas y cables de comunicación muy largos.

Estos son los lugares donde tendremos la mayor cantidad de


problemas.
Ambiente bajo
El ambiente bajo es aquel donde la capacitancia parasita
presente es baja. Esto es principalmente en perf boards y PCB’s
de baja densidad de routeo.

Ya que hemos deducido esto, debemos de conocer la


capacitancia de TODOS los integrados envueltos en el bus de
datos.

Esta capacitancia se encuentra en los datasheets con la siguiente


configuración:
Bien, ya que tenemos las deducciones, podemos hacer este
cálculo rápido.

Si nuestra capacitancia total es baja (Esto si la de ambiente e


integrados da como bajo) entonces, podemos usar resistencias
pull up de 5K.

Esto sería equivalente a tener una capacitancia parasita menor o


igual a 150pF.

Pero, si nuestra capacitancia total es alta, entonces debemos


usar valores de resistencia de pullup de 1k.

NO debemos de ir debajo de 1k, ya que con esta resistencia


obtenemos una corriente de 5mA en el bus y existen muchos
integrados que no pueden manejar corrientes mayores.
Debemos tener mucha precaución con este aspecto.

Implementación mediante código


Ahora ya podemos comenzar con lo bueno, implementarlo.

La manera en la que veremos los ejemplos se centrará mediante


todos los periféricos que vimos en las expansiones, pero
primero, debemos conocer las instrucciones presentes en las
librerías de mikroC.

La primera instrucción que debemos conocer es:


I2C1_Init(100000);

Esta instrucción se coloca en el void main, ya que es la


instrucción que inicializa el puerto.

Dentro del paréntesis, escribimos la frecuencia de operación del


puerto, esta frecuencia dependerá de muchos factores, pero
suele ser de entre 100KHz a 400Khz en la mayoría de situaciones.

La segunda instrucción a utilizar es:

I2C1_Start();

Esta instrucción se encarga de iniciar la comunicación.

Pero, esto es solo por un instante de tiempo, no significa que la


comunicación estará funcionando sin parar, como veremos más
adelante.
La tercera instrucción a utilizar es:

I2C1_Wr();

Podemos considerar que está instrucción, casi que por regla, será
la instrucción que se escribe después de Start.

Esto es porque utilizamos esta instrucción para 2 cosas.

Primero, para enviar la dirección (Ya sea de lectura o escritura)


del dispositivo con el que tratamos de hacer comunicación.

Y para enviar el dato en caso de que la comunicación sea en


modo escritura.

La cuarta instrucción a utilizar es:

I2C1_Rd();
Esta instrucción se utiliza para leer el dato proveniente del
esclavo en caso de establecer la comunicación en modo lectura.

La última instrucción es:

I2C1_Stop();
Esta instrucción, como su nombre lo dice, detiene la
comunicación y se utiliza al último de todas las instrucciones
previas, ya que significa que ya hemos hecho lo necesario en la
comunicación en cuestión.
PCF8574 en I2C
La primera expansión que usaremos es el PCF8574.

Lo primero que debemos hacer en este caso (Y en cualquier


dispositivo que funcione mediante I2C) es revisar las direcciones.

Existe antes un detalle que debemos de revisar antes de


cualquier cosa en este integrado.

El integrado cuenta con dos variantes disponibles en el mercado.

La variante T y la variante A.

Existen estas dos variantes debido a las direcciones. Ambas


poseen direcciones configurables distintas para poder
implementar una mayor cantidad de expansores en un mismo
bus.

Veamos entonces la tabla de direcciones.

Esta es la tabla de direcciones del PCF8574T:

Y esta es la tabla de direcciones del PCF8574A:

Es por esto que es de extrema importancia que primero revises


la variante que posees, o al comprar revises las variantes que vas
a adquirir.

De lo contrario vas a tener un montón de dolores de cabeza al


momento de implementarlo por no saber qué está pasando.
Para los ejemplos de implementación del integrado vamos a usar
la variante A en todos los ejemplos.

Pero, el método es exactamente el mismo, lo único que cambia


son las direcciones, por lo demás no habrá ningún problema.

¿Cómo configuramos las direcciones del integrado?


Para establecer una dirección, tenemos 3 pines presentes en el
integrado: A0,A1 y A2.

Estos pines los establecemos como 1 o 0 si los conectamos a VCC


o GND.

Esta configuración binaria de 3 bits es la que establece nuestra


dirección.

Entonces, podemos implementar hasta 8 integrados distintos de


la misma variante (A o T).

Si por ejemplo, tenemos A0 a VCC, A1 a GND y A2 a GND.


Entonces tendremos la siguiente dirección de lectura y escritura:

Es por esto que debemos de revisar siempre la tabla para ver que
direcciones podemos establecer mediante software.

Bien, dado que el integrado lo usamos para lectura y escritura,


vamos a ver ambos aspectos por separado.
Lectura

El modo lectura, representa al pin o integrado completo como


entradas.

Estas entradas son de nivel TTL o de 5V. Se configuran de la


misma manera que en un microcontrolador.

Para poder realizar el modo lectura del micro, primero debemos


de enviar la dirección de lectura.

Para este caso, vamos a tener los pines A0, A1 y A2 en GND, por
lo que tendremos la dirección siguiente:

Bien, ya que tenemos la dirección, ahora si podemos iniciar la


lectura.

Nuestro sistema de adquisición quedaría así:


I2C1_Start();

I2C1_Wr(0x71);

var = I2C1_Rd(0u);

I2C1_Stop();

Como puedes ver, primero iniciamos el puerto I2C.

Despues, con el comando write, enviamos la dirección de lectura,


en este caso 71 en hexadecimal.

Posteriormente, hacemos la lectura del puerto I2C


almacenándola en la variable “var”.

¿Muy sencillo no? Pues NO!

Existe otro detalle.

¿Recuerdas la configuración de 8 bits del integrado?

Bien, cada entrada del integrado está representada como un bit,


eso ya lo sabemos.

Pero, no se envía cada bit individual.


Lo que hace el integrado, es enviar el valor en decimal del puerto
entero.

Por ejemplo, si la entrada 0, 2 y 5 están en 1 y las demás en cero,


obtenemos este valor en binario: 00100101.

00100101equivale a 37 en decimal.

Entonces, para poder hacer nosotros la lectura en nuestro


microcontrolador, debemos hacer el proceso inverso.

Debemos de convertir esta señal de ese valor decimal a un valor


binario dividido por bits.

Es decir, debemos extraer el valor en singular de cada bit que


conforma el byte.

¿Y cómo podemos hacer esto?

Para eso existe el recorrimiento de bits.

El recorrimiento de bits, lo que hace es asignar únicamente el


valor del bit indicado dentro del byte.

Para esto, usamos lo siguiente:

(var >> #bit)&&1;

Dentro del paréntesis, colocamos la variable que tiene


almacenado el byte proveniente del integrado.

Luego, usamos “>>” que significa recorrimiento.

#bit indica el bit que vamos a obtener del byte.

Después, fuera del paréntesis, usamos “&&1;” para que solo


adquiera valores de 1 o 0;
Si vamos a obtener los 8 bits del byte proveniente, vamos a
necesitar 8 variables que obtendrán cada valor.

En este caso, usaremos las variables entrada1 a entrada 8.

Nuestro algoritmo de adquisición quedaría entonces de la


siguiente manera:

entrada1 = (var >> 0)&1;

entrada2 = (var >> 1)&1;

entrada3 = (var >> 2)&1;

entrada4 = (var >> 3)&1;

entrada5 = (var >> 4)&1;

entrada6 = (var >> 5)&1;

entrada7 = (var >> 6)&1;

entrada8 = (var >> 7)&1;

Y de esta manera tan sencilla ya podemos implementar nuestra


expansión.

Bien, ahora sí, podemos implementarlo en nuestro código.


Ejemplo
Para este ejemplo, vamos a utilizar el expansor PCF8574A como
entradas completamente. La dirección configurada será de 71 en
hexadecimal, por lo que A0,A1 y A2 estarán puestas a GND.

Cada botón colocado en el expansor controlará la salida


equivalente binaria en el Puerto B.

El circuito que usaremos será el siguiente:

Recuerda que el sistema completo funciona con 5V, por lo que


NO debes usar voltajes mayores.
short var;

short entrada1;

short entrada2;

short entrada3;

short entrada4;

short entrada5;

short entrada6;

short entrada7;

short entrada8;

void main(){

TRISB = 0;

PORTB = 0;

ANSEL = 0;

ANSELH = 0;

C1ON_bit = 0;

C2ON_bit = 0;

I2C1_Init(100000);

while(1){

I2C1_Start();

I2C1_Wr(0x71);

var = I2C1_Rd(0u);
I2C1_Stop();

entrada1 = (var >> 0)&1;

entrada2 = (var >> 1)&1;

entrada3 = (var >> 2)&1;

entrada4 = (var >> 3)&1;

entrada5 = (var >> 4)&1;

entrada6 = (var >> 5)&1;

entrada7 = (var >> 6)&1;

entrada8 = (var >> 7)&1;

if(entrada1 == 1){

RB0_bit = 1;

else{

RB0_bit = 0;

if(entrada2 == 1){

RB1_bit = 1;

else{
RB1_bit = 0;

if(entrada3 == 1){

RB2_bit = 1;

else{

RB2_bit = 0;

if(entrada4 == 1){

RB3_bit = 1;

else{

RB3_bit = 0;

if(entrada5 == 1){

RB4_bit = 1;

else{

RB4_bit = 0;

if(entrada6 == 1){
RB5_bit = 1;

else{

RB5_bit = 0;

if(entrada7== 1){

RB6_bit = 1;

else{

RB6_bit = 0;

if(entrada8 == 1){

RB7_bit = 1;

else{

RB7_bit = 0;

}/////////////////// end while

}/////////////////// end main


Escritura
Ahora haremos el caso opuesto, vamos a usar el expansor en
función de salidas.

Para esto, ahora necesitamos hacer lo opuesto de lo que


haríamos en caso de lectura.

Vamos a mandar el byte del puerto que tengamos como


entradas y el expansor va a interpretarlo en la salida.

Para esto, el algoritmo de envío del byte será el siguiente:

I2C1_Start();

I2C1_Wr(0x70);

I2C1_Wr(PORTB);

I2C1_Stop();

Como puedes ver, en esta ocasión se vuelve muy sencillo, ya que


estamos enviando el valor del puerto B en función de entradas.

Esto porque tenemos la lectura unificada de todo el puerto.

¿Pero esto es así de fácil siempre? No.

En este caso, dado que estamos usando un puerto único como


entradas.

¿Pero qué sucedería si las entradas estuvieran diversas por


distintos puertos?

Aquí es donde ya no es tan fácil. Pero tenemos una solución.

Como dijimos, el proceso en este caso es convertir el valor de bit


individual en un byte único.
Para esto, primero debemos de saber lo siguiente:

¿Qué salida del expansor va a corresponder a que entrada del


micro?

Una vez sabemos esto, debemos entonces hacer la equivalencia


de binario a decimal.

Para esto, vamos a asignar primero cada variable a cada salida


del expansor.

entrada1 = bit0;

entrada2 = bit1;

entrada3 = bit2;

entrada4 = bit3;

entrada5 = bit4;

entrada6 = bit5;

entrada7 = bit6;

entrada8 = bit7;

Bien, ya sabemos el equivalente de cada bit.

Ahora, vamos a establecer el valor decimal que tendrá cada


entrada al estar en 1:

entrada1 = 1;

entrada2 = 2;

entrada3 = 4;

entrada4 = 8;

entrada5 = 16;
entrada6 = 32;

entrada7 = 64;

entrada8 = 128;

¿Por qué hicimos esto?

Bien, hicimos esto porque la variable que representa el byte que


mandaremos al expansor, será una suma de todas las entradas,
de todos sus valores en decimal.

De esta manera, unimos cada bit en un único byte y le damos el


valor en decimal correspondiente, desde el LSB hasta el MSB.

Entonces, la variable de salida quedaría de la siguiente manera:

salida = entrada1 + entrada2 + entrada3 + entrada4 + entrada5 +


entrada6 + entrada7 + entrada8;

Y la enviamos de la siguiente manera:

I2C1_Start();

I2C1_Wr(0x70);

I2C1_Wr(salida);

I2C1_Stop();
Ejemplo
Para este ejemplo, implementaremos lo anterior.

Vamos a usar cada entrada del micro para poder controlar las
salidas del expansor.

En este caso, haremos primero el muestro con un único puerto,


en este caso el puerto B.

Siendo equivalente el bit de la entrada del micro con el bit de


salida del expansor, en términos de posición binaria.

Debemos de colocar resistencias pullup en cada salida del


integrado para poder entregar la corriente necesaria en cada led.
short salida;

void main(){

TRISB = 0;

PORTB = 0;

ANSEL = 0;

ANSELH = 0;

C1ON_bit = 0;

C2ON_bit = 0;

I2C1_Init(100000);

while(1){

salida = PORTB;

I2C1_Start();

I2C1_Wr(0x70);

I2C1_Wr(salida);

I2C1_Stop();

}/////////////////// end while

}/////////////////// end main

Вам также может понравиться