Exemplo n.º 1
0
int main(void)
{


  
  // init motors and PWMs
  brushless_init();


  // enable power bridges
  sbi(DDRG, 1);
  sbi(PORTG, 1);
  
  
  // init uart
  uart_init();
  fdevopen((void *)uart0_send,NULL,0);

  
  
  //printf_P(PSTR("\nbonjour\n"));
  
  
  
  /** replaces the scheduler. This is directly derived from the interrupt which runs the brushless motors, for convenience */
  brushless_0_register_periodic_event(asserv_rapide_manage); // 10 ms
  
  
  
  /** speed PID stuff */
  
  // PID
  pid_init(&speed_pid);
  
  pid_set_gains(&speed_pid,     180, 70, 40); // sur alim
  
  pid_set_maximums(&speed_pid,  0, 80, PWM_MAX*4/5);
  pid_set_out_shift(&speed_pid, 0);
  
  // derivation (This could alternatively be skipped if we use the brushless peed info directly)
  biquad_init(&speed_derivation);
  biquad_set_numerator_coeffs(&speed_derivation, 1,-1,0); // this is a discrete derivation : O(n) = I(n) - I(n-1)
  // no need to initialize denominator coeffs to 0, init has done it
  
  // control system speed
  cs_init(&speed);
  
  cs_set_correct_filter(&speed, pid_do_filter, &speed_pid);
  cs_set_process_in(&speed, brushless_set_torque, (void *)0 );
  cs_set_process_out(&speed,brushless_get_pos , (void *)0 );
  cs_set_feedback_filter(&speed, biquad_do_filter, &speed_derivation);
  cs_set_consign(&speed, 0);
  
  
  
  /** ramp generator parameters */
  
  quadramp_derivate_init(&position_quadr_derv);
  
  quadramp_derivate_set_gain_anticipation(&position_quadr_derv, 256 *3);// some anticipation : 3.0 (this is a fixed point value *1/256)

  quadramp_derivate_set_goal_window(&position_quadr_derv, 5);           // algorithm shut down window

  quadramp_derivate_set_2nd_order_vars(&position_quadr_derv,   1 ,  1); // max acceleration : 1
  quadramp_derivate_set_1st_order_vars(&position_quadr_derv,  12,  12); // max speed is 12

  quadramp_derivate_set_divisor(&position_quadr_derv, 2);               // divisor, for precision


  // control system position 
  cs_init(&position);
  cs_set_correct_filter(&position, quadramp_derivate_do_filter, &position_quadr_derv); 
  cs_set_process_in(&position, (void *)cs_set_consign, &speed );
  cs_set_process_out(&position,brushless_get_pos , (void *)0 );
  cs_set_consign(&position, 0);


  /** begin */
  
  brushless_set_speed((void *)0 , BRUSHLESS_MAX_SPEED); // init speed

  sei();




  // some simple trajectories (enable one )

  while(1)
  {
  wait_ms(3500);
  cs_set_consign(&position, 400);
  wait_ms(500);
  cs_set_consign(&position, 0);
  }


  /*
  while(1)
  {
  wait_ms(2500);
  cs_set_consign(&position, 2000);
  wait_ms(2500);
  cs_set_consign(&position, 0);
  }



  // test of speed pid only, deactivate the position.
  while(1)
  {
  wait_ms(300);
  cs_set_consign(&speed, 10);
  wait_ms(300);
  cs_set_consign(&speed, -10);
  } */




  while(1);


  return 0;
}
Exemplo n.º 2
0
void robot_cs_init(robot_cs_t* rcs)
{
  // zeroing structures
  rcs->hrs = NULL;
  rcs->hpm = NULL;

  // set CS on
  rcs->active = 1;

  // CS not reactivated since last tick
  rcs->reactivated = 0;

	// setup PIDs
	pid_init(&pid_x);
	pid_init(&pid_y);
	pid_init(&pid_angle);

	pid_set_gains(&pid_x, SETTING_PID_X_GAIN_P,
                        SETTING_PID_X_GAIN_I,
                        SETTING_PID_X_GAIN_D);
  pid_set_maximums(&pid_x, SETTING_PID_X_MAX_IN,
                           SETTING_PID_X_MAX_I,
                           SETTING_PID_X_MAX_OUT);
  pid_set_out_shift(&pid_x, SETTING_PID_X_SHIFT);
 
  pid_set_gains(&pid_y, SETTING_PID_Y_GAIN_P,
                        SETTING_PID_Y_GAIN_I,
                        SETTING_PID_Y_GAIN_D);
  pid_set_maximums(&pid_y, SETTING_PID_Y_MAX_IN,
                           SETTING_PID_Y_MAX_I,
                           SETTING_PID_Y_MAX_OUT);
  pid_set_out_shift(&pid_y, SETTING_PID_Y_SHIFT);
 
  pid_set_gains(&pid_angle, SETTING_PID_A_GAIN_P,
                            SETTING_PID_A_GAIN_I,
                            SETTING_PID_A_GAIN_D);
  pid_set_maximums(&pid_angle, SETTING_PID_A_MAX_IN,
                           SETTING_PID_A_MAX_I,
                           SETTING_PID_A_MAX_OUT);
  pid_set_out_shift(&pid_angle, SETTING_PID_A_SHIFT);
  
  // quadramp
  quadramp_set_1st_order_vars(&qramp_angle,
                                SETTING_QRAMP_A_SPEED, SETTING_QRAMP_A_SPEED);
  quadramp_set_2nd_order_vars(&qramp_angle,
                                SETTING_QRAMP_A_ACC, SETTING_QRAMP_A_ACC);
  
	// setup CSMs
	cs_init(&csm_x);
	cs_init(&csm_y);
	cs_init(&csm_angle);

	cs_set_consign_filter(&csm_x,     NULL, NULL); 
	cs_set_consign_filter(&csm_y,     NULL, NULL); 
  cs_set_consign_filter(&csm_angle, &quadramp_do_filter, &qramp_angle);

	cs_set_correct_filter(&csm_x,     &pid_do_filter, &pid_x);
	cs_set_correct_filter(&csm_y,     &pid_do_filter, &pid_y);
	cs_set_correct_filter(&csm_angle, &pid_do_filter, &pid_angle);

	cs_set_feedback_filter(&csm_x,     NULL, NULL);
	cs_set_feedback_filter(&csm_y,     NULL, NULL);
	cs_set_feedback_filter(&csm_angle, NULL, NULL);

	cs_set_process_out(&csm_x, &get_robot_x, rcs);
	cs_set_process_out(&csm_y, &get_robot_y, rcs);
	cs_set_process_out(&csm_angle, &get_robot_a, rcs);

	cs_set_process_in(&csm_x, NULL, NULL);
	cs_set_process_in(&csm_y, NULL, NULL);
	cs_set_process_in(&csm_angle, NULL, NULL);
}
Exemplo n.º 3
0
void motor_cs_init()
{
  // initialize pwms
  pwm_init();

  // setup pwms dirs
  sbi(MOTOR_CS_PWM1_DDR,MOTOR_CS_PWM1_PIN);
  cbi(MOTOR_CS_PWM1_PORT,MOTOR_CS_PWM1_PIN);

  sbi(MOTOR_CS_PWM2_DDR,MOTOR_CS_PWM2_PIN);
  cbi(MOTOR_CS_PWM2_PORT,MOTOR_CS_PWM2_PIN);

  sbi(MOTOR_CS_PWM3_DDR,MOTOR_CS_PWM3_PIN);
  cbi(MOTOR_CS_PWM3_PORT,MOTOR_CS_PWM3_PIN);

  motor1_sign = 0;
  motor2_sign = 0;
  motor3_sign = 0;

  pwm_set_1A(0);
  pwm_set_1B(0);
  pwm_set_1C(0);
  
  // setup brake
  sbi(MOTOR_CS_BREAK_DDR, MOTOR_CS_BREAK_PIN);
  cbi(MOTOR_CS_BREAK_PORT, MOTOR_CS_BREAK_PIN);

  // activate interrupts
  sbi(TIMSK,TOIE1);

	// setup PIDs
	pid_init(&pid_motor1);
	pid_init(&pid_motor2);
	pid_init(&pid_motor3);

  pid_set_gains(&pid_motor1, 500, 0, 10) ;
  pid_set_maximums(&pid_motor1, 0, 0, 0);
  pid_set_out_shift(&pid_motor1, 10);
 
  pid_set_gains(&pid_motor2, 500, 0, 10) ;
  pid_set_maximums(&pid_motor2, 0, 0, 0);
  pid_set_out_shift(&pid_motor2, 10);
 
  pid_set_gains(&pid_motor3, 500, 0, 10);
  pid_set_maximums(&pid_motor3, 0, 0, 0);
  pid_set_out_shift(&pid_motor3, 10);

	// setup CSMs
	cs_init(&csm_motor1);
	cs_init(&csm_motor2);
	cs_init(&csm_motor3);

	cs_set_consign_filter(&csm_motor1, NULL, NULL);
	cs_set_consign_filter(&csm_motor2, NULL, NULL);
	cs_set_consign_filter(&csm_motor3, NULL, NULL);

	cs_set_correct_filter(&csm_motor1, &pid_do_filter, &pid_motor1);
	cs_set_correct_filter(&csm_motor2, &pid_do_filter, &pid_motor2);
	cs_set_correct_filter(&csm_motor3, &pid_do_filter, &pid_motor3);

	cs_set_feedback_filter(&csm_motor1, NULL, NULL);
	cs_set_feedback_filter(&csm_motor2, NULL, NULL);
	cs_set_feedback_filter(&csm_motor3, NULL, NULL);

	cs_set_process_out( &csm_motor1, &get_encoder_motor1, NULL);
	cs_set_process_out( &csm_motor2, &get_encoder_motor2, NULL);
	cs_set_process_out( &csm_motor3, &get_encoder_motor3, NULL);

	cs_set_process_in( &csm_motor1, &set_pwm_motor1, NULL);
	cs_set_process_in( &csm_motor2, &set_pwm_motor2, NULL);
	cs_set_process_in( &csm_motor3, &set_pwm_motor3, NULL);

	return;
}