Atmega16 pwm

ola es que soy nuevo en la progamicion de micros y tengo como preyecto hacer un pwm con un ATmega 16 me han dicho que es muy facil pero no entiendo nada si me pudiesen ayudar se los agradesco mucho el proyecto es que el micro genere la señal de reloj producida en el cricuito pòr el 555 ,osea reemplazar el 555 por el micro
 

Adjuntos

  • img061.jpg
    img061.jpg
    163.7 KB · Visitas: 62
En mi opinión, deberías poner el opto de entrada directo a una entrada de interrupción, y usar la salida del temporizador que quieras usar (OCRnx) a la entrada del optodíac. Un potenciómetro a la entrada analógica para el ajuste, aunque este punto igual te interesa que sea más flexible (teclas, puerto serie, etc).
 
Buenas noches.

Deseo implementar un seguidor de lineas, el cual tenga como unidad de control un micro Atmega16, aprovechando los dos timers de 8 bits que posee (Timer0 y Timer2) para realizar un Fast pwm, los timer los configure de la siguiente forma: Fast Pwm, sin prescalado y no inversor, asi como se muestra en el siguiente codigo:

DDRB=0x08;
DDRD=0x80;
TCCR0|=(1<<WGM00)|(1<<COM01)|(1<<CS01)|(0<<CS00);
TCCR2|=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(1<<CS21)|(0<<CS20);

El ciclo de trabajo lo defino entre 0 y 255, siendo 255 el 100% y este valor se asigna al OCR0 y OCR2, mi problema radica en lo siguiente:

OCR0=255;
OCR2=255;

Cuando defino un ciclo de trabajo del 100% a los dos timers, los motores giran rapido, pero cuando disminuyo el ciclo util al 50% de UN timer y el otro lo dejo en 100%, el motor que esta al 100% ya no gira a la misma velocidad con que giraba cuando los dos tenian el ciclo util de 100%.

No se si estos dos timer tienen alguna dependencia, pero yo lo unico que deseo es poder sacar dos pwm independientes del atmega16 para asi controlar mis motores.

Realize un video con el problema simulado, para que me entiendan mucho mejor.


Muchas gracias de antemano. ;)
 
bueno con 1 solo timer puedes hacer el pwm
o sin timer eso es algo relativamente censillo

solo debes hacer un incremento

y definir hasta donde se hara el incremento es decir un periodo de X tamaño

y jugar con el flanco de subida por ejemplo
 
Buenas tardes.

Estoy realizando un seguidor de líneas con un Atmega16 en lenguaje C.

El código de funcionamiento es este:
Básicamente lo que hago es analizar los casos del sensor y activar el puente h para que gire a la derecha o izquierda según corresponda a través del puerto C.

Código:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <adc_otro/adc.h>
#include <adc_otro/adc.c>


int main(void)
{
    DDRA=0x00;
    DDRC=0xFF;
    DDRD=0x0F;
    DDRB=0x01;    
    char izq,der;
    while(1)
        {
            izq=adc_read(0);
            der=adc_read(1);                        
            if((izq>210)&&(der>210))  //CASO 1   -> ADELANTE
                {
                    PORTC=0x17; 
                    PORTD=0x01;
                }
            if(izq<200)   //CASO 2    -> GIRAR DERECHA
                {
                    PORTC=0x07;    
                    PORTD=0x02;
                }
            if(der<200)   //CASO 3    -> GIRAR IZQUIERDA
                {
                    PORTC=0x13; 
                    PORTD=0x04;
                }                        
        }    
}

La libreria del adc que uso es:

#include <avr/io.h>


unsigned char adc_read(unsigned char x)
{
 unsigned char adch; 

  ADMUX = (1<< ADLAR) | (x);          
 
  ADCSRA = (1<<ADEN)|(1<<ADSC)|(0<<ADATE)|(0<<ADIF)|(0<<ADIE)|(0<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
    
  while(!(ADCSRA& (1<<ADIF)))
              ;

  adch = ADCH;
  ADCSRA = (1<<ADIF);

  return adch;
}
Mi problema es:
El ADC lee bien y funcionan bien los motores pero por poco tiempo, aproximadamente 20s, pasados los 20s el ADC ya no lee nada y toca reiniciar el micro. ¿Qué puede estar pasando?

Gracias de antemano.
 
Última edición por un moderador:
Aunque es lo mismo que te sugiere duke1226 usando el ATMEGA16, mas cómodo es usar ARDUINO UNO por ejemplo.
El lenguaje para programarlo es mas amigable que el uso del mismo micro bajo C standard.
mira por tu cuenta

Arduino
 
puede que tu problema sean desbordamientos de memoria

no es lo mismo char que unsigned char

no hagas caso de aurduino te vaz a mal acostumbrar y no aprenderas a programar

cuando usas char
el valor en un char es de -127 a127
y en un unsigned char va de 0 a 255

cuando usas char y en el ADC hay un unsigned char va haber un desborde de memoria segurito y los if dejan de trabajar

solo debes correjir poniendo unsigned char y ya! o trabajar con int
 
Atrás
Arriba