Documentos de Académico
Documentos de Profesional
Documentos de Cultura
PWM DE MOTOR
DIDIER HEREDIA
LUIS TERAN
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:
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()
{
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();
}