Autor Tema: Control de varios servos con pulsadores (push boton) y el pic 16F628A  (Leído 31496 veces)

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

Desconectado ckontreras

  • PIC10
  • *
  • Mensajes: 1
Re: Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #15 en: 15 de Abril de 2012, 01:54:45 »
Como se podria manejar este circuito pero a control remoto, quiero intentar pero aun no tengo las bases, si alguien me puede ayudar ya que quiero controlar 6 servos, de antemano muchas gracias.

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #16 en: 15 de Febrero de 2016, 22:57:36 »
Parece que este tema ya tiene un buen tiempo de haber sido publicado, pero preguntare.

_Maxi o alguien del foro que me ayude a saber lo siguiente.

En el codigo de _Maxi
Código: CSS
  1. #define pinServo0 PIN_D0
  2.          #define pinServo1 PIN_D1
  3.          #define pinServo2 PIN_D2
  4.          #define pinServo3 PIN_D3
  5.          #define pinServo4 PIN_D4
  6.          #define pinServo5 PIN_D5
  7.          #define pinServo6 PIN_D6
  8.          #define pinServo7 PIN_D7
  9.          
  10.          int16 ticksTotalServo = 12500; //tickAltoMaximo = 11500 tickAltoMinimo = 3500
  11.          int16 ticksAltoServo[8];
  12.          int8 servoAMover=0;
  13.          int1 subir=1, enableServo[8]={1,1,1,1,1,0,0,0};
  14.          
  15.          #int_timer1
  16.          void intTimer(void)
  17.          {
  18.          if(subir==1)
  19.          {
  20.          if(servoAMover == 0 && enableServo[0] == 1) output_high(pinServo0);
  21.          if(servoAMover == 1 && enableServo[1] == 1) output_high(pinServo1);
  22.          if(servoAMover == 2 && enableServo[2] == 1) output_high(pinServo2);
  23.          if(servoAMover == 3 && enableServo[3] == 1) output_high(pinServo3);
  24.          if(servoAMover == 4 && enableServo[4] == 1) output_high(pinServo4);
  25.          if(servoAMover == 5 && enableServo[5] == 1) output_high(pinServo5);
  26.          if(servoAMover == 6 && enableServo[6] == 1) output_high(pinServo6);
  27.          if(servoAMover == 7 && enableServo[7] == 1) output_high(pinServo7);
  28.          set_timer1(65535 - ticksAltoServo[servoAMover]);  
  29.          subir = 0;
  30.          }
  31.          else if(subir==0)
  32.          {
  33.          if(servoAMover == 0 && enableServo[0] == 1) output_low(pinServo0);
  34.          if(servoAMover == 1 && enableServo[1] == 1) output_low(pinServo1);
  35.          if(servoAMover == 2 && enableServo[2] == 1) output_low(pinServo2);
  36.          if(servoAMover == 3 && enableServo[3] == 1) output_low(pinServo3);
  37.          if(servoAMover == 4 && enableServo[4] == 1) output_low(pinServo4);
  38.          if(servoAMover == 5 && enableServo[5] == 1) output_low(pinServo5);
  39.          if(servoAMover == 6 && enableServo[6] == 1) output_low(pinServo6);
  40.          if(servoAMover == 7 && enableServo[7] == 1) output_low(pinServo7);
  41.          set_timer1(65535 - ticksTotalServo + ticksAltoServo[servoAMover]);  
  42.          servoamover++;
  43.          if (servoAMover > 7) servoAMover = 0 ;
  44.          subir = 1;
  45.          }
  46.          }
  47.          
  48.          void main()
  49.          {        
  50.          int8 i;
  51.          set_tris_d(0x00);
  52.          set_tris_a(0xFF);
  53.          
  54.          setup_adc(ADC_CLOCK_INTERNAL);
  55.          setup_adc_ports(ALL_ANALOG);  
  56.          
  57.          disable_interrupts(global);
  58.          setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  59.          setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  60.          setup_timer_2(T2_DISABLED,0,1);
  61.          port_b_pullups(FALSE);
  62.          
  63.          enable_interrupts(int_timer1);
  64.          enable_interrupts(global);          
  65.          set_timer1(60000);
  66.                
  67.          while(true)
  68.          {        
  69.          for(i=0;i<8;i++) //leyendo los valores de los LDR
  70.          {
  71.          if(enableServo[i]==1)
  72.          set_adc_channel(i);
  73.          delay_us(20);
  74.          ticksAltoServo[i] = 4750 + (read_adc()*5);        
  75.          }                  
  76.          }
  77.          }

Alguien me puede decir de donde sale esto, me refiero al 4750 y al adc multiplicado por 5:

Código: CSS
  1. ticksAltoServo[i] = 4750 + (read_adc()*5);
El señor es mi pastor,  nada me faltará.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #17 en: 15 de Febrero de 2016, 23:14:32 »
Es simple.. Empecemos pensando con logica...

Ese valor que se carga ahi, luego carga el Timer.  En realidad

65535 - ticksTotalServo + ticksAltoServo[servoAMover]

Del maximo que es ticksTotalServo, carga el valor que es distintivo para esos.

El tema esta en que tenes un "maximo" y un "minimo". ticksTotalServo es el TOTAL tu maximo y minimo deben esta comprendidos entre esos 2 valores.
Supongamos entre 4750 y 10000.

Vos tenes que transformar tu salida del ADC 0 a 1023 a esos valores, tal que cuando el ADC sea 0 tengas como salida 4750 y cuando el ADC sea 1023 sea 10000.
En fin tenes que hacer una simple recta. Estoy mas que seguro que esto dio algo asi:

y = 4750 + 5.13*x

Pero para no trabajar con flotantes se decide ir por enteros. Y fin.. ahi tenes convertido tu ADC de 0 a 1023, a valores de salida de 4750 a casi 10000.
El codigo esta basado en uno de RedPic . Y en el codigo de RedPic tiene lso valores definidos en ticks

Código: C
  1. const int16  Ticks4Window  = 12500;  // PWM Window for servo = 2.5 ms x 8 = 20 ms
  2. const int16  Ticks4Minimum =  3500;  // PWM High for Minimum Position = 0.7 ms  
  3. const int16  Ticks4Center  =  7500;  // PWM High for Center  Position = 1.5 ms  
  4. const int16  Ticks4Maximum = 11500;  // PWM High for Maximum Position = 2.3 ms

http://www.todopic.com.ar/foros/index.php?topic=20335.0
« Última modificación: 15 de Febrero de 2016, 23:36:26 por KILLERJC »

Desconectado Abner_emanuel

  • PIC16
  • ***
  • Mensajes: 160
Re:Control de varios servos con pulsadores (push boton) y el pic 16F628A
« Respuesta #18 en: 15 de Febrero de 2016, 23:33:58 »
Eureka!
Gracias por responder, sólo haré a lápiz lo que en decis. Ya entiendo.

 :-/
El señor es mi pastor,  nada me faltará.


 

anything