Source: https://aprendiendoarduino.wordpress.com/category/pwm/page/2/
Timestamp: 2019-07-18 05:13:09+00:00

Document:
PWM | Aprendiendo Arduino | Página 2
Archivo de la categoría: PWM
Entradas y Salidas Arduino
El ATmega328p como cualquier otro microcontrolador tiene registros, algunos de estos registros están relacionados con los puertos de entrada/salida, cada puerto tiene un nombre específico y sus registros asociados, de hecho, el 328p tiene el puerto B, C y D, y cada puerto un diferente número de pines (Esta es una restricción del paquete de 28 pines PDIP y no desde el microcontrolador, ya que un PDIP 40 pines, por ejemplo, tiene 4 puertos con los 8 bits cada uno), el único puerto que tiene el total de sus 8 pines de entradas/salidas es PORTD.
Entradas y Salidas Digitales a Fondo
Pero a bajo nivel estas funciones están manejando registros. Para empezar hay un registro dedicado para cada puerto que define si cada pin es una entrada o una salida, que es el registro de DDRX, donde x es la letra del puerto que queremos configurar, en el caso de la Arduino hay DDRB, DDRC y DDRD. Como toda variable lógica, cada bit en los registros DDRX puede ser 1 ó 0, poner un bit específico de DDRX a 1 configura el pin como salida y ponerla a 0 configura el pin como una entrada.
Para ATmega328p ver el fichero iom328p.h donde se encuentran las definiciones para el microcontrolador. Ver que las direcciones de los registros van desplazados 0x20 posiciones de memoria por los registros de propósito general.
Probar con este código (Ejercicio 59):
Serial.println("DDRD - The Port D Data Direction Register. DDRX 1 OUTPUT 0 INPUT");
#define PORTA _SFR_IO8(0x02)
#define TCNT3 _SFR_MEM16(0x94)
#define CANIDT _SFR_MEM32(0xF0)
Las limitaciones eléctricas en el microcontrolador son por puerto y por pin:
Un ejemplo que configura pines 0,1,2,3 como entradas digitales y los pines 4,5,6,7 como salidas digitales: DDRD = 0b11110000; y todos los pin como salidas: DDRD = 0b11111111;
Se debe tener cuidado cuando se utiliza PORTD y el puerto serie porque los pines 0 y 1 del PORTD son los utilizados por la USART y si se pone estos dos como entradas o salidas, la USART será incapaz de leer o escribir datos en los pines. Este es un ejemplo de cuidado que se debe tener al usar esta programación en lugar de la capa de programación que nos ofrece Arduino.
my_var = (PIND & (1<<PD1)); /* Le el pin 1 de PORTD y lo coloca en la variable. */
También se puede utilizar la macro Px0..7 varias veces en una misma instrucción, por ejemplo, en este código, se ejecutará algo de código sólo si se pulsa dos botones al mismo tiempo:
/* Algún código dentro del if() que se ejecutará solo si los dos botones se
encuentran activados. */
Ver ejemplo Leer_pin en https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio59-Puertos_Digitales/
En un sentido básico esto es todo lo que se necesita saber para dominar la manipulación directa de los puertos. La manipulación de bits enseña cosas más ingeniosas como las máscaras de bits, las operaciones AND, OR, NOT y XOR y cómo configurar y limpiar los bits en un registro y algunos buenos trucos con los operaciones de desplazamiento derecho e izquierdo, todas cosas bueno a saber, ya que puede acelerar un sketch y son muy útiles cuando se utilizan los puertos digitales.
Debemos ser conscientes de que un botón no da una buena y transición limpia entre 0 a 1 o de 1 a 0, pero en su lugar la señal puede tener problemas de rebote, esto es debido a las propiedades mecánicas del botón y no un defecto de diseño. Hay dos maneras, mediante un condensador pequeño cerca de la botón para el rebote del valor, o que esta eliminación de rebotes esté en el mismo código, que es más fácil de hacer cuando tenemos un montón de botones y es más barato que la adición de una gran cantidad de componentes a nuestro circuito. La forma más simple de de hacer esto es sólo insertar un pequeño retraso entre las consecutivas lecturas de un botón, esto es un método de bloqueo, porque el microcontrolador se detendrá por algunos milisegundos, hay otras formas más inteligentes que usar temporizadores, pero para proyectos de 2 ó 3 botones que no requieren una sincronización muy precisa se trata de una método de uso común.
Ejercicio Entradas y Salidas Digitales
Ver ejercicio simple con los registros PORT, PIN y DDR y sacarlos por pantalla.
Ejercicio Registros_PORT_simple y leer_pin de https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio59-Puertos_Digitales/
Solución: ejercicio Velocidad_Read de https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio59-Puertos_Digitales/
Entradas y Salidas Analógicas a Fondo
Ya hemos visto cómo manejar con registros las entradas y salidas de Arduino, pero nos centrado en las digitales. Para el caso de las entradas y salidas analógicas hay algunos detalles adicionales que no se han visto. La forma de manejar con registros las entradas analógicas correspondientes al puerto C con POR y PIN es para usar esos pines como I/O digitales, puesto que los pines de los microcontroladores son multipropósito como se ha dicho anteriormente.
En las entradas analógicas entran en juego los conversores Analógico Digital (ADC) y en las salidas analógicas entra el PWM que usa uno de los timers de microcontrolador para hacer la forma de onda PWM.
Toda la información de ADC para entradas analógicas se encuentra en la página 305 y la información de PWM para salidas analógicas está en la página 125, 149 y 189 de http://www.atmel.com/Images/Atmel-42735-8-bit-AVR-Microcontroller-ATmega328-328P_datasheet.pdf
Las Salidas PWM (Pulse Width Modulation) permiten generar salidas analógicas desde pines digitales. Arduino Uno no posee salidas analógicas puras. El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de audio usando la librería correspondiente.
Los microcontroladores usan varios modos de PWM, uno de ellos el el Fast PWM que puede ser generado con 8, 9 y 10 bits, una resolución mayor de 8 bits solo es posible usando un timer de 16 bits. Otro modo de PWM es Phase Correct PWM que es el que debería usarse para el control de motores. Otro modo es Frequency and Phase Correct PWM.
El modo PWM en el AVR se controla por hardware. Esto significa que todo, se lleva a cabo por la CPU AVR. Todo lo que necesita hacer es inicializar e iniciar el temporizador, y establecer el ciclo de trabajo. El ATmega328p tiene 3 timers PWM para controlar 6 salidas PWM. Estos temporizadores generan interrupciones cuando alcanzan el overflow o cuando alcanzan el registro de comparación. Los registros de control del timer/counter n (n va de 0 a 2) son TCCRnA y TCCRnB y tienen los principales controles de los temporizadores.
TCCR0B – Timer/counter0 Control Register
Para utilizar fast PWM rápido dos modos para elegir, los modos 3 y 7, la principal diferencia entre estos dos modos es que en el modo 3 TOP se fija en 0xFF y en el modo de 7 TOP es definido por el registro TOP, esto significa que si existe la necesidad, podemos cambiar el número máximo que el temporizador hará hasta que haga overflow, así que esto significa que podemos controlar la frecuencia y el ciclo de trabajo.
También se puede hacer PWM en todos los pins, programando nosotros en lugar de dejarlo a la CPU del microcontrolador: http://playground.arduino.cc/Main/PWMallPins
El microcontrolador de Arduino UNO contiene en la placa un conversor analógico a digital de 6 canales. El conversor tiene una resolución de 10 bits, devolviendo enteros entre 0 y 1023. Los pines analógicos de Arduino también tienen todas las funcionalidades de los pines digitales. Por lo tanto, si necesitamos más pines digitales podemos usar los pines analógicos.
Aunque el ATmega328P tiene 6 pines que son capaces de ser utilizados como pines de entrada analógicos (Port C), sólo hay un ADC en el microcontrolador, pero entre el ADC y los pines hay un multiplexor analógico, esto permite que podamos elegir qué pin está conectado al ADC, esto significa que aunque podemos utilizar todos los pines, sólo se puede leer el valor de uno de ellos a la vez, para casi todas las aplicaciones esto es más que suficiente, pero en algunos casos limitados que necesitan lecturas ADC de alta velocidad se podría necesitar el uso de ADC externos. En el caso de la ATmega328P los pines que se pueden utilizar una entrada analógica son todos los del puerto C.
También se puede cambiar la tensión máxima (siempre por debajo de Vcc) que utiliza el ADC, es la llamada tensión de referencia y es la tensión contra la que todas las entradas analógicas hacen las conversiones. Esta tensión de referencia se toma del pin Aref. Reducir el voltaje máximo del ADC tiene sentido para mejorar la resolución del ADC. Con 5V la resolución es de 5/1023 = 4,88 mV para cada valor, pero para un sensor que no pasa de 3.3V la resolución es de 3.3/1023 = 3.22mV.
El ADC en microcontroladores AVR utiliza una técnica conocida como aproximación sucesiva mediante la comparación de la tensión de entrada con la mitad de la tensión de referencia generada internamente. La comparación continúa dividiendo de nuevo la tensión y actualizando cada bit del registro ADC a 1 si el voltaje es HIGH en la comparación o 0 en el otro caso. Este proceso tiene dura 10 veces (por cada bit de resolución del ADC) y genera como resultado la salida binaria.
ADMUX: ADC Multiplexer Selection Register. Selector del canal del multiplexor del ADC y el voltaje de referencia.
ADCSRA: ADC Control and Status Register A. Control del ADC y su estado.
DIDR0: Digital Input Disable Register 0. Para deshabilitar la entrada digital de los pines analógicos.
Esta entrada se publicó en Arduino, Entradas Analógicas, Entradas Digitales, Microcontrolador, PWM, Salidas Analógicas, Salidas Digitales y está etiquetada con Arduino, Entradas Analógicas, Entradas Digitales, PWM, Salidas Analógicas, Salidas Digitales en 8 noviembre, 2016 por jecrespom.
Primeros pasos con Arduino: http://jecrespo.github.io/PrimerosPasosArduino/
Detectar flanco: https://github.com/jecrespo/Aprendiendo-Arduino/tree/master/Ejercicio52-Detectar_Alarma
Esta entrada se publicó en Arduino, Entradas Analógicas, Entradas Digitales, PWM y está etiquetada con Arduino, Entradas Analógicas, Entradas Digitales, PWM en 6 noviembre, 2016 por jecrespom.
Ejercicio: Leer un voltaje analógico y sacarlo por consola. Conectar un potenciómetro en la entrada analógica A0, leer su valor e iluminar el LED en función del valor leído.
Ejercicio Smoothing: Leer una entrada analógica llegada de un potenciómetro y sacar por el puerto serie la media de los últimas 10 lecturas. Luego hacer una transición más suave al escribir en el puerto analógico.
Para los más avanzados mezclar con la práctica de dimmer para que saque el valor más alisado a un LED y gradualmente.
Ejercicio Avanzado: Hacer una versión del coche fantástico pero usando el smoothing para que haya un led encendido al 100% y los de al lado al 50% y los siguientes al 25%.
Esta entrada se publicó en Arduino, Entradas Analógicas, Práctica, PWM, Salidas Analógicas y está etiquetada con Arduino, Entradas Analógicas, Práctica, PWM, Salidas Analógicas en 2 julio, 2016 por jecrespom.
El arduino due, posee dos salidas analógicas puras mediante dos conversores digital a analógico. Estos pines pueden usarse para crear salidas de audio usando la librería correspondiente.
Más información de tone() en:
Esta entrada se publicó en Arduino, Entradas Analógicas, PWM, Salidas Analógicas y está etiquetada con ADC, Arduino, DAC, Entradas Analógicas, PWM, Salidas Analógicas en 2 julio, 2016 por jecrespom.

References: resolución 
 resolución 
 resolución 
 resolución 
 resolución 
 resolución