Hola a todos!
tengo un problema con PWM del siguiente código, es para manipular dos motores de 3A variandoles la velocidad y cambiando el sentido de giro mediante un L298 (puente H) y con un PIC 16F877, todo funciona bien ya hasta lo tengo en placa el problema es que al medir el pulso del PWM de salida con un osciloscopio solo me varia desde el 20% de ancho de pulso hasta cero.
ya verifiqué mi código para ver que error tengo y nada hasta ahorita. si me mueve motores pequeños de 5 volts pero cuando le pongo uno de 24 no alcanza a girar.
Como verán tambien tiene entradas para PARO DE EMERGENCIA ciclo programado y swich's de limite.
alguien podría ayudarme para tener el 100% a la salida del PWM...
saludos!
tengo un problema con PWM del siguiente código, es para manipular dos motores de 3A variandoles la velocidad y cambiando el sentido de giro mediante un L298 (puente H) y con un PIC 16F877, todo funciona bien ya hasta lo tengo en placa el problema es que al medir el pulso del PWM de salida con un osciloscopio solo me varia desde el 20% de ancho de pulso hasta cero.
ya verifiqué mi código para ver que error tengo y nada hasta ahorita. si me mueve motores pequeños de 5 volts pero cuando le pongo uno de 24 no alcanza a girar.
Código:
define OSC 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTB
DEFINE LCD_RSBIT 1
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 2
DEFINE LCD_BITS 4
DEFINE LCD_LINES 2
DEFINE LCD_COMMANDUS 2000
DEFINE LCD_DATAUS 50
DEFINE ADC_BITS 8
dEFINE ADC_CLOCK 3
DEFINE ADC_SAMPLEUS 50
ON INTERRUPT GOTO ESTOP
res var word
res2 var word
velo var byte
duty VAR BYTE
duty2 VAR WORD
carga var byte
pieza var byte
INTCON=%10010000
CCP1CON=%00001100
CCP2CON=%00001100
ADCON0=%11000001
ADCON1=%00000100
T2CON=%00000101
PR2=249
DUTY=127
DUTY2=127
TRISA = 63
TRISB = %00001001
TRISC = %11111001
TRISD = %11110000
PORTB = %00000000
PORTD = %00000000
PAUSE 500
lCDOUT $FE,1," EMPRESA",$FE,$C0," S.A. de C.V."
PAUSE 800
LCDOUT $FE,1
lCDOUT $FE,1," Iniciando...",$FE,$C0," "
PAUSE 800
MAIN:
IF PORTC.3 = 0 THEN
CARGA=0
ELSE
CARGA=1
ENDIF
IF PORTC.4 = 0 THEN
PIEZA=0
ELSE
PIEZA=1
ENDIF
IF PORTB.3=1 THEN GOSUB INICIO
IF PORTD.4=0 THEN
lCDOUT $FE,1," LIMITE CARGA ",$FE,$C0," ADELANTE "
GOsub limitsc
PAUSE 100
CARGA=1
ENDIF
IF PORTD.5=0 THEN
lCDOUT $FE,1," LIMITE CARGA ",$FE,$C0," ATRAS "
GOsub limitsc
pause 100
CARGA=0
ENDIF
IF PORTD.6=0 THEN
lCDOUT $FE,1," LIMITE PIEZA ",$FE,$C0," ADELANTE "
GOsub limitsp
pause 100
PIEZA=1
ENDIF
IF PORTD.7=0 THEN
lCDOUT $FE,1," LIMITE PIEZA ",$FE,$C0," ATRAS "
GOsub limitsp
pause 100
PIEZA=0
ENDIF
IF CARGA = 0 THEN 'GIRO DEL MOTOR CARGA
HIGH PORTD.0 'adelante
LOW PORTD.1
ELSE
LOW PORTD.0 'atras
HIGH PORTD.1
ENDIF
IF PIEZA = 0 THEN 'GIRO DEL MOTOR PIEZA
low PORTD.2 'adelante
high PORTD.3
ELSE
high PORTD.2 'atras
low PORTD.3
ENDIF
ADCIN 0,RES
DUTY=RES
VELO=((RES*100)/255)
LCDOUT $FE,2,"VEL CARGA=",DEC VELO,"% "
ADCIN 1,RES2
DUTY2=RES2
VELO=((RES2*100)/255)
LCDOUT $FE,$C0,"VEL PIEZA=",DEC VELO,"% "
IF PORTC.0=1 THEN 'CARGA
CCP1CON.4=DUTY.0
CCP1CON.5=DUTY.1
CCPR1L= DUTY >> 2
else
duty=0
CCP1CON.4=DUTY.0
CCP1CON.5=DUTY.1
CCPR1L= DUTY >> 2
ENDIF
IF PORTC.5=1 THEN 'PIEZA
CCP2CON.4=DUTY2.0
CCP2CON.5=DUTY2.1
CCPR2L= DUTY2 >> 2
ELSE
DUTY2=0
CCP2CON.4=DUTY2.0
CCP2CON.5=DUTY2.1
CCPR2L= DUTY2 >> 2
ENDIF
GOTO MAIN
DISABLE
ESTOP:
lCDOUT $FE,1," Paro de ",$FE,$C0," Emergencia "
while portb.0=1
DUTY=0
DUTY2=0
CCP1CON.4=DUTY.0
CCP1CON.5=DUTY.1
CCPR1L= DUTY >> 2
CCP2CON.4=DUTY2.0
CCP2CON.5=DUTY2.1
CCPR2L= DUTY2 >> 2
INTCON=%10010000
wend
RESUME MAIN
ENABLE
ENd
INICIO:
lCDOUT $FE,1," Inicio Ciclo ",$FE,$C0," Programado "
pause 1000
while 0<=1
ADCIN 0,RES
DUTY=RES
VELO=((RES*100)/255)
LCDOUT $FE,2,"VEL CARGA=",DEC VELO,"% "
ADCIN 1,RES2
DUTY2=RES2
VELO=((RES2*100)/255)
LCDOUT $FE,$C0,"VEL PIEZA=",DEC VELO,"% "
CCP1CON.4=DUTY.0
CCP1CON.5=DUTY.1
CCPR1L= DUTY >> 2
CCP2CON.4=DUTY2.0
CCP2CON.5=DUTY2.1
CCPR2L= DUTY2 >> 2
IF PORTD.4=0 THEN return
IF PORTD.5=0 THEN return
IF PORTD.6=0 THEN return
IF PORTD.7=0 THEN return
wend
RETURN
LIMITSC:
duty=0
CCP1CON.4=DUTY.0
CCP1CON.5=DUTY.1
CCPR1L= DUTY >> 2
RETURN
LIMITSP:
DUTY2=0
CCP2CON.4=DUTY2.0
CCP2CON.5=DUTY2.1
CCPR2L= DUTY2 >> 2
RETURN
Como verán tambien tiene entradas para PARO DE EMERGENCIA ciclo programado y swich's de limite.
alguien podría ayudarme para tener el 100% a la salida del PWM...
saludos!