Autor Tema: problema en programa con ADC (PBP)  (Leído 7398 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 84
Re: problema en programa con ADC (PBP)
« Respuesta #15 en: 30 de Marzo de 2007, 20:46:58 »
Hola navaismo: Efectivamente es lo que estoy usando,  ADCIN; me confundo con los términos,
es la continuación del programa más arriba. Es para la silla de ruedas que posteo oskario en el otro subforo en el que tù interviniste. Migré a PBP por que si no estaba fuera de foco. Los led que estoy
usando ahora los sustituiré por las 2 entradas de un puente H, previamente deberé vincular la(s) variable(s) con un comandos PWM que creo tiene PBP, lógicaqmente espero contar con el apoyo de ustedes como siempre, de lo contrario no podre llegar. El pic es 16f877
Posteriormente habra que agregar otro motor, pero por ahora para ir despacio, por etapas e ir aprendiendo, hare lo mas fácil, usar solo un motor para ver si el programa funciona.
« Última modificación: 30 de Marzo de 2007, 21:37:21 por hsen »
Un saludo desde Rocha (Uruguay)

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 84
Re: problema en programa con ADC (PBP)
« Respuesta #16 en: 30 de Marzo de 2007, 22:59:18 »
Denuevo estoy preguntando: Segùn el manual de PBP: PWM Pin,Duty,Cycle ....Por lo cual deduzco:
PWM ledred,adval,(¿aqui ?). En Cycle no sé que poner, necesito una salida constante mientras no cambie la variable. La variable adval va a determinar el "Duty" de PWM de acuerdo a la posición del potenciómetro respectivo.
Codigo:
'device: 16f877
      trisc=0
       
        TRISA = %11111111      ' fija porta todas como entrada
        ADCON1 = %00000010      ' 
        portb=0
        portc=0
        adval  var byte      ' Crea variable adval y almacena el resultado
       
        symbol ledred = portb.0
        symbol ledgreen = portb.1
        Pause 500             ' Wait .5 second

loop:    ADCIN 0, adval               ' Read channel 0 to adval
 
        Pause 100                ' Wait .1 second
       
        if adval => 130 then    ' si la variable adval es igual o mayor que 130 ir a yf
        goto yf
        else
        if adval =< 125 then   'si adval es igual o menor que 125 entonces ir a yb
        goto yb                  
l:     
     endif                         
        endif
        Goto loop
 
 yf:    adval=(adval*2)-255         'vincular este resultado con PWM para controlar
                                                 'entradas al puente H cuando el motor en avance
         
PWM,ledred,adval,????                 'no se como sustituir "Cycle"     
Goto l
     
 
yb: adval=255-(adval*2)            'vincular este resultado con PWM para comandar
                                                 'entradas al puente H del motor en reversa
         PWM,ledgreen,adval,?????
        Goto l     
 
« Última modificación: 30 de Marzo de 2007, 23:31:10 por hsen »
Un saludo desde Rocha (Uruguay)

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: problema en programa con ADC (PBP)
« Respuesta #17 en: 30 de Marzo de 2007, 23:35:21 »
revise esto para lo del PWM para que no lo use en programación, para que utilice el PWM que trae en hardware el 16F877
http://www.todopic.com.ar/foros/index.php?topic=15437.msg98797#msg98797

O puede utilizar la instrucción HPWM para que el PWM trabaje solo y no tenga que esperar a que se termine la instrucción para hacer otra cosa.

Para lo del escalamiento del PWM por medio del AD tiene mucha información en el foro, revise esto:
http://www.todopic.com.ar/foros/index.php?topic=14074.0
http://www.todopic.com.ar/foros/index.php?topic=3635.0

De hecho, yo utilizo el código que dá microengineering labs (PBP) para utilizar los 10 bits del PWM: http://www.microengineeringlabs.com/resources/samples/pbp/hardpwm.bas
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 84
Re: problema en programa con ADC (PBP)
« Respuesta #18 en: 31 de Marzo de 2007, 07:53:13 »
Hola Mario:
Me gustó la idea de  HPWM, eso sería lo ideal, miré los  link que dejaste, el primero me parece muy interesante pero por ahora sobrepasa mi nivel de comprensión, en cuanto a los otros: PID, ni idea de que se trata, Matlab, menos. Pero por ahora dejemos eso.
El código que pretendo realizar está inspirado en un link que dejaste anteriormente. Rentron,  para su  ruf-bot, el cual es muy sencillo.
 En cuanto a la lectura en los potenciómetros,  pienso que con 8 BIT tendría suficiente precisión puesto que equivale a 255 incrementos de velocidad  al manejar HPWM.
Además  estaríamos usando el comando ADCIN, es más preciso que POT. Mi pregunta es: Si cambio estas líneas del código.


 yf:    adval= (adval*2)-255         'vincular este resultado con PWM para controlar
                                                 'entradas al puente H cuando el motor en avance
         
 PWM,ledred,adval,????                 'no se como sustituir "Cycle"     
Goto l

Por estas:


 yf:    adval=(adval*2)-255         'vincular este resultado con PWM para controlar
                                                 'entradas al puente H cuando el motor en avance
         
HPWM,ledred,adval,????                 'no se como sustituir "Cycle"     
Goto l

Una vez terminada esta sentencia, ¿Ahí ya no le estaríamos diciendo a HPWM que debe poner el resultado de la variable adval en el pin ledred (falta ¿???) en modo PWM?.
 Si logramos hacer eso ya estariamos controlando el motor con PWM (eso creo, pero...).
« Última modificación: 31 de Marzo de 2007, 09:24:30 por hsen »
Un saludo desde Rocha (Uruguay)

Desconectado hsen

  • PIC12
  • **
  • Mensajes: 84
Re: problema en programa con ADC (PBP)
« Respuesta #19 en: 31 de Marzo de 2007, 23:19:34 »
Hola a todos:Bueno, termine el código para la silla de ruedas de oskario. Gracias a todos los amigos y amigas del foro que colaboraron y mucho. Tambien a mi amigo Gustavo, que es quien dio el puntillaso final y muy importante. Lamentablemente Oskario que era el principal interesado no se habrá podido hacer presente.
Hay algunas cosas que tocar, como ser, la vantana cuando los potes del yoystic astán en descanso debe ser mayor, pero en general en la simulaciòn funciona bien.
Las caracteristicas generales de este programas son que:cuando avance, lógicamente funcionan los dos motores hacia adelante, para doblar en marcha segun el sentido, la velocidad de uno de los motores aumenta y la del otro diminuye, para girar insitu, un motor gira en un sentidoy el otro a la inversa. La velocidad de los motores al girar insitu es un 90 % menor al del funcionamiento  normal , tambien al doblar en marcha los incrementos y decrementos  en la  velocidad  de dichos motores no varìan en  más de un 10 % con respecto a la velocidad de marcha normal, lo mismo para reversa.
 
Ahí dejo el código, y el archivo de la simulaciòn en Proteus.

'****************************************************************
'*  Name    : Silla de ruedas electrónica                                                       *
'*  Author  : [                                                                                            *
'*  Notice  : Copyright (c) 2007 [select VIEW...EDITOR OPTIONS]                  *
'*          : All Rights Reserved                                                                     *
'*  Date    : 27/03/2007                                                                              *
'*  Version : 1.0                                                                                         *
'*  Notes   :                                                                                               *
'*          :                                                                                                  *
'****************************************************************
 

'device: 16f877
      trisc=0
        DEFINE ADC_BITS 8
        TRISA = %11111111      ' fija porta, todo como entrada
        trisb = %00000000
        ADCON1 = %00000000      ' 
        portb=0
        portc=0
        advaly  var WORD      ' Crea variable adval y almacena el resultado
        advalx  var word
        poterd  var word
        poteri  var word
        t1 var  word
        t2 var word
        srd var byte
        sri var byte
        adelanterd var bit
        atrasrd var bit
        adelanteri var bit
        atrasri   var bit
       
        'symbol ledred = portb.0
        'symbol ledgreen = portb.1
        'Pause 500             ' Wait .5 second

        adelanterd = 0
        atrasrd = 0
        adelanteri = 0
        atrasri = 0


loop:    ADCIN 0, advaly               ' Read channel 0 to adval
         ADCIN 1, advalx                'lee canal 1 en advalx
       
         adelanterd = 0                   'rueda derecha hicia adelante
         atrasrd = 0                         'rueda derecha hicia atras
         adelanteri = 0                    'rueda izquierda 
         atrasri = 0                         '
         
         
        if advalx => 130 then
         t1 = advalx * 2
         t2 = t1 - 255
         advalx = t2 / 20
         poterd = advaly - advalx        'pote rueda derecha
         poteri = advaly + advalx        'pote rueda izquierda
        else
        t1 = advalx * 2
         t2 = 255 - t1
         advalx = t2 / 20
         poterd = advaly + advalx
         poteri = advaly - advalx
        endif
         
     
      if poterd => 130 then
         t1 = poterd * 2
         srd = t1 - 255
         adelanterd = 1
         atrasrd  = 0
        endif
       
      if poterd =< 125 then
         t1 = poterd * 2
         srd = 255 - t1
         adelanterd = 0
        atrasrd = 1
       endif
       
       
       if poteri => 130 then
         t1 = poteri * 2
         sri = t1 - 255
         adelanteri = 1
         atrasri = 0 
       endif
       
        if poteri =< 125 then
         t1 = poteri * 2
         sri = 255 - t1   
         adelanteri = 0
         atrasri = 1
        endif
       
         HPWM 1,srd,1000
         HPWM 2,sri,1000
         
         portb.0 = adelanterd
         portb.1 = atrasrd
         portb.2 = adelanteri
         portb.3 = atrasri

        Goto loop
        End
 
« Última modificación: 01 de Abril de 2007, 21:28:47 por hsen »
Un saludo desde Rocha (Uruguay)

Desconectado Mario

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 873
Re: problema en programa con ADC (PBP)
« Respuesta #20 en: 02 de Abril de 2007, 03:02:45 »
Déjeme revisarlo y le comento (acabo de llegar de un viajecillo  8))
La buena administración es utilizar el sentido común y la regla de oro; aunque el sentido común no es tan común como quisiéramos que fuera y, quien tiene el oro, hace las reglas.
George Terry

"A loser will defeat a genius with hard work"
Rock Lee


 

anything