Está en la página 1de 6

MICROCONTROLADORES

Informe final 5
Pregunta2:
Generar una onda PWM con 100 ms de periodo y 20% de DUTY CYCLE. El porcentaje de DUTY
CYCLE variara en 10% cada vez que se presiona la tecla + del teclado de la PC y disminuir en
10%, utilizando la tecla -. Luego de alcanzar sus valores limites no variara. Obtenga las ondas
en un osciloscopio y compruebe su funcionamiento con un motor DC, utilizando dos
interruptores para establecer el sentido de giro
Solucin:
Primero veamos el informe previo5 cambiemos algunos valores:

Cdigo del programa:


/*
* AVRGCC37.c
*
* Created: 22/10/2014 7:07:06
* Author: mayhua
*/
#include <avr/io.h>
#include <util/delay.h>
void configurar_puertos ()
{
//puerto d para el virtual terminal
//DDRD=0x00;
//puerto b como sallida para el pwm y el giro del motor
DDRB=0xff;
//peurto c como entrada de los interruptores para el giro del motor
DDRC=0x00;
}
void configurar_pwm ()
{
//SE DETERMINA (CONFIGURA) EL ANCHO DEL PULSO TOTAL DEL PWM
ICR1H=0x04;
//(ICR1=$61A7)//ICR1=$04E1
ICR1L=0xE1;
//PERIODO DEL PWM 10MS N=8(PRESCALADOR)
//Ahora configuramos el timer 1 :tccr1a tccr1b
//***USAMOS EL PIN PB2 MODO DE FORMA DE ONDA 14PWM PREESCALADOR=8//
TCCR1A=0<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10;
TCCR1B=1<<WGM13|1<<WGM12|0<<CS12|1<<CS11|0<<CS10;
}
void configurar_usart ()
{
UBRRH=0;
//9600 Baudios
UBRRL=12;
UCSRA= 1<<U2X;
// velocidad doble
UCSRB= 1<<RXEN | 1<<TXEN ;
//Asncrona, paridad par, 1 bit de paridad, 8 bits de datos
UCSRC= 1<<URSEL | 0<<USBS | 1<<UPM1 | 0<<UPM0 | 1<<UCSZ1 | 1<<UCSZ0 ;
}
int main(void)
{
int sel,sell,pulso1,pulso2; //variables del programa
unsigned int c;
//variable para el OCR1B
unsigned char DATO;

c=0x0270;
//inicilamente pwm al 50%
while(1)
{
//****************llamadas de subrutinas***************//
configurar_puertos();
OCR1B=c;
//INICIALMENTE 50%
configurar_pwm();
//primero sondeo de los interruptores para el giro del motor
sell=PINC & 0x30;
switch (sell)
{
case 16:
//giro en sentido antihorario
PORTB=0x84;
break;
case 32:
//giro en sentido horario
PORTB=0x44;
break;
case 0://motor detenido
PORTB=0xC4;
break;
case 48://motor detenido
PORTB=0xC4;
break;
}
//una ves sondeado el sentido de giro
//procedemos al sondeo del teclado
configurar_usart();
//sondeo del teclado
while ((UCSRA & (1<<RXC))==0)
{
}
DATO=UDR;
_delay_ms(250);
while ((UCSRA & (1<<UDRE))==0) //sondeo dato recibido
{
}
UDR=DATO; //incremento mi puntero para otro caracter

//VEAMOS SI LA TECLA ES + O if (DATO=='+')


{
if (c != 0x04D1) //limite superior del pwm
{
c=c+0x0057;
//CADA $0057 AVANZA 7% LA PARTE ALTA
}
}
if (DATO=='-')
{
if (c != 0x000F)
//limite inferior de pwm
{
c=c-0x0057;
//CADA $0057 RETROCEDE 7% LA PARTE ALTA
}
}

Simulacin:

Para el virtual terminal podemos poner mas palabas como el duty cycle que se esta usando es
se moemento
Debemos cambiar el valor del duty cycle inicial y de la variacin del duty cyclecon eso se
terminara todo

/*
* AVRGCC38.c
*
* Created: 27/10/2014 16:09:46
* Author: mayhua
*/
#include <avr/io.h>
#include <util/delay.h>
void configurar_puertos ()
{
//puerto d para el virtual terminal
//DDRD=0x00;
//puerto b como sallida para el pwm y el giro del motor
DDRB=0xff;
//peurto c como entrada de los interruptores para el giro del motor
DDRC=0x00;
}
void configurar_pwm ()
{
//SE DETERMINA (CONFIGURA) EL ANCHO DEL PULSO TOTAL DEL PWM
ICR1H=0x30;
//(ICR1=$30D3)
ICR1L=0xD3;
//PERIODO DEL PWM 100MS N=8(PRESCALADOR)
//Ahora configuramos el timer 1 :tccr1a tccr1b
//***USAMOS EL PIN PB2 MODO DE FORMA DE ONDA 14PWM PREESCALADOR=8//
TCCR1A=0<<COM1A1|0<<COM1A0|1<<COM1B1|0<<COM1B0|1<<WGM11|0<<WGM10;
TCCR1B=1<<WGM13|1<<WGM12|0<<CS12|1<<CS11|0<<CS10;
}
void configurar_usart ()
{
UBRRH=0;
//9600 Baudios
UBRRL=12;
UCSRA= 1<<U2X;
// velocidad doble
UCSRB= 1<<RXEN | 1<<TXEN ;
//Asncrona, paridad par, 1 bit de paridad, 8 bits de datos
UCSRC= 1<<URSEL | 0<<USBS | 1<<UPM1 | 0<<UPM0 | 1<<UCSZ1 | 1<<UCSZ0 ;
}
int main(void)
{
int sel,sell,pulso1,pulso2,m=0; //variables del programa
unsigned int c;
//variable para el OCR1B
unsigned char DATO;
c=0x09C3;
//inicilamente pwm al 20%
while(1)
{
//****************llamadas de subrutinas***************//
configurar_puertos();
OCR1B=c;
//INICIALMENTE 50%
configurar_pwm();
//procedemos al sondeo del teclado
configurar_usart();
//sondeo del teclado
while ((UCSRA & (1<<RXC))==0)
{
//sondeo de los interruptores para el giro del motor
sell=PINC & 0x30;
switch (sell)
{
case 16:

//giro en sentido antihorario


PORTB=0x84;
break;
case 32:
//giro en sentido horario
PORTB=0x44;
break;
case 0://motor detenido
PORTB=0xC4;
break;
case 48://motor detenido
PORTB=0xC4;
break;
}
}
DATO=UDR;
_delay_ms(250);
while ((UCSRA & (1<<UDRE))==0) //sondeo dato recibido
{
}
UDR=DATO; //incremento mi puntero para otro caracter
_delay_ms(250);
//VEAMOS SI LA TECLA ES + O if (DATO=='+')
{
if (c != 0x30CB)
//limite superior del pwm
{
c=c+0x04E1;//CADA 04E1 AVANZA 7% LA PARTE ALTA
}
else
{
do
{
//bucle infinito
} while (m==0);
}
}
if (DATO=='-')
{
if (c != 0x0001) //limite inferior de pwm
{
c=c-0X04E1; //CADA $04E1 RETROCEDE 7% LA PARTE ALTA
}
else
{
do
{
//bucle infinito
} while (m==0);
}
}
}
}