Anda di halaman 1dari 4

#include <LiquidCrystal.

h> // includes the LiquidCrystal Library


LiquidCrystal lcd(1, 4, 5, 6, 7, 8); // Creates an LCD object. Parameters: (rs,
enable, d4, d5, d6, d7)
#include <avr/io.h> //Librer�a para generaci�n de PWM
#include <avr/interrupt.h> //Librer�a para activar interrupciones
#define DETECT 2 //Asigno nombre para la detecci�n cruce por cero
#define GATE 9 //Asigno nombre para el pin donde se obtendr� la se�al
int i=483;
#define selec 12
float numerador;

#define boton 10 //////////barre frecuencias


int con = 0;
int cont= 1;
int Pot1 = 0; // Conexi�n del potenci�metro en el pin anal�gico 0, para
variar frecuencia.
int Pot2 = 1; // Conexi�n del potenci�metro en el pin anal�gico 1, para
ciclo de trabajo.
unsigned long DPot1; // Datos leidos en la entrada anal�gica 1.
unsigned long DPot2; // Datos leidos en la entrada anal�gica 2.

float Aux1 = 0;

void setup() {
lcd.begin(16, 2); // Initializes the interface to the LCD screen, and specifies
the dimensions (width and height) of the display
// Asignaci�n de pines
pinMode(DETECT, INPUT); //Detecta el cruce por cero
digitalWrite(DETECT, HIGH); //Habilita la Resistencia de Pull-up
pinMode(GATE, OUTPUT); // Pin del microcontrolador por donde se obtendr� la se�al
pinMode(selec, INPUT); // Pin de seleccion tipo de controlador
pinMode(boton, INPUT);
digitalWrite(selec, HIGH); //Habilita la Resistencia de Pull-up
// Configurar Timer 1
//OCR1A = 100; //Inicializa el comparador
TIMSK1 = 0x06; //Habilita el comparador A y *no* la interrupci�n por desborde
TCCR1A = 0x00; //Asignaci�n del registro del timer
TCCR1B = 0x00; //Operacion normal, timer deshabilitado

// TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // Configuraci�n PWM modo fase y


frecuencia correcta.
//TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ; // Modo
Invertido.
//TCCR1B = _BV(WGM13) | _BV(CS11)| _BV(CS10); // Selecci�n del modo 8 de PWM
y prescalador para 64.

// Configurar la interrupci�n de cruce por cero.


attachInterrupt(0,zeroCrossingInterrupt, CHANGE);
attachInterrupt(1,zeroCrossingInterruptP, CHANGE);
//IRQ0 is pin 2. Llamar a la interrupci�n de cruce por cero para flanco de subida

//Rutinas de interrupci�n
void zeroCrossingInterrupt(){ //Detecci�n de cruce por cero
TIMSK1 = 0x06; //Habilita el comparador A y *no* la interrupci�n por desborde
TCCR1A = 0x00; //Asignaci�n del registro del timer
TCCR1B = 0x00; //Operacion normal, timer deshabilitado

TCCR1B=0b00000100; //Iniciar timer dividido para entrada de 256


TCNT1 = 0; //Reset timer � Inicia el contador en cero
}
void zeroCrossingInterruptP(){ //Detecci�n de cruce por cero

// TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // Configuraci�n PWM modo fase y


frecuencia correcta.
TCCR1A = _BV(COM1A1) | _BV(COM1B1) | _BV(COM1A0) | _BV(COM1B0) ; // Modo
Invertido.
TCCR1B = _BV(WGM13) | _BV(CS11)| _BV(CS10); // Selecci�n del modo 8 de PWM y
prescalador para 64.
TCNT1 = 0; //Reset timer � Inicia el contador en cero
}

ISR(TIMER1_COMPA_vect){ //Comparada el valor del timer con el valor establecido


como l�mite
if (digitalRead(selec)) {//SIMETRICO
digitalWrite(GATE,HIGH); //Coloca en 1L a la variable GATE
}
else if (!digitalRead(selec)) {//CHOPPER

ISR(TIMER1_COMPB_vect){ //Comparada el valor del timer con el valor establecido


como l�mite
if (digitalRead(selec)) {//SIMETRICO
digitalWrite(GATE,LOW); //Coloca en 0L a la variable GATE
TCCR1B = 0x00;
TCCR1B = 0x00;
}
else if (!digitalRead(selec)) {//CHOPPER

}
}

///////////////////////////////////////////////////////////////////////////////////
/////////////////////
void loop(){
if (digitalRead(selec)) {//SIMETRICO

detachInterrupt(1);
// Configurar la interrupci�n de cruce por cero.
attachInterrupt(0,zeroCrossingInterrupt, CHANGE);
lcd.clear();

int pot=analogRead(Pot1);
pot=pot/4; //
if (pot > 506) //
{
pot=506; // Se asigna un valor a la salida
}
if (pot < 3) //
{
pot=3; //
}
i=pot;
OCR1A = i; //Asignar el valor del comparador a un registro.
OCR1B = (512-i);
numerador=3.1416-(2*i*0.347*0.0175)+sin(2*i*0.347*0.0175);
lcd.setCursor(0,0);
lcd.print("Simetrico ");
lcd.setCursor(10,0);
lcd.print("a:");
lcd.print(i*0.347);
lcd.setCursor(0,1);
lcd.print("Vrms: ");
lcd.setCursor(5,1);
lcd.print(120*sqrt(numerador/3.1416));
delay(50);

else if (!digitalRead(selec)) {//CHOPPER


detachInterrupt(0);
// Configurar la interrupci�n de cruce por cero.
attachInterrupt(1,zeroCrossingInterruptP, CHANGE);
lcd.clear();

con = digitalRead(boton);

if(con==HIGH) {
delay(50);
cont = cont+1;
delay(500);

}
else if(con==LOW){
cont=cont;
}
if(cont==1){//120Hz
ICR1=1023; // esto es lo que hay que variar lo de arriba no le pares bola
era para meter el pulsador pero no me sale muy bien
}
if(cont==2){//240Hz
ICR1=512; // esto es lo que hay que variar lo de arriba no le pares bola era
para meter el pulsador pero no me sale muy bien
}
if(cont==3){//360Hz
ICR1=341; // esto es lo que hay que variar lo de arriba no le pares bola era
para meter el pulsador pero no me sale muy bien
}
if(cont==4){//480Hz
ICR1=256; // esto es lo que hay que variar lo de arriba no le pares bola era
para meter el pulsador pero no me sale muy bien
}
if(cont==5){//600Hz
ICR1=205; // esto es lo que hay que variar lo de arriba no le pares bola era
para meter el pulsador pero no me sale muy bien
}
if(cont==6){//1200Hz
ICR1=102; // esto es lo que hay que variar lo de arriba no le pares bola era
para meter el pulsador pero no me sale muy bien
}
if(cont==7){//1200Hz
cont=1;
}

// Variaci�n del ciclo de trabajo con el potenciometro 2.

DPot2 = analogRead(Pot2); // Lee el valor anal�gico de 10bits del


potenci�metro en A1.
if (DPot2 >= 0 && DPot2 <= 102) { // L�mite de 0.1 para la entrada anal�gica A1
de 10bits.
OCR1A =int(0.1*ICR1); // Si la condici�n anteriror se cumple se envia
el 10% del valor total del
// registro de 16bits OCR1A prescalado a 10bits
(1024) con la relaci�n:
// (0.1*2^16)/(2^10) = 6.4; correspondiente al
10% del ciclo de trabajo.

} else if (DPot2 >= 922 && DPot2 <= 1024) {


OCR1A = int(0.9*ICR1); // Si la condici�n anteriror se cumple se envia
el 90% del valor total del
// registro de 16bits OCR1A prescalado a 10bits
(1024) con la relaci�n:
// (0.9*2^16)/(2^10) = 57.6; correspondiente al
90% del ciclo de trabajo.
// Si la condici�n anteriror se cumple se envia
el 90%. 0.9*2^16/1024
// del duty cycle al pin PWM como l�mite, de lo
contrario.

} else { // Si ninguna condici�n anterior se cumple se


envia al
Aux1 = float(DPot2);
Aux1 = Aux1 *ICR1; // De igual manera se trata de prescalar el
registro total de 16bits de OCR1A
// a 10bits para lograr variar su valor con los
datos del pin A1 de 10bits
Aux1 = Aux1/1024; // Se divide para 1024 para tener una
varicaci�n de 0-100%.

OCR1A = int(Aux1); // Se envia el resultado al registro OCR1A.


}
lcd.setCursor(0,0);
lcd.print("Chopper ");
lcd.setCursor(0,1);
lcd.print("Delta: ");
lcd.print(DPot2*0.0879);
delay(50);

}
}

///////////////////////////////////////////////////////////////////////////////////
////////////////////////

Anda mungkin juga menyukai