TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: ceci_lamorocha en 18 de Enero de 2011, 09:20:02
-
Hola a todos ! soy nuevita en el foro siempre leo las cosas que publican y he aprendido mucho con ustedes asi que me he decidido a participar , como bien dice el titulo del post necesito si alguien me puede ayudar a realizar el siguiente programa con Pic 16F84A en lenguaje assembler:
Apretando un pulsador la velocidad del motor aumenta y al soltarlo la velocidad alcanzada se mantiene en ese nivel, luego apretando otro pulsador bajamos la velocidad y al soltarlo se mantiene, asi podriamos subir y bajar la velocidad para alcanzar la que querramos entre un minimo y un maximo
Si me pueden ayudar con esta parte les esatria muy agradecida porque no he logrado hacerlo, luego me gustaria ver como variar el giro Derecha_Izquierda eso lo haria con un puente H LM293, pero eso será para despues de realizar el PWM
gracias a todos!! Ceci
-
Bienvenida al foro.
Un PWM sencillito, se puede hacer mejor, pero para que veas como es, este es el mejor.
Pongamos un PWM de 100Hz (10ms cada ciclo) y que varia del 10% en 10% de DUTTY. en RB0.
RUTINA_10%
bsf PORTB,0 ; lo ponemos a 1
call DEMORA_1MS ;llamamos retardo de 1 miliseg
bcf PORTB,0 ; lo ponemos a 0
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
RUTINA_20%
bsf PORTB,0 ; lo ponemos a 1
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
bcf PORTB,0 ; lo ponemos a 0
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
call DEMORA_1MS ;llamamos retardo de 1 miliseg
Y asi sucesivamente, solo hay que ir corriendo para abajo el "bcf PORTB", para variar la frecuencia varias la
DEMORA, si quieres 200Hz seria de 500us, y asi sucesivamente.
Estas DEMORAS se pueden hacer con TIMER0, ES ACONSEJABLE, AUNQUE EN TU CASO NO IMPRESCINDIBLE.
Ve escribiendo codigo y te iremos ayudando.
-
muchas gracias por la respuesta :mrgreen:!!
lo voy haciendo a ver si me sale y lo paso asi me corrigen :oops:
ceci
-
Hola !!! aca paso lo que pude hacer hasta ahora, pero falta bastante para lograr lo que queria hacer al comienzo..
el programa realiza hasta acá lo siguiente: aumenta la velocidad de un motor DC usando PWM, desde 0 a la maxima velocidad, y vuelve a comenzar,esta secuencia se repite indefinidamente
Al circuito lo monté en una protoboard y funciona bien,, les paso la simulacion en proteus una breve explicacion del programa en assembler y el archivo completo en assembler
si me pueden ayudar para ir logrando el programa que queria hacer se los agradeceria, creo que como paso siguiente estaria bueno agregarle al programa 2 pulsadores a la entrada para controlar con uno el aumento de la velocidad y con el otro el descenso de la velocidad, si pueden pasenme el archivo assembler con estas modificaciones para ir probandolo :) , a ver si entre todos logramos la meta :-/
gracias!!!!!, Ceci :g)
-
En la simulacion en proteus que envie antes esta mal la conexion del motor a las salidas del PIC, aca lo paso nuevamente bien conectado y le agregue la etapa de potencia para motores de 12V y el circuito de proteccion de los transistores !!!!!!
-
Primero decirte que en el segundo post no has modificado el esquema en proteus, a mi me sale el mismo del anterior post, que creo que ya sabes que no esta bien.
En cuanto al programa decirte que es una maravilla, has hecho todo el PWM ascendente de 10% en 10% en 51 Bytes increible, dedicate a esto porque eres muy buena, bajate este programa para hacer las rutinas de tiempo, es una pena que alguien con tu talento pierda el tiempo haciendolas
http://www.todopic.com.ar/foros/index.php?topic=5968.0
Le voy a sacar un defectillo al excelente programa que has hecho, aqui:
UNO DECFSZ AUX_HIGH,F ;DURACIÓN DEL UNO, SEGÚN THIGH
GOTO UNO_1
GOTO CERO
UNO_1 BSF PORTA,1
BSF PORTA,2
CALL RETARDO_1
GOTO UNO
no debes hacer dos bsf seguidos sobre el mismo puerto, mejor hazlo asi:
movlw 0x06
movwf PORTA
En cuanto a los pulsadores, se podria hacer asi:
#DEFINE PUL_ASC PORTB,0
#DEFINE PUL_DES PORTB,1 ;ponlos donde quieras
SELECCIONAR
btfss PUL_ASC ; esta pulsado?
goto $+2 ; no va a chequear el otro
goto ASCENDENTE ; si va a ascendente, incrementar velocidad
btfss PUL_DES ; esta pulsado?
goto $-4 ; no vuelve a empezar
goto DESCENDENTE ; si va a decrementar velocidad
ASCENDENTE
call ANTIRREBOTES ; llama demora de 20ms para que pasen rebotes en pulsadores
btfss PUL_ASC ; se pulso o fueron rebotes?
goto SELECCIONAR ; fueron rebotes va a chequear de nuevo
goto EMPEZAR ; va a incrementar velocidad
DESCENDENTE
call ANTIRREBOTES ; llama demora de 20ms para que pasen rebotes en pulsadores
btfss PUL_des ; se pulso o fueron rebotes?
goto SELECCIONAR ; fueron rebotes va a chequear de nuevo
goto EMPEZAR_1 ; va a decrementar velocidad
Tienes que hacer otro programa igual para decrementar velocidad, igual que ese que hiciste pero en vez de
incrementar el tiempo que esta en 1 y decrementar el del 0, haces lo contrario, incrementas el de 0 y
decrementas el de 1, a las etiquetas les puedes llamar igual con un guion bajo 1, te pongo todo esto a modo
de ejemplo, se que tu lo vas a hacer mucho mejor
-
Gracias por tantos alagos me vas a hacer poner colorada :oops: !!! jeje
Voy a probar las correcciones que me has enviado, espero que me salga hacerle las modificaciones porque hace poquito que estoy manejando los pics y el assembler, una pregunta: el simbolo $ que pusiste nunca lo habia visto antes , se podrá usar en el pic16F84A '??? con este pic estoy comenzando con todo esto por recomendacion de mucha gente y por ahora es el unico que se utilizar un poquito,,, segun me parece ese simbolo apunta a la direccion de programa "actual" y con el -Nº salta hacia atras o me equivoco ??
Voy a probar tambien ese programita para hacer los tiempos de retardo que nunca me gustó hacerlo con la calculadora!!! :-/ :-/
PD: Si puedo hoy subo bien la simulacion en proteus porque la tengo en otra PC, no me di cuenta y subí la que estaba mal 2 veces !! :5]
gracias nuevamente !!
-
No te pongas colorada, :lol: :lol: es en serio que me sorprendio mucho lo bien que lo has hecho. Cuando lo abri y lo vi tan pequeño, me dije, no se entero de nada de lo que le dije, porque creia que era imposible hacerlo en tan poco espacio, pero lo mire un poco y dije, pues parece que tiene sentido, lo puse a simular en el MPLAB y me quede flipado.
Los goto $+3 va 3 posisciones de programa para delante y goto-5 va 5 posiciones para atras, es util para hacer saltos pequeños y no tener que poner una etiqueta.
Te dejo un esquema de un puente H contransistores para hacer el control en ambas direcciones con solo 2 pines del PIC
http://robots-argentina.com.ar/MotorCC_PuenteH.htm
Y otras que lo hacen con MOSFET pero se podria hacer con transistores normales o IGBT, y te hablan del frenado regenerativo, y del frenado controlado aplicando PWM a los transistores inferiores del puente H y otras muchas cosas muy interesantes, incluidos videos, los programan en BASIC asi que el programa lo tendras que hacer, por suerte para nosotros que aprenderemos algo mas :lol: :lol:
http://www.neoteo.com/puente-h-con-mosfet-para-motores-cc.neo
http://www.neoteo.com/puente-h-para-motores-cc-parte-ii.neo
http://www.neoteo.com/pwm-mosfet-y-motores-cc-parte-iii.neo
Saudos
-
Ahora que tengo un tiempito les paso el circuito simulado en proteus que habia pasado mal por error la vez pasada, lo que acompaña al motor de DC es el circuito de proteccion de los transistores (de picos positivos y negativos) podria no estar en la simulacion aunque lo coloqué por si alguien quiere armarlo en la practica :)
Hola tapi8 !! :
Todavia no pude hacerme de tiempo para agregarle los pulsadores al assembler, en cuanto lo tenga lo paso asi me envias tus observaciones, espero poder hacerlo con los consejos que me pasaste, si vos los podes agregar al assembler y enviarlo seria de grandisima ayuda asi solo tendria que retocarlo un poco si hiciera falta :mrgreen:
Lo del giro del motor lo dejamos para mas adelante cuando ya funcione bien el PWM con los pulsadores, pero estaba pensando en usar un L293 y controlar el sentido de giro (derecha-izquierda) con otros 2 pulsadores!!
-
El esquema que pones no es muy bueno (de esta vez toca darte caña en vez se halagos :lol: :lol: ) pones dos MOSFET en paralelo a masa, por que? solo tiene explicacion si el motor es muy potente y no llega uno pero no creo que sea el caso, y en el circuito de proteccion ese C1 y D3 no me gustan nada. Por eso te pase los esquemas en esos enlaces, fijate que ponen dos transistores para cada sentido de giro, uno desde +12V y otro a masa, para un sentido de giro llegaria con un transistor solo, pero bueno como despues lo vas a hacer con el L293.
El programa para dos pulsadores, solo tienes que cambiar etiquetas en el tuyo, ponerles _1 y en los UNO _1 por ejemplo UNO_2_1 cambiar etiquetas en los GOTO y que vaya dcrementando al reves los TLOW y THIHG, la parte de los pulsadores ya la tienes en el otro post que te puse mas arriba, te dara un poco de trabajo, tambien tienes que hacer una demora de 20ms y le llamas ANTIRREBOTES, la puedes hacer con el programa que te puse el otro dia, tendras que definir PDel0 y PDel1.
El programa te funcionara incrementando y decrementando continuamente velocidad pero no se parara en la que esta al soltar, pero cuando te funcione este ya miraremos eso, asi como invertir el sentido de giro.
Es mejor que lo hagas tu, porque seguro que lo vas a hacer muy bien y asi aprendes.
Saludos
-
Ok gracias :) te comento que mañana estoy saliendo de vacaciones asi que hasta dentro de 15 dias no voy a poder seguir con este tema :5] , no me extrañes !!! :lol: a la vuelta intento terminarlo. Por los transistores es como dijiste vos, puse esos por si alguien quiere colocar un motor con un consumo mayor a 1.5A en ese caso hay que agregarle un disipador a los transistores !! en mi caso el motor consume menos de 1A asi que no necesitaria agregarlo...
Por el tema del circuito de proteccion, seguramente se puede diseñar mejor, pero lo hice rapido porque luego al usar el L293 el circuito de proteccion se arma solamente con 4 diodos y el que pase yo en la simulacion ya no se usa, cuando lleguemos algun dia a la conexion del motor :mrgreen: pasaré bien hecho el circuito de proteccion de los transistores del puente H con solo 4 diodos mas barato y simple iposible ! :) , hasta dentro de 15 dias !! :mrgreen:
-
Hola, he estado siguiendo este foro y es fantástico, es la primera vez que trabajo con PWM y con un pic, he hecho un proyecto de un carro controlado por RF y con PIC 16F84A, consta de 5 botones con los cuales avanza, retrocede, derecha, izquierda y para, el cual está funcionando muy bien. El carro tenia servomotores trucados pero es muy lento por lo que le puse micromotores y ahora es un poco rápido, la cuestión es que le deseo agregar tres botones que serian Vel1, Vel2 y Vel 3. He hecho un programa el cual va desde 10% al 100 %, como lo sugirieron en este tema y está trabajando bien. Mi duda son de las conexiones RB1 a EN1 -- RB2 y RB3 al Motor.
Muchas gracias por su ayuda
-
Por aqui tienes informacion en español:
http://robots-argentina.com.ar/MotorCC_L293D.htm
Ojo con este integrado solo puedes manejar motores pequeños. Aunque trae diodos internos es mejor que se los pongas externos tambien, vi algun comentario de gente que no se los puso y lo quemo.
No se si lo sabes pero el 16f84 es un PIC antiguo, con pocas prestaciones y caro, es bastante sencillo pasar el programa para otro PIC mejor y mas barato, pero si ya lo has comprado pues......
-
Hola es un post muy interesante creo que se trata de hacer algo como esto espero les sea útil adjunto la simulación en proteus suerte y saludos desde México.
;################################### CONTROL DE VELOCIDAD DE UN MOTOR DC #####################################
LIST P=16F84A
INCLUDE"P16F84A.INC"
__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _HS_OSC
LT EQU H'20'
HT EQU H'21'
LT1 EQU H'22'
HT1 EQU H'23'
LSB EQU H'24'
MSB EQU H'25'
AJUSTE EQU H'26'
ZERO EQU H'3F' ; Números
UNO EQU H'06'
DOS EQU H'5B'
TRES EQU H'4F'
CUATRO EQU H'66'
SINCO EQU H'6D'
SEIS EQU H'7D'
SIETE EQU H'07'
OCHO EQU H'7F'
NUEVE EQU H'6F'
DIEZ EQU H'BF'
V_A EQU H'01'
V_B EQU H'03'
V_C EQU H'07'
V_D EQU H'0F'
V_E EQU H'1F'
V_F EQU H'3F'
V_G EQU H'80'
V_H EQU H'A3'
V_I EQU H'C8'
V_J EQU H'FF'
;----------------------
ORG 0X00
GOTO INICIO
INICIO ; INICIO
CLRF PORTB
CLRF AJUSTE
CLRF LSB ; BORRAMOS REGISTROS
CLRF MSB
BSF STATUS,5
MOVLW B'00010111' ; PORTA,3 COM SALIDA
MOVWF TRISA
CLRF TRISB
BCF STATUS,5
BCF PORTA,3
BCF PORTA,2
GOTO PRUEBA
PRUEBA
CALL MOSTRAR
MOVWF PORTB
BTFSS PORTA,0
GOTO BAJAR
BTFSS PORTA,1
GOTO SUBIR
GOTO PREPARA
BAJAR
CALL RETARDO
MOVLW .0
SUBWF AJUSTE,W
BTFSC STATUS,Z
GOTO PRUEBA
DECF AJUSTE,F
CALL MOSTRAR
MOVWF PORTB
GOTO PREPARA
SUBIR
CALL RETARDO
MOVLW .10
SUBWF AJUSTE,W
BTFSC STATUS,Z
GOTO PRUEBA
INCF AJUSTE,F
CALL MOSTRAR
MOVWF PORTB
GOTO PREPARA
MOSTRAR
MOVF AJUSTE,W
CÓDIGO
ADDWF PCL,F
RETLW ZERO
RETLW UNO
RETLW DOS
RETLW TRES
RETLW CUATRO
RETLW SINCO
RETLW SEIS
RETLW SIETE
RETLW OCHO
RETLW NUEVE
RETLW DIEZ
RETLW V_A
RETLW V_B
RETLW V_C
RETLW V_D
RETLW V_E
RETLW V_F
RETLW V_G
RETLW V_H
RETLW V_I
RETLW V_J
;--------------------
PREPARA
CLRF HT1
CLRF LT1
MOVLW .0
SUBWF AJUSTE,W
BTFSC STATUS,Z
GOTO PRUEBA
TRATAMIENTO
MOVF AJUSTE,W
ADDLW .10
CALL CÓDIGO
MOVWF HT1
SUBLW .255
BTFSC STATUS,Z
INCF LT1,W
MOVWF LT1
GOTO VERIFICA
VERIFICA
MOVF HT1,W
MOVWF HT
MOVF LT1,W
MOVWF LT
PULSO_O
BCF PORTA,3 ; PORTA,3'COMO "0" AHORA
CALL CICLO
DECFSZ LT,F
GOTO PULSO_O
;----------------------
BTFSS PORTA,0
GOTO BAJAR
BTFSS PORTA,1
GOTO SUBIR
;----------------------
PULSO_I
BSF PORTA,3 ; PORTA,3'COMO "1" AHORA
CALL CICLO
DECFSZ HT,F
GOTO PULSO_I
GOTO VERIFICA
;----------------------
CICLO ; CONTADOR
MOVLW .10
MOVWF LSB
CICL
DECFSZ LSB,F
GOTO CICL
RETURN
;----------------------
RETARDO ; ESPERAR
MOVLW .255
MOVWF LSB
DON1
MOVLW .255
MOVWF MSB
DON2
DECFSZ MSB,F
GOTO DON2
DECFSZ LSB,F
GOTO DON1
RETURN
;============================================================================;
END
El circuito para el motor es solo demostrativo pero se puede hacer mucho mejor.
Suerte.
PD, Solo falta la implementación del cambio de giro.
-
hola soy nueva por aquí!
Revise y el tema muy interesante, yo estoy haciendo algo similar es el control de velocidad, pero para un motor AC y usando un pic 16F870 la parte de potencia esta lista, estoy usando un puente H con transistores mosfet pero en la parte de control estoy un poco perdida y una cosa más debemos usar un pantalla lcd para ver las RPM del motor y el aumento y disminución de la velocidad si alguien, tiene alguna sugerencia de cómo empezar estaría muy agradecida
:)
-
yo estoy haciendo algo similar es el control de velocidad, pero para un motor AC
Pues para un motor AC no es muy similar a esto, cambia bastante el sistema.
estoy usando un puente H con transistores mosfet
Deduzco que es un motor AC monofasico y que en tu pais la corriente va a 110V ¿no?.
Bueno nunca he hecho nada para motores AC monofasicos pero creo que te puedo decir mas o menos como seria, aunque es mas complicado que esto que hicimos aqui.
-
Olinqui, por ahí un poco tarde mi respuesta :oops:
El cambio de giro no se bien como lo quieres hacer, osea, cual es tu necesidad.
Para hacer un cambio de giro en un motor antes tiene que estar detenido o en un bajo regimen de velocidad, para eso vas a tener que pensar en un sistema de freno, ya sea bajando la velocidad progresivamente o poner el puente H en modo freno que lograrias detener el motor mas rápido.
El problema de invertir el giro en el motor rapidamente es que genera tensión y corriente inversa en el circuito del puente H y aumenta considerablemente la temperatura en los elementos que uses, ya sea transistores mosfet o el tipo de tecnologia que uses.
-
hola soy nueva por aquí!
Revise y el tema muy interesante, yo estoy haciendo algo similar es el control de velocidad, pero para un motor AC y usando un pic 16F870 la parte de potencia esta lista, estoy usando un puente H con transistores mosfet pero en la parte de control estoy un poco perdida y una cosa más debemos usar un pantalla lcd para ver las RPM del motor y el aumento y disminución de la velocidad si alguien, tiene alguna sugerencia de cómo empezar estaría muy agradecida
:)
Hola kiara, yo hice un regulador de velocidad para un motor AC monofásico no lo hice variando la frecuencia como normalmente se haría, sino lo hice variando el voltaje eficaz que llega al motor. no es recomendable hacerlo para cargas grandes por que el par disminuye muuucho. pero si es con cargas pequeñas para llevarlas a grandes velocidades funciona de maravilla. todo eso lo hice con el 16f876 detectando el paso por 0 de la señal AC de la fuente y guiandome en esto, dejaba pasar solo una determinada parte de la señal al motor con un triac controlandolo con el pic. si necesitas mas informacion avisame :)
-
Lo que tu haces daboo88 es regular la potencia que le llega al motor y por tanto la fuerza (torque o par) con que este gira, hay aplicaciones donde este sistema va bien (ventiladores, por ejemplo), pero no estas variando la velocidad, aunque haya veces que lo parezca.
A kiara creo que se lo ha encargado hacer un profesor y ya sabemos como es esto...aunque no se por que me da que le han mendado hacer otra cosa y no lo tiene muy claro... :lol: