Está en la página 1de 6

UNIVERSIDAD DE LAS FUERZAS ARMADAS-ESPE

DEPARTAMENTO DE ELCTRICA Y ELECTRNICA


INSTRUMENTACIN Y SENSORES

PWM DE MOTOR

DIDIER HEREDIA
LUIS TERAN

22 de Enero del 2015


Sangolqu- Ecuador

INGENIERA ELECTRNICA EN AUNTOMATIZACION Y CONTROL


DEPARTAMENTO DE ELCTRICA Y ELECTRNICA
INSTRUMENTACIN Y SENSORES

CODIGO EN ARDUINO
int cuenta;
int pw=0;
volatile long contador;
double rpm;
double rps;
unsigned long arranque;
int valoringresado;
int valorcaptado;
int rpsmax;
int pwmmotor;
int aux;

boolean estado_trans=false;
//Inicio manejo de lcd
#include <LiquidCrystal.h>
LiquidCrystal lcd(12,11,7,6,5,4);
#include <Keypad.h>
const byte ROWS = 4; //TAMAO TECLADO 4*4
const byte COLS = 4;
char keys[ROWS][COLS] = {
{'1','2','3','A'},
{'4','5','6','B'},
{'7','8','9','C'},
{'*','0','#','D'}
};
String teclado;
byte rowPins[ROWS] = {39,41,43,45}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {47,49,51,53}; //connect to the column pinouts of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
int PinPWM = 3; //PIN PWM
void rpm_fun()
{
contador++;
}
void setup(){
TCCR1A = 0x00; // esto es para setear el timer en uno de los modos de generacin de PWM
TCCR1B = 0x11; // esto setea el "prescaler" (N), de la siguiente manera:

OCR1A = 255; // tope de la seal o maximo pwm


TIMSK1=0; //des habilita cualquier interrupcion que pueda haber para evitar conflictos.
Serial.begin(9600);
lcd.begin(20, 4); // intialise the LCD
attachInterrupt(0, rpm_fun, CHANGE);
contador = 0;
rpm = 0;
arranque = 0;

lcd.setCursor(0,0);
lcd.print(" SENSORES ");
lcd.setCursor(0,1);
lcd.print(" ESPE ");

delay(2000);
lcd.clear();
lcd.setCursor(0,0);
lcd.print("PROYECTO # 2");
lcd.setCursor(0,1);
lcd.print(" PWM DE MOTOR");
delay(2000);
lcd.clear();

lcd.setCursor(0,0);
lcd.print("DIDIER HEREDIA");
lcd.setCursor(0,1);
lcd.print("LUIS TERAN");
delay(2000);
lcd.clear();
}

void loop()
{

String key = String(keypad.getKey());


lcd.clear();
lcd.setCursor(0,0);
lcd.print("SP=");
lcd.print(teclado);
if(key!="D"&&key!="A"&&key!="B"&&key!="C"&&key!="*"&&key!="#"){
teclado=teclado+key;
}
else if (key=="#"){
lcd.print("SP=");

lcd.print(teclado);
teclado="";
lcd.clear();
}
if(key=="*" && estado_trans==false){
aux=0;
valorcaptado=teclado.toInt();
pwmmotor=(valorcaptado)*255/62;//transformamos el valor ingresado por teclado en pwm con una escala
maxima de 255
}
if(valorcaptado>62){
validacionvelmax();
}
else{
//para que empiece a moverse el motor
if(rpm!=valorcaptado && pwmmotor!=0){ //valorcaptado=num, pwmmotor=pwm
analogWrite(PinPWM,1);
reguladorvel();
}
//para parar al motor
else if(valorcaptado==0){
analogWrite(PinPWM,0);
}
// para tener belocidad maxima
if(valorcaptado==62){
analogWrite(PinPWM,255);
}
}
//INTERRUPCION
detachInterrupt(0);
rpm = 11*(2.25/(millis() - arranque)*contador);
arranque = millis();
contador = 0;
attachInterrupt(0, rpm_fun, CHANGE);
lcd.setCursor(0,1);
lcd.print("Vel: ");
lcd.print(rpm);
lcd.print(" RPS");
delay(200);
lcd.clear();
}
long reguladorvel(){ //valorcaptado=num, pwmmotor=pwm
if( rpm>valorcaptado+40){
pwmmotor=pwmmotor-50;
}

if( rpm>valorcaptado+6){
pwmmotor=pwmmotor-2;
}
if( rpm<valorcaptado-6){
pwmmotor=pwmmotor+2;
}
if( rpm>valorcaptado+3){
pwmmotor=pwmmotor-1;
}
if( rpm<valorcaptado-3){
pwmmotor=pwmmotor+1;
}
if( rpm>valorcaptado){
pwmmotor--;
}
else if(rpm<valorcaptado){
pwmmotor++;
}
if(rpm<0.3){
analogWrite(PinPWM,0);
}
analogWrite(PinPWM,pwmmotor);
if(pwmmotor==0)
{
analogWrite(PinPWM,0);
}
}
long validacionvelmax(){
lcd.setCursor(0,0);
lcd.print("VEL MAX= 60 RPS ");
lcd.clear();
}

FOTO DEL PROYECTO

También podría gustarte