PIC 16F84A, PWM para motor

#1
PIC 16F84A, PWM para motor
Buenas, me gustaria que me guíen para poder hacer un programa en microcode para el manejo pwm de un motor dc de 5v, consiste en que a medidad que presiones un push-botton el motor aumente de velocidad, digamos si lo presiono una vez, aumente de velocidad, si lo presiono de nuevo aumenta la frecuencia y asi sucesivamente, tengo problemas con el codigo, soy nuevo en esto y aun me cuesta enterder, de antemano gracias.


Código:
botsubir var portb.1
 botbajar var portb.2
 led var portb.3
 frec var byte 
 frec=100
 high led
 pause 500
 low led
 prog:
 pwm portb.0,frec,30
 low led
 if botsubir=0 then subir
  goto prog
 subir:
 if frec>249 then aviso
 if bandera=1 then prog
 high led
 bandera =1
 frec=frec+25
 goto prog
 bajar:
 if frec<26 then aviso
high led
 frec=frec-25
 goto prog
 aviso:
 high led
 goto prog
 end
 
Última edición por un moderador:

pandacba

Rocker Bear
#2
Si quieres manejar un motor por PWM lo que tenes que hacer es que aumente el ancho del pulso, no variar la frecuencia
 

pandacba

Rocker Bear
#4
Hace mucho en mis primeros contactos con este michro hice una pequña experiencia
determine una frecuencia X y toma la duración de cada ciclo, entonces a ese tiempo lo divide en 10 partes.
Un pulso tiene una parte sin conducción y otra que conduce, hice que iniciara con un 90% sin conducción + un 10%, hice una rutina que a cada presión me agregara un 10% a la parte positiva y restara otro 10% a la parte nula(para mantener la frecuencia) probe la salida con un osciloscopio y resultaba perfecto.
luego agregue un boton para que haga lo contrario, en mi caso estableci dos límites un minimo de un 10% y un máxim de 90%
 
Última edición:
#5
dime si entendi bien, apartir de este codigo
frec=127 // 50% alto y 50% bajo
if subir=1 then
{frec=frec+10
pwm portb.0,frec,30 // genera 30 ciclos de 137 señal util
}
if bajar =1 then
{
frec=frec-10
pwm portb.0,frec,30 // genera 30 ciclos de 127 señal util
}
 

pandacba

Rocker Bear
#6
para el ciclo ponia el pin de salida X bajo
retardo A
pin x alto
retardo B

La suma de A y B son un ciclo completo de trabajo
al iniciar A equivalia al 90% y B al 10%
leía el boton y si estaba presionado disminuía A en un 10% y aumentaba B 10%

Si tu ciclo completo son 100Ms entonces A=90Ms y B=10Ms
al precionar una vez el boton C=10 y A=A- C y B=B+C
y la suma de 0>=A+B=<100
 
#10
he logrado hacer este codigo en arduino,lo hice porque asi lo puedo probar pues no tengo la tarjeta para programar pic, el problema que me este codigo es que si presiono varias veces el pulsador tanto de subir velocidad o bajar velocidad el programa ya no responde como deberia de ser...

Código:
int a=0;
int subir=0;
int bajar=0;
void setup (){
  pinMode (2,INPUT);
  pinMode (3,INPUT);
  pinMode (11,OUTPUT);
  Serial.begin (9600);
}
void loop (){
  while (1){
    subir=digitalRead(2);
    bajar=digitalRead(3);
    if (subir==HIGH){
      delay(1000);
      a=a+45;
      if (a>225){
        a=225;
      }
      Serial.println(a);
      analogWrite(11,a);
    }
    if(bajar==HIGH){
      delay(1000);
      a=a-45;
      if(a<0){
        a=0;
      }
        Serial.println(a);
      analogWrite(11,a);
    }
  }
}
 
Última edición por un moderador:
#11
Es que no tenes que bajar de 0 ni pasar de 100% lo podes dividr en cuantos pasos quieras pero no bajar de 0 ni pasar de 100%
En el pic simulatoride lo probe ante de armarlo y funcionaba bien
Si decidis que sean 10 pasos cada paso es un 10%
Si decidis que sean 20 pasos cada paso sera un 5%