Hacer un convertidor basado en el microcontrolador (4 / 5 paso)

Paso 4: Código microcontrolador

He puesto mi trabajo código a Github.  Tiene algunas piezas:

Estas declaraciones const y #defines hacen cálculos de tiempo de compilación para que el código sólo tiene que hacer comparaciones de uint8_t simple en lugar de punto flotante que no es factible en un microcontrolador.  Usando const las fuerzas al tipo del resultado uint8_t y alienta el compilador para hacer el cálculo en tiempo de compilación.

#define PWM_FREQ 62500
#define PWM_RESOLUTION (F_CPU / PWM_FREQ)
#define MIN_DUTY_CYCLE 0.40
#define MAX_DUTY_CYCLE 0.80
const uint8_t MIN_PWM_LEVEL = PWM_RESOLUTION * MIN_DUTY_CYCLE;
const uint8_t MAX_PWM_LEVEL = PWM_RESOLUTION * MAX_DUTY_CYCLE;

#define VREF 1.1
#define DESIRED_VOUT 20.0
#define DIVIDER_RATIO 30.0
#define DESIRED_ADC_IN_V (DESIRED_VOUT / DIVIDER_RATIO)

const DESIRED_ADC_RESULT de uint8_t = 255 * DESIRED_ADC_IN_V / VREF;

Definen algunos macros de utilidad para que el código es más fácil de seguir:

#define DUTY_CYCLE_REG OCR0B

#define ADC_ENABLE() (ADCSRA | = _BV(ADEN))
#define ADC_START_CONVERSION() (ADCSRA | = _BV(ADSC))

La función principal tiene una fase de configuración inicial donde da vuelta en los varios periféricos que necesitaremos:

int Main {}
/ * Establecer A7 como una salida.  (Necesario para el PWM). */
DDRA | = _BV(DD7);
PORTA = 0;

/ * Deja alimentación estabilizar... * /
_delay_ms(500);

/*
* Configurar el Timer0 como un PWM rápida.  Será
* - activar el pin de salida al inicio de cada ciclo
* - lo apague cuando el valor llega DUTY_CYCLE_REG
* - Envuelva a 0 cuando sale OCR0A
*/
TCCR0A = _BV(COM0B1) | _BV(WGM01) | _BV(WGM00);
OCR0A = PWM_RESOLUTION;
/ * Arrancar con ciclo de trabajo 40% y la rampa evitar la avalancha. */
DUTY_CYCLE_REG = (uint8_t)(PWM_RESOLUTION * 0.40);
/ * Establecer la fuente de reloj Timer0 que oscilador principal. Esto permite que el temporizador. */
TCCR0B = _BV(CS00) | _BV(WGM02);

/*
* Encienda el ADC,
* - utilizar la referencia de tensión interna.
* - configurar ADC0 como fuente
* - izquierda-ajustar el resultado, 8 bits es suficiente para nosotros
* - desactivar el búfer de entrada digital en el pin
* - permiten el ADC.
*/
ADMUX = / * REF = * / _BV(REFS1) | / * ENTRADA = * / 0;
ADCSRA | = / * PRESCALER = 16 = 2 ^ * / 4;
ADCSRB | = / * AJUSTE IZQUIERDA * / _BV(ADLAR);
DDRA & = ~ _BV(DD0);
DIDR0 | = _BV(ADC0D);
ADC_ENABLE();
_delay_ms(1);

Entonces, simplemente lazos, leer el valor analógico desde el potenciómetro y comparándolo con su objetivo:

mientras que {} (1)
/ * Esperar el Timer0 desborde... * /
loop_until_bit_is_set (TIFR0, TOV0);
/ * Final de nuestro OFF, debe ser voltaje máximo... * /
TIFR0 | = _BV(TOV0);  / * Borrar la bandera. */

/ * Comprobar el voltaje de salida. */
ADC_START_CONVERSION();
loop_until_bit_is_clear (ADCSRA, ADSC);
adc_result de uint8_t = ADCH;

Si (adc_result < DESIRED_ADC_RESULT & &
DUTY_CYCLE_REG < MAX_PWM_LEVEL) {}
DUTY_CYCLE_REG ++;
}
else if (adc_result > DESIRED_ADC_RESULT & &
DUTY_CYCLE_REG > MIN_PWM_LEVEL) {}
DUTY_CYCLE_REG--;
}
}
}

Artículos Relacionados

Cómo hacer un Sprite basado en juego para la 3DS y DSi familia

Cómo hacer un Sprite basado en juego para la 3DS y DSi familia

Hola. Este es el seguimiento de mi instructable. Si usted no ha visto todavía, entonces yo le aconsejo que verlo. Hoy, voy a mostrar cómo hacer un sprite basado en juego en el equipo de Petit. Si no sabes lo que significa, luego me explico. Un sprite
Cómo hacer brazo robot basado en Adunio de una impresora 3D y iphone 6s en una camara PTZ

Cómo hacer brazo robot basado en Adunio de una impresora 3D y iphone 6s en una camara PTZ

Después de día y trabajo de noche, finalmente hicimos Dobot una impresora 3D de alta precisión del brazo! Es diferente de la tradicional impresora 3D Delta y XYZ. Puede ser el primer brazo robótico escritorio que puede utilizarse para la impresión 3D
Hacer un Attiny13 basado en sensor de proximidad infrarrojo para $2,42

Hacer un Attiny13 basado en sensor de proximidad infrarrojo para $2,42

Nota: el diagrama está mal. El pin de sentido va en el pin 6 (uno más a la izquierda), no pin 5. Pronto actualizaré el diagramas. Gracias a brmccollum por la corrección. (Diagramas ahora fijados)Se trata de un sensor de proximidad de IR muy barato qu
Hacer un texto basado en la aventura

Hacer un texto basado en la aventura

Que siempre quisiste crear tu propio texto basado juego gratis sin complicaciones. Bien esto es para ti. Todo lo que vas a necesitar es una idea creativa y un ordenador. ¿Así permite comenzar?Paso 1: El código que va a utilizarAsí que para comenzar c
Cómo hacer un Arduino basados en luz con control remoto infrarrojo de la noche!

Cómo hacer un Arduino basados en luz con control remoto infrarrojo de la noche!

Aquí está un Instructable que le mostrará cómo construir una noche de la Arduino basado en luz conpequeño control remoto infrarrojo que permite recorrer 10 pre set colores y un desvanecimiento al azarrutina de color que lazos para siempre.Este instru
Hacer un juego SNES controlador basado en Arduino

Hacer un juego SNES controlador basado en Arduino

en este instructable, le mostraré cómo un controlador SNES, enganchar a un Arduino y un simple Simon Says juego.Esto podría ser usado para crear un juego más complejo, o tal vez incluso tratar de hacer un Arduino basado en mini-console.  Finalmente,
Cómo elegir un microcontrolador

Cómo elegir un microcontrolador

solía ser que el número de chips microcontroladores diferentes disponibles para el aficionado era bastante limitado. Tienes que usar lo que usted pueda llegar a comprar en el distribuidor de chip por correo, y que se redujo por la elección a un peque
Hacer un arrastre zombi Robot con patas cortadas

Hacer un arrastre zombi Robot con patas cortadas

Somos todo amor zombies y robots, dos de las cosas que son más probables ser el deshacer un día. Permite ayudar a cosas a lo largo con la construcción de un zombie espeluznante pequeño robot.Mi objetivo con este Instructable es tomar una muñeca y (re
Basados en Arduino - sistema de Control para la PC del coche del RPi

Basados en Arduino - sistema de Control para la PC del coche del RPi

Hola a todos! Michalis Vasilakis de www.ardumotive.com y en esta guía de le mostrará cómo hacer un simple - basados en Arduino - sistema de Control para la PC del coche del RPi.Este sistema está diseñado para evitar el cierre abrupto del PRi coche si
Atmel Inicio 2: Fusibles y circuitos de microcontroladores

Atmel Inicio 2: Fusibles y circuitos de microcontroladores

M. A. Parker c2015Fusibles y circuitos crea un circuito simple pero importante en protoboard de un experimentador que se utilizará como plataforma básica para muchos proyectos de microcontrolador y los parámetros del microcontrolador (es decir, fusib
¿Monopatín con LEDs y microcontrolador PIC

¿Monopatín con LEDs y microcontrolador PIC

lo que se obtiene cuando un ingeniero construye un patín desde cero para regalo de Navidad a 13 años de edad? Usted consigue un patín con ocho LEDs blancos (linternas), ocho LEDs rojos (tailights) todos controlados por PIC microntroller! Y añadiré, u
Cómo programa AVR microcontroladores, barato y fácil

Cómo programa AVR microcontroladores, barato y fácil

Este instructivo se guía usted paso a paso cómo hacer un sencillo programa en un microcontrolador ATMEGA (uC). Si usted don´t conoce acerca de cómo el código se almacena en microcontroladores, básicamente hay 3 pasos que usted puede tomar y que estam
Partir de microcontroladores parte 1

Partir de microcontroladores parte 1

Esta es la primera de una larga serie de tutoriales dirigidos a proporcionar una guía de principiantes y un tutorial basado en el Microcontrolador AVR de Atmel Atmega32. Voy a mostrar que, a través de ejemplos y proyectos, cómo programar y prever fun
Cómo hacer tus botas de cuero duran para siempre (o por lo menos ya que el siguiente individuo)

Cómo hacer tus botas de cuero duran para siempre (o por lo menos ya que el siguiente individuo)

buenas botas no son baratos. Cargadores baratos no son buenos. Como un liniero de utilidad, paso mucho tiempo fuera, bajo duras condiciones en el trabajo. Mis botas, mientras duro (tienen que ser), a menudo, pagar el precio como slog por barro, agua,