¿Cómo generar una señal pwm que varíe al menos 20 veces entre el rango de 0-5V usando Atmeaga32 avr mcu?

Estoy haciendo un proyecto de registrador de datos fotovoltaico (PV) en esto, se puede usar un MOSFET de potencia (IRFZ34N) como carga. Entonces, quiero variar el voltaje de la puerta usando una señal PWM (rango 0-5v) de MCU y necesito al menos 2o puntos variables. así que estoy confuso al escribir un código 'C' para generar una señal PWM. como 1. ¿Cuál debería ser el período de tiempo de PWM? 2. ¿Cómo puedo variar el ciclo de trabajo de pwm en diferentes pasos? y etc..

Y por favor, ayúdenme, si hay algo más que deba hacer para que mi proyecto sea todo un éxito. Estaría muy agradecido si algún organismo me ayudara con la respuesta.

Respuestas (2)

Puede hacer esto en el software y realizar un seguimiento de todos los tiempos requeridos usted mismo, pero la mayoría de los microcontroladores tienen hardware que puede generar PWM de forma autónoma después de inicializarlo. Las cosas básicas son un temporizador/contador y un registro de comparación de salida (OCR):

ingrese la descripción de la imagen aquí

El contador aumenta continuamente, representado por la pendiente, y se compara con el OCR. La salida PWM baja cuando el contador excede el OCR y vuelve a subir cuando se reinicia. La resolución del 5 % que necesita (20 pasos) no es un problema; un temporizador de 16 bits puede generar PWM con una resolución superior al 0,002 %, e incluso un temporizador de 8 bits puede generar un 0,4 %.

Todo lo que tiene que hacer es programar un nuevo valor en el OCR. Cuanto menor sea el valor, menor será el ancho de pulso. La siguiente animación es de este sitio :

ingrese la descripción de la imagen aquí

Lectura adicional
Uso del PWM de alta velocidad del AVR , una nota de aplicación de Atmel.
La hoja de datos de ATMega32 describe en la página 69 y siguientes. cómo usar Timer0 para la operación PWM.

¿Imágenes en movimiento, en internet? Eso cuenta por al menos 10.000 bonitos votos.
@Kortuk - 10,000 por fotograma, ¡espero! :-) Escuché que hay un invento completamente nuevo en el que puedes hacer imágenes en movimiento aún más rápidas, creo que lo llaman cinematografía, o algo así. No sé si también hay sonido, quizás en el futuro. ;-)

Asumiendo que su microcontrolador tiene un módulo PWM, entonces es bastante simple. Debe leer la hoja de datos y configurar su módulo en consecuencia, luego cargar los valores apropiados en el registro del ciclo de trabajo (generalmente "comparar"). Aquí hay un ejemplo aproximado: configura un temporizador para la frecuencia PWM deseada (fija), luego modifica un registro para cambiar el tiempo de ENCENDIDO/APAGADO en este período.
Digamos que tiene un módulo PWM de 10 bits. 10 bits = 2^10 = 1024. Entonces, para un ciclo de trabajo del 50 %, debe cargar 512 en el registro, para un 25 %, 256 y así sucesivamente (la operación específica de su módulo PWM puede ser un poco diferente).
Luego, agrega un valor bajo pase el filtro (el filtro RC simple generalmente será suficiente) frente al PWM para promediar el PWM y producir un voltaje de CC variable:

filtro PWM

Filtro RC

Para el filtro, debe asegurarse de que la frecuencia PWM se atenúe en gran medida, dejando las frecuencias más bajas, ya que dice que todo lo que necesita es CC, entonces algo como R = 10k C = 0.1uF será suficiente. Esto creará un corte de 1/(2pi * 10k * 0.1uF) = 159Hz. Elija una frecuencia PWM muy por encima de esto (por ejemplo, 10 kHz)

Noté la etiqueta AVR: no uso AVR (por lo que no puedo responder personalmente por la información a continuación), pero busqué en Google y encontré un par de tutoriales bastante buenos: Guía de
Aquaticus PWM Guía de
AVR Freaks PWM
Ejemplo de onda sinusoidal de PWM

En caso de que no quiera usar el módulo PWM (o necesite PWM en un pin específico), aquí hay un código PWM "suave":

 // The following two ISRs are doing "poor man's PWM" 
//  but this allows it to be on a pin of my choice 
ISR(TIMER0_COMP_vect) { 
        // clear the output pin on OCR0 match 
   PORTC &= ~(1<<PC0); 
} 
ISR(TIMER0_OVF_vect) { 
        // set the output pin at timer overflow 
   PORTC |= (1<<PC0); 
} 

int main(void) { 

   // going to use PORTC.0 to PWM the contrast voltage 
   DDRC = (1<<DDC0); 
   TIMSK |= ((1<<OCIE0) | (1<<TOIE0)); // use both interrupts
   OCR0 = 10; // 10 out of 256 means very short on period (low voltage) 
   TCCR0 = (1<<CS00); // timer on - nice high PWM frequency 

   // Might later consider PWMing the backlight voltage too 
   // so it would also be adjustable ... 
   sei();