Retardo entre PWM atmega168

Estado
Cerrado para nuevas respuestas.
#1
Hola a la comunidad.

Mi problema es que necesito generar 2 señales PWMs, un PWM fija y la otra que varíe de 0° a 180° con respecto a la primera, osea generar un retardo entre las señales, y la verdad es que estoy medio perdido, cree un codigo C en avr studio 6


PHP:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>

#define F_CPU 8000000UL

unsigned char tcnt1, cont;
unsigned char duty_cyc_a,duty_cyc_b;

int main(void){
	

	DDRB= 0xFF;
	DDRD= 0xFF;
		
	
	TCCR1A = 0xA1;
	TCCR1B = 0x0B;
	TIMSK1 |= (1 << TOIE1);
	
	TCNT1=0;
	
	//tcnt1= ~TCNT1;
	
	OCR1A = 127;
	OCR1B = 127;

	sei();
    
	while(1)
    {}
		
}

ISR(TIMER1_OVF_vect){
	
	cont++;
	
	if (cont>200){
		
		TCCR0A = 0xA3;
		TCCR0B = 0x03;
		TIMSK0 |= (1 << TOIE0);
		
		TCNT0=0;
		
		 while(duty_cyc_a < 255) {
			 OCR0A=127;
			 
		 }

	} 
	
}
La verdad es que necesito ayuda para resolver este problema

saludos y gracias de antemano.
 
#2
He logrado generar un desfase pero con un delay que no me conviene mucho para mis propositos :cry:

el codigo fuente es este, si a alguien le sirve, he probado un codigo bastante similar en arduino y funciona solo hay que configurarlo y hacer calculos para el proposito de cada uno.


Código:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/delay.h>
#include <util/delay.h>

#define F_CPU 8000000UL

unsigned char tcnt1, cont;
unsigned char duty_cyc_a,duty_cyc_b;
unsigned int t_d;


int main(void){
	

	DDRB= 0xFF;
	
		
	// Timer 1
	
	cli();
	
	TCCR1A=0;
	TCCR1B=0;
	
	TCCR1B |= (1<<WGM12);
	TCCR1B |= (1<<CS10);
	TCCR1B |= (1<<CS12);
	TIMSK1=(1<<OCIE1A);// | (1<<TOIE1);
	OCR1A=1;
	
	sei();
    
	
	
	while(1){
		
	}
		
}

ISR(TIMER1_OVF_vect){
	
	
	cont=cont+1;
	
}

ISR(TIMER1_COMPA_vect){
	
	
	PORTB=PINB^0b00000010;
	
		
	if(cont=10){
		_delay_us(800);
		
		PORTB=PINB^0b00000100;
		
	}
	
}
es posible hacer el retardo sin delay?
 
Última edición:
#5
Usando un timer, cualquiera digamos que el el TC0 intenta con un código similar en la rutina de interrupcion por sobreflujo:

PHP:
ISR(SIG_OVERFLOW0)   //vector de interrupcion de sobreflujo del Timer0
{
    ci++;
    pwm1++;
    pwm2++;

    if(pwm1>=PWM1)
    {
       Pin1_off();//la rutina o acciones que quieras por ejemplo poner un pin a 0
    }
    if(pwm1>=PWM2)
    {
        Pin2_off();//la rutina o acciones que quieras por ejemplo poner un pin a 0
    }

    if(ci>=100)   //total de 100 interrupciones por sobreflujo que cuenta "ci"
    {
        pwm1=pwm2=0;
        //la diferencia entre PWM1 y PWM2 tal vez sea el "retardo" que buscas
        Pin1_on();
        Pin2_on();     
        ci=0;                //vuelta a la normalidad
    }
}
Donde todas las variables son globales con la palabra reservada volatile (de otro modo no funciona)
PWM1 y PWM2 son tus "límites" que deberían estar definidos en algún lugar de tu programa.
Espero entiendas la idea :D
 
Estado
Cerrado para nuevas respuestas.

Temas similares


Arriba