Esempio n. 1
0
int main(void) {
    setup();
    pwm_set_duty(0);
    pwm_set_direction(0);
    
    printf("%s\r\n", "STARTING LOOP");
    float encoder_master_count = 0;
    uint16_t current_ticks = 0;
    uint16_t previous_ticks = spi_read_ticks();
    float target_degs = 10;
    float motor_current = 0;  // current through motor in amperes
    float pid_command = 0;
    float theor_torque;
    bitset(&IEC0, 2);
    bitset(&IEC0, 6);
    
    while (1) {
        if (timer_flag(&timer2)) {
            // Blink green light to show normal operation.
            timer_lower(&timer2);
            led_toggle(&led2);
        }

        if (timer_flag(&timer3)) {
            timer_lower(&timer3);
            led_toggle(&led3);
            theor_torque = spring_model(degs);  // Outputs theoretical torque predicted by spring model
            cur_control.set_point = fabsf(theor_torque);
            cur_control.neg_set_point = read_sign(theor_torque);
            read_motor_current(&motor);
            cur_control.position = convert_motor_torque(motor.current);
            pid_command = PID_control(&cur_control);
            pwm_duty = pid_to_pwm(pid_command, cur_control.neg_set_point);
        }

        if (!sw_read(&sw2)) {
            // If switch 2 is pressed, the UART output terminal is cleared.
            printf("%s", clear);
        }
        
        ServiceUSB();
        current_ticks = spi_read_ticks();
        encoder_master_count = encoder_counter(current_ticks, previous_ticks, encoder_master_count);
        degs = count_to_deg(encoder_master_count);
        previous_ticks = current_ticks;
        pin_toggle(DEBUGD1);  // Heartbeat signal
        
    }
}
Esempio n. 2
0
PUBLIC void run_nivel_control(void)
{    
    nivel_real = ALTURA_TANQUE - HCSR04_read(0);  
  
//    if (nivel_real < 0.0)
//    {
//       nivel_real = 0.00; 
//    }
   
    pwm_out = PID_control(nivel_real, fl_set_point, &pid);
      
    if(pwm_out < 0.0)
    {
        pwm_out = 0.0;
    }
    else if(pwm_out > 80.00)
    {
        pwm_out = 80;
    }
    
    pwmMCU_set_fduty(pwm_out);        
}
Esempio n. 3
0
File: isr.c Progetto: Magicwangs/IAR
void PIT0_IRQHandler(void)
{
  DisableInterrupts; 

    TimeCount ++ ;
    
   I1_Vol_present_value=ad_ave(ADC0, AD9,ADC_16bit,10);
   I1_Vol_present_value=I1_Vol_present_value/65535*3.3;
   
   U1_present_value=ad_ave(ADC0, AD10,ADC_16bit,10);
   U1_present_value=U1_present_value/65535*3.3*16;
   
   U2_present_value=ad_ave(ADC0, AD12,ADC_16bit,10);
   U2_present_value=U2_present_value/65535*3.3*16;

   sum+=I1_Vol_present_value;
   
   PID_control();

  if(TimeCount==3000)
  {
    TimeCount = 0 ;
    sum/=3000;
    I1_Vol_present_value=sum;
    Refresh_Present();
    sum=0;
    if(U1_present_value>=24)
    {
      gpio_init(PORTC,3,GPO,0);
      gpio_init(PORTC,4,GPO,0);
      start_flag=0;
      ftm_flag=0;
    }
    
  }

  EnableInterrupts;
  PIT_Flag_Clear(PIT0);       //清中断标志位
}
Esempio n. 4
0
int main(void)
{
  PWM_Initialization();
  TIM1->CCR2 = 1000;
  TIM1->CCR3 = 1000;
  Delay_1us(500000);

  RCC_Configuration();
  PushButton_Initialization();
  LED_Initialization();
  //LCD_Initialization();
  //terminalBufferInitilization();

  Delay_1us(100000);
  SPI_Initialization();
  Delay_1us(100000);
  IMU_Initialization();
  Delay_1us(100000);
  Timer5_Initialization(); //Filter
  Timer2_Initialization(); //Print
  Timer4_Initialization(); //Read IMU

  USART3_Configuration();
  USART3_puts("\r\nHello World!\r\n");
    
  while(1)
  {
    if(PushButton_Read()){
      if(f.arm == 0){ 
        f.arm = 1;
        Delay_1us(500000);
      }
      else if(f.arm == 1){
        f.arm = 0;
        Delay_1us(500000);
      }
    }

    if(f.imu == 1){
      //LED3_Toggle();
      readIMU(gyroRaw, GYRO_DATA_REGISTER);
      gyro_remove_offset(gyroRaw);
      readIMU(accRaw, ACC_DATA_REGISTER);
      f.imu = 0;
    // }  

    // if(f.filter == 1){
      //LED4_Toggle();
      Filter(gyroRaw, gyroAngle, accRaw, accAngle, Angle);
      if(f.arm == 1){
        PID_control(Angle);
      }
      else{
        TIM1->CCR2 = 1000;
        TIM1->CCR3 = 1000;

        errorI = 0;
        errorD = 0;
        previous_error = 0;
      }

      //f.filter = 0;
    }

    strcmd_main();      

    //if(f.print == 1){
      
      // sprintf(lcd_text_main,"%.4f %.4f %d", Angle[0], Angle[1], f.arm);
      // //sprintf(lcd_text_main,"G: %.3f %.3f %.3f", EstV.G.X, EstV.G.Y, EstV.G.Z);
      // LCD_DisplayStringLine(LINE(1), lcd_text_main);
      // //sprintf(lcd_text_main,"A: %.3f %.3f %.3f", EstV.A.X, EstV.A.Y, EstV.A.Z);
      // //sprintf(lcd_text_main,"A: %.3f %.3f", sqX_sqZ, EstV.GA.X*EstV.GA.X + EstV.GA.Z*EstV.GA.Z);
      // // sprintf(lcd_text_main,"%.4f %.4f %.4f \n", gyroAngle[0], gyroAngle[1], gyroAngle[2]);
      // sprintf(lcd_text_main,"%d     ", gyroRaw[2]);
      // LCD_DisplayStringLine(LINE(2), lcd_text_main);
      // sprintf(lcd_text_main,"GA: %.3f %.3f %.3f", EstV.GA.X, EstV.GA.Y, EstV.GA.Z);
      // LCD_DisplayStringLine(LINE(3), lcd_text_main);
      //sprintf(lcd_text_main,"%.3f %.3f %.3f\n", EstV.G.Z, EstV.A.Z, EstV.GA.Z);
      
      //LCD_DisplayStringLine(LINE(2), (uint8_t*)" Ming6842 @ github");
      //terminalWrite(lcd_text_main);
      //PRINT_USART();
      //f.print = 0;
    //}
  }

  while(1); // Don't want to exit
}
Esempio n. 5
0
int translate(unsigned int *pru0data_int, unsigned int *leftPeriod, float *leftDuty, unsigned int *rightPeriod, float *rightDuty)
{	
unsigned int prev_left_encoder_count, prev_right_encoder_count;
int i,j;
char *rec1 = "/mnt/bot1.txt", *rec2 = "/mnt/bot2.txt", *rec3="/mnt/bot3.txt";
        int fd[2];
float trackRecord1[4], trackRecord2[4], trackRecord3[4], radius, deltaS, deltaX, deltaY, deltaTheta, Rvel, Lvel, Lerr, Rerr, Lp, LKp, Li, LKi,  LKi_prev, Ld, LKd, LKd_prev, Rp, RKp, Ri, RKi, RKi_prev, Rd, RKd, RKd_prev; 
	readRecord(rec1, trackRecord1);
	readRecord(rec2, trackRecord2);
	readRecord(rec3, trackRecord3);
clock_t t, t2, t3;
radius = sqrt(pow((*(trackRecord1+1)- *(trackRecord2+1)),2)+pow((*(trackRecord1+2)- *(trackRecord2+2)),2));
printf("\n trackRecord1 %f \t %f \t %f \t %f\n trackRecord2 %f \t %f \t %f \t %f\n radius \t %f \n" ,*(trackRecord1+0), *(trackRecord1+1), *(trackRecord1+2), *(trackRecord1+3), *(trackRecord2+0), *(trackRecord2+1), *(trackRecord2+2), *(trackRecord2+3),radius);

//setHeading(pru0data_int, leftDuty, rightDuty);
prev_left_encoder_count = *(pru0data_int + 3);
prev_right_encoder_count = *(pru0data_int + 4);
		*(pru0data_int + 1) = 1; //setting left direction to forward for pru0
		*(pru0data_int + 2) = 1; //setting right direction to forward for pru0
	motor_inB1_right(1);
	motor_inA1_left(1);	
	
	motor_inA2_left(0);
	motor_inB2_right(0);
while (radius > 850){
//t2 = clock();
//t3 = clock();
PID_control(pru0data_int, leftPeriod, leftDuty, rightPeriod, rightDuty);

	
                printf(" left count: %u   \t right count: %u  \n  \n", *(pru0data_int + 3), *(pru0data_int + 4));

//t = clock();
	readRecord(rec2, trackRecord2);
	deltaS = (float)((*(pru0data_int + 4)-prev_right_encoder_count) + ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_TRN_RES/2;
	deltaTheta = (float)((*(pru0data_int + 4)-prev_right_encoder_count) - ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_ROT_RES/2;
	*trackRecord2=*trackRecord2+1;
	*(trackRecord2+1)=*(trackRecord2+1) + deltaS * cos(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+2)=*(trackRecord2+2) + deltaS * sin(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+3)=*(trackRecord2+3) + deltaTheta;
	while (*(trackRecord2+3) > 2*M_PI)
		*(trackRecord2+3) -= 2*M_PI;

/*if ( *(trackRecord2+1) < 2100 && *(trackRecord2+1) > 1800 && *(trackRecord2+2) < 2100 && *(trackRecord2+2) > 1800){
	backstep(pru0data_int);
}
else {	
	writeRecord(rec2, trackRecord2);
	//trackRecord1 = readRecord1(rec1);
}*/
	writeRecord(rec2, trackRecord2);
	readRecord(rec1, trackRecord1);
	readRecord(rec2, trackRecord2);
	readRecord(rec3, trackRecord3);
	radius = sqrt(pow((trackRecord1[1]-trackRecord2[1]),2)+pow((trackRecord1[2]-trackRecord2[2]),2));
printf("\n trackRecord1 %f \t %f \t %f \t %f\n trackRecord2 %f \t %f \t %f \t %f\n radius \t %f \n" ,*(trackRecord1+0), *(trackRecord1+1), *(trackRecord1+2), *(trackRecord1+3), *(trackRecord2+0), *(trackRecord2+1), *(trackRecord2+2), *(trackRecord2+3),radius);

//t = clock() - t;
//printf ("\nIt took  %d clicks (%f seconds).\n",t,((float)t)/CLOCKS_PER_SEC);
	//setHeading(pru0data_int, leftDuty, rightDuty);
	prev_left_encoder_count = *(pru0data_int + 3);
	prev_right_encoder_count = *(pru0data_int + 4);
		*(pru0data_int + 1) = 1; //setting left direction to forward for pru0
		*(pru0data_int + 2) = 1; //setting right direction to forward for pru0
	motor_inB1_right(1);
	motor_inA1_left(1);
}
	motor_inA2_left(1); //hard brake signal
	motor_inB2_right(1);
	motor_inA1_left(1);
	motor_inB1_right(1);
	sleep(1);
	motor_inA1_left(0); // soft stop after hard brake
	motor_inB1_right(0);

	motor_inA2_left(0);
	motor_inB2_right(0);
printf(" left count: %u   \t right count: %u  \n \n", *(pru0data_int + 3), *(pru0data_int + 4));

return 0;
}
Esempio n. 6
0
int backstep(unsigned int *pru0data_int, unsigned int *leftPeriod, float *leftDuty, unsigned int *rightPeriod, float *rightDuty)
{
	char *rec1 = "/mnt/bot1.txt", *rec2 = "/mnt/bot2.txt", *rec3 = "/mnt/bot3.txt";
	float trackRecord1[4], trackRecord2[4], trackRecord3[4], dest_x, dest_y, dest_head, diff_in_theta, radius, deltaS, deltaX, deltaY, deltaTheta;
	unsigned int prev_left_encoder_count, prev_right_encoder_count;
	int fd[2], i, j, k;
	prev_left_encoder_count = *(pru0data_int + 3);
	prev_right_encoder_count = *(pru0data_int + 4);
	readRecord(rec1, trackRecord1);
	readRecord(rec2, trackRecord2);
	readRecord(rec3, trackRecord3);

printf(" \n backstepping \n");
		*(pru0data_int + 1) = 0; //setting left direction to backward for pru0
		*(pru0data_int + 2) = 0; //setting right direction to backward for pru0	
	motor_inB1_right(0);
	motor_inA1_left(0);	
	
	motor_inA2_left(1);
	motor_inB2_right(1);
k = 0;
		while ( k < 6) {		
	k++;
	PID_control(pru0data_int, leftPeriod, leftDuty, rightPeriod, rightDuty);
	}

	motor_inB1_right(0);
	motor_inA1_left(0);	
	
	motor_inA2_left(0);
	motor_inB2_right(0);
	deltaS = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) + ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_TRN_RES/2;
	deltaTheta = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) - ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_ROT_RES/2;
	*trackRecord2=*trackRecord2+1;
	*(trackRecord2+1)=*(trackRecord2+1) + deltaS * cos(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+2)=*(trackRecord2+2) + deltaS * sin(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+3)=*(trackRecord2+3) + deltaTheta;
	while (*(trackRecord2+3) > 2*M_PI)
		*(trackRecord2+3) -= 2*M_PI;	
	writeRecord(rec2, trackRecord2);

	prev_left_encoder_count = *(pru0data_int + 3);
	prev_right_encoder_count = *(pru0data_int + 4);

	readRecord(rec1, trackRecord1);
	readRecord(rec2, trackRecord2);


diff_in_theta = - M_PI/4;
	if (diff_in_theta < 0 && (int) (fabs(diff_in_theta)/ENC_ROT_RES)>0) { //rotate right
printf(" \n rotating right \n");
		*(pru0data_int + 1) = 1; //setting left direction to forward for pru0
		*(pru0data_int + 2) = 0; //setting right direction to backward for pru0

		motor_inB1_right(0);
		motor_inA1_left(1);	
	
		motor_inA2_left(0);
		motor_inB2_right(1);
		while (((int) (fabs(diff_in_theta)/ENC_ROT_RES) >= (abs(*(pru0data_int + 3) - prev_left_encoder_count))) && ((int) (fabs(diff_in_theta)/ENC_ROT_RES) >= (abs(*(pru0data_int + 4) - prev_right_encoder_count))))		
		{ 
	PID_control(pru0data_int, leftPeriod, leftDuty, rightPeriod, rightDuty);
	}
}
	motor_inB1_right(0);
	motor_inA1_left(0);	
	
	motor_inA2_left(0);
	motor_inB2_right(0);
	deltaS = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) + ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_TRN_RES/2;
	deltaTheta = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) - ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_ROT_RES/2;
	*trackRecord2=*trackRecord2+1;
	*(trackRecord2+1)=*(trackRecord2+1) + deltaS * cos(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+2)=*(trackRecord2+2) + deltaS * sin(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+3)=*(trackRecord2+3) + deltaTheta;
	while (*(trackRecord2+3) > 2*M_PI)
		*(trackRecord2+3) -= 2*M_PI;	
	writeRecord(rec2, trackRecord2);

	prev_left_encoder_count = *(pru0data_int + 3);
	prev_right_encoder_count = *(pru0data_int + 4);

	readRecord(rec1, trackRecord1);
	readRecord(rec2, trackRecord2);
	readRecord(rec3, trackRecord3);


printf(" \n moving forward \n");
		*(pru0data_int + 1) = 1; //setting left direction to forward for pru0
		*(pru0data_int + 2) = 1; //setting right direction to forward for pru0
	motor_inB1_right(1);
	motor_inA1_left(1);	
	
	motor_inA2_left(0);
	motor_inB2_right(0);
k = 0;
		while ( k < 6) 		
		{
	k++;
        PID_control(pru0data_int, leftPeriod, leftDuty, rightPeriod, rightDuty);
	}

	motor_inB1_right(0);
	motor_inA1_left(0);	
	
	motor_inA2_left(0);
	motor_inB2_right(0);
	deltaS = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) + ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_TRN_RES/2;
	deltaTheta = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) - ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_ROT_RES/2;
	*trackRecord2=*trackRecord2+1;
	*(trackRecord2+1)=*(trackRecord2+1) + deltaS * cos(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+2)=*(trackRecord2+2) + deltaS * sin(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+3)=*(trackRecord2+3) + deltaTheta;
	while (*(trackRecord2+3) > 2*M_PI)
		*(trackRecord2+3) -= 2*M_PI;	
	writeRecord(rec2, trackRecord2);
return 0;
}
Esempio n. 7
0
int setHeading(unsigned int *pru0data_int, unsigned int *leftPeriod, float *leftDuty, unsigned int *rightPeriod, float *rightDuty)
{
	char *rec1 = "/mnt/bot1.txt", *rec2 = "/mnt/bot2.txt", *rec3 = "/mnt/bot3.txt";
	float trackRecord1[4], trackRecord2[4], trackRecord3[4], dest_x, dest_y, dest_head, diff_in_theta, radius, deltaS, deltaX, deltaY, deltaTheta, Rvel, Lvel, Lerr, Rerr, Lp, LKp, Li, LKi,  LKi_prev, Ld, LKd, LKd_prev, Rp, RKp, Ri, RKi, RKi_prev, Rd, RKd, RKd_prev;
int i, j;
	unsigned int prev_left_encoder_count, prev_right_encoder_count;
prev_left_encoder_count = *(pru0data_int + 3);
prev_right_encoder_count = *(pru0data_int + 4);
	readRecord(rec1, trackRecord1);
	readRecord(rec2, trackRecord2);
	readRecord(rec3, trackRecord3);
	dest_x = (*(trackRecord1+1) + *(trackRecord2+1))/2.0;
	dest_y = (*(trackRecord1+2) + *(trackRecord2+2))/2.0;
	if (dest_y > *(trackRecord2+2)){
		dest_head = atan2(dest_y - *(trackRecord2+2), dest_x - *(trackRecord2+1));
		}
	else if (dest_y < *(trackRecord2+2)){
		dest_head = 2*M_PI + atan2(dest_y - *(trackRecord2+2), dest_x - *(trackRecord2+1));
		printf("\ndest_head %f \t \n", dest_head*180.0/M_PI);
		}

	while (dest_head > 2*M_PI){
		dest_head -= 2*M_PI;
		}
	diff_in_theta = dest_head - *(trackRecord2+3);
	if (diff_in_theta > M_PI)
		diff_in_theta = diff_in_theta - 2*M_PI;
	//diff_in_theta = M_PI/4;
	printf("\n dest_x %f \t dest_y %f \t present_x %f \t present_y %f \t dest_head %f \t present_head %f \t \n", dest_x, dest_y, *(trackRecord2+1), *(trackRecord2+2), dest_head*180.0/M_PI, *(trackRecord2+3)*180.0/M_PI);
printf("\n %d \t  %d \n", (int) (fabs(diff_in_theta)/ENC_ROT_RES), (int) (fabs(diff_in_theta)/ENC_ROT_RES));
	
		
	if (diff_in_theta > 0 && (int) (fabs(diff_in_theta)/ENC_ROT_RES) > 0) { //rotate left
printf(" \n rotating left \n");
		*(pru0data_int + 1) = 0; //setting left direction to backward for pru0
		*(pru0data_int + 2) = 1; //setting right direction to forward for pru0
	motor_inB1_right(1);
	motor_inA1_left(0);
		
	
	motor_inA2_left(1);
	motor_inB2_right(0);
		while (((int) (fabs(diff_in_theta)/ENC_ROT_RES) >= (abs(*(pru0data_int + 3) - prev_left_encoder_count))) && ((int) (fabs(diff_in_theta)/ENC_ROT_RES) >= (abs(*(pru0data_int + 4) - prev_right_encoder_count)))) 		
		{		
	PID_control(pru0data_int, leftPeriod, leftDuty, rightPeriod, rightDuty);
                //printf(" left count: %u   \t right count: %u  \n \n", (*(pru0data_int + 3)), (*(pru0data_int + 4)));
	/*deltaS = ((*(pru0data_int + 4))-prev_left_encoder_count + (*(pru0data_int + 3))-prev_right_encoder_count)*ENC_TRN_RES/2;
	deltaTheta = ((*(pru0data_int + 4))-prev_left_encoder_count - (*(pru0data_int + 3))-prev_right_encoder_count)*ENC_ROT_RES/2;
	*trackRecord2=*trackRecord2+1;
	*(trackRecord2+1)=*(trackRecord2+1) + deltaS * cos(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+2)=*(trackRecord2+2) + deltaS * sin(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+3)=*(trackRecord2+3) + deltaTheta;	
	writeRecord(rec2, trackRecord2);*/
	}
	}

	if (diff_in_theta < 0 && (int) (fabs(diff_in_theta)/ENC_ROT_RES)>0) { //rotate right
printf(" \n rotating right \n");
		*(pru0data_int + 1) = 1; //setting left direction to forward for pru0
		*(pru0data_int + 2) = 0; //setting right direction to backward for pru0

		motor_inB1_right(0);
		motor_inA1_left(1);	
	
		motor_inA2_left(0);
		motor_inB2_right(1);
		while (((int) (fabs(diff_in_theta)/ENC_ROT_RES) >= (abs(*(pru0data_int + 3) - prev_left_encoder_count))) && ((int) (fabs(diff_in_theta)/ENC_ROT_RES) >= (abs(*(pru0data_int + 4) - prev_right_encoder_count))))		
		{
	PID_control(pru0data_int, leftPeriod, leftDuty, rightPeriod, rightDuty);
                        
                }

   
	}
	motor_inB1_right(0);
	motor_inA1_left(0);	
	
	motor_inA2_left(0);
	motor_inB2_right(0);
	deltaS = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) + ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_TRN_RES/2;
	deltaTheta = (float)(((*(pru0data_int + 4))-prev_right_encoder_count) - ((*(pru0data_int + 3))-prev_left_encoder_count))*ENC_ROT_RES/2;
	*trackRecord2=*trackRecord2+1;
	*(trackRecord2+1)=*(trackRecord2+1) + deltaS * cos(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+2)=*(trackRecord2+2) + deltaS * sin(*(trackRecord2+3)+deltaTheta);
	*(trackRecord2+3)=*(trackRecord2+3) + deltaTheta;
	while (*(trackRecord2+3) > 2*M_PI)
		*(trackRecord2+3) -= 2*M_PI;	
	writeRecord(rec2, trackRecord2);
return 0;
}