Haz una pregunta
  Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos
Foros Registrarse ¿Olvidaste tu contraseña?

Temas similares

13/10/2013 #1


Retardo entre PWM atmega168
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


Código PHP:


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

#define F_CPU 8000000UL

unsigned char tcnt1cont;
unsigned char duty_cyc_a,duty_cyc_b;

int main(void){
    

    
DDRB0xFF;
    
DDRD0xFF;
        
    
    
TCCR1A 0xA1;
    
TCCR1B 0x0B;
    
TIMSK1 |= (<< 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 |= (<< 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.
13/10/2013 #2


He logrado generar un desfase pero con un delay que no me conviene mucho para mis propositos

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?
13/10/2013 #3

Avatar de Scooter

Si, posible y recomendable casi imprescindible.
Usa un timer.

¿Estás usando el módulo pwm o lo haces por soft?
13/10/2013 #4


estoy usando el timer 1 del atmega 168 y esta en modo CTC el timer
16/10/2013 #5

Avatar de StrySG

Usando un timer, cualquiera digamos que el el TC0 intenta con un código similar en la rutina de interrupcion por sobreflujo:

Código 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
Tema Cerrado
¿Tienes una mejor respuesta a este tema? ¿Quieres hacerle una pregunta a nuestra comunidad y sus expertos? Registrate

Foros de Electrónica » Diseño digital » Microcontroladores y sistemas embebidos

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2017, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO ©2011, Crawlability, Inc.