ADC/PWM Microcode al 20% para dos motores 3A

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.

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!
 
Atrás
Arriba