Autor Tema: 4 servos con el ADC  (Leído 3611 veces)

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

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
4 servos con el ADC
« en: 06 de Febrero de 2016, 04:35:28 »
Que tal amigos, tengo la necesidad de mover 4 servos cada uno controlado con el ADC del mismo pic. La verdad no se como empezar ya que esto de los servos en nuevo para mi, aunque ya e leído algo sobre ellos (funcionamiento de los servos). Me gustaría que me ayudaran para ver por donde inicio con este proyecto.

Gracias por su ayuda. :P

Desconectado Miquel_S

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1251
Re:4 servos con el ADC
« Respuesta #1 en: 06 de Febrero de 2016, 07:23:24 »
Todos somos muy ignorantes. Lo que ocurre es que no todos ignoramos las mismas cosas.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:4 servos con el ADC
« Respuesta #2 en: 06 de Febrero de 2016, 11:36:50 »
Gracias Miquel_S, estoy leyendo el tema que me decis y además una publicación de Redpic del control de 8 servos con tmer1. Gracias por la u ayuda y por responder.

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:4 servos con el ADC
« Respuesta #3 en: 20 de Febrero de 2016, 20:29:10 »
Después de haber comprendido el Funcionamiento e implementación del control de 8 servos con un solo timer que tiene el maestro RedPic (http://www.todopic.com.ar/foros/index.php?topic=20335.0) y haber leido algo mas en este foro, e llegado a este code, el cual manipula 4 servos con el ADC del pic. A decir verdad yo lo requiero para mover 4 motores Brushless.

Código: CSS
  1. #include <18f4550.h>
  2.          #device ADC=10        
  3.          #fuses PLL1,CPUDIV1,USBDIV,XTPLL,NOFCMEN,NOIESO,PUT,NOBROWNOUT,VREGEN,NOWDT,NOPBADEN,MCLR,NOSTVREN,NOLVP,NODEBUG,PROTECT,NOSTVREN,NOCPB,NOWRT
  4.          #use delay (clock=48000000)
  5.          #use fast_io(a)
  6.          #use fast_io(d)
  7.          #priority timer1
  8.  
  9.          #define pinServo0 PIN_D0
  10.          #define pinServo1 PIN_D1
  11.          #define pinServo2 PIN_D2
  12.          #define pinServo3 PIN_D3
  13.          
  14.          int16 ticksTotalServo = 30012;
  15.          int16 ticksAltoServo[8];
  16.          int8 servoAMover=0;
  17.          int1 subir=1, enableServo[4]={1,1,1,1};
  18.          
  19.          #int_timer1
  20.          void intTimer(void)
  21.          {
  22.          if(subir==1)
  23.          {
  24.          if(servoAMover == 0 && enableServo[0] == 1) output_high(pinServo0);
  25.          if(servoAMover == 1 && enableServo[1] == 1) output_high(pinServo1);
  26.          if(servoAMover == 2 && enableServo[2] == 1) output_high(pinServo2);
  27.          if(servoAMover == 3 && enableServo[3] == 1) output_high(pinServo3);
  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.          set_timer1(65535 - ticksTotalServo + ticksAltoServo[servoAMover]);  
  38.          servoamover++;
  39.          if (servoAMover > 7) servoAMover = 0 ;
  40.          subir = 1;
  41.          }
  42.          }
  43.          
  44.          void main()
  45.          {          
  46.          int8 i;        
  47.          set_tris_D(0x00);
  48.          set_tris_a(0xFF);
  49.          
  50.          setup_adc(ADC_CLOCK_INTERNAL);
  51.          setup_adc_ports(ALL_ANALOG);  
  52.          
  53.          disable_interrupts(global);
  54.          setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
  55.          setup_timer_1(T1_INTERNAL | T1_DIV_BY_1);
  56.          setup_timer_2(T2_DISABLED,0,1);
  57.          port_b_pullups(FALSE);
  58.        
  59.          enable_interrupts(int_timer1);
  60.          enable_interrupts(global);
  61.          
  62.          set_timer1(60000);
  63.                      
  64.          while(true)
  65.          {        
  66.          for(i=0;i<8;i++)
  67.          {
  68.          if(enableServo[i]==1)
  69.          set_adc_channel(i);
  70.          delay_ms(10);
  71.          ticksAltoServo[i] = 12004.8 + (read_adc()*11.734);        
  72.          }                
  73.          }    
  74.          }

Ahora resta probar el funcionamiento físicamente :?..
« Última modificación: 20 de Febrero de 2016, 20:31:26 por mariacontenis »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:4 servos con el ADC
« Respuesta #4 en: 20 de Febrero de 2016, 20:48:41 »
A decir verdad yo lo requiero para mover 4 motores Brushless.

No entiendo por que hiciste el programa para un servo cuando lo querias para un BLDC, no es lo mismo ... A no ser que alimentes un driver que acepte lo mismo que el servo

Desconectado mariacontenis

  • PIC16
  • ***
  • Mensajes: 116
Re:4 servos con el ADC
« Respuesta #5 en: 20 de Febrero de 2016, 20:59:43 »
Tengo un ESC (control electrónico de velocidad), que implementadolo para este motor la variacion del tiempo de trabajo Ton va de 1ms a 2ms. Lo e visto en este link pero para un arduino.

 


Quiero probar este codigo realizado en ccs, ya que simulado en el proteus funciona perfectamente.

« Última modificación: 21 de Febrero de 2016, 09:50:17 por mariacontenis »

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:4 servos con el ADC
« Respuesta #6 en: 21 de Febrero de 2016, 06:20:26 »
Ahh pense que hacias el control directo sobre el BLDC. Entonces continue :) y traiga los resultados :P