示例#1
0
volatile void initialize_IMU(void)
{
	twim_init();
	Enable_Acc(TWIM);
	Enable_Gyro(TWIM);
	Enable_Magn(TWIM);
	
	delay_ms(20);
	
	for (int i = 0; i < 32; i++)
	{
		Read_Gyro();
		Read_Accel();
		RAW_OFFSET[0] += RAW[0];
		RAW_OFFSET[1] += RAW[1];		
		RAW_OFFSET[2] += RAW[2];	
		RAW_OFFSET[3] += RAW[3];	
		RAW_OFFSET[4] += RAW[4];	
		RAW_OFFSET[5] += RAW[5];	
		delay_ms(20);
	}
	
	RAW_OFFSET[0] = 0;
	RAW_OFFSET[1] = 0;
	RAW_OFFSET[2] = 0;
	RAW_OFFSET[3] = 0;
	RAW_OFFSET[4] = 0;
	RAW_OFFSET[5] = 0;
	
	timer_current = rtc_get_value(&AVR32_RTC);
	delay_ms(20);
	
	get_Angles();	
}
void sample_MiniMU9() //Main Loop
{
  if((millis()-timer)>=100) //20 // Main loop runs at 50Hz
  {
    counter++;
    timer_old = timer;
    timer=millis();
    if (timer>timer_old)
      G_Dt = (timer-timer_old)/1000.0;    // Real time of loop run. We use this on the DCM algorithm (gyro integration time)
    else
      G_Dt = 0;
    
    // *** DCM algorithm
    // Data adquisition
    Read_Gyro();   // This read gyro data
    Read_Accel();     // Read I2C accelerometer
    
    if (counter > 5)  // Read compass data at 10Hz... (5 loop runs)
      {
      counter=0;
      Read_Compass();    // Read I2C magnetometer
      Compass_Heading(); // Calculate magnetic heading  
      }
    
    // Calculations...
    Matrix_update(); 
    Normalize();
    Drift_correction();
    Euler_angles();
    // ***
   
    printdata();
  }
   
}
void init_MiniMU9()
{ 
  I2C_Init();

  delay(1500);

  Accel_Init();
  Compass_Init();
  Gyro_Init();
  
  delay(20);
  
  for(int i=0;i<32;i++)    // We take some readings...
    {
    Read_Gyro();
    Read_Accel();
    for(int y=0; y<6; y++)   // Cumulate values
      AN_OFFSET[y] += AN[y];
    delay(20);
    }
      
  
  for(int y=0; y<6; y++)
    AN_OFFSET[y] = AN_OFFSET[y]/32;
    
  AN_OFFSET[5]-=GRAVITY*SENSOR_SIGN[5];
  
  
  delay(2000);
  
  timer=millis();
  delay(20);
  counter=0;
}
示例#4
0
文件: main.c 项目: nemo1992/9DOF
int main(void)
{
  My_Init();
  Init_Timer();
  Init_I2C();
  Init_Sensors();
  SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF);
  GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_1);
    /////////////////////////////////
  SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
  		SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
  		GPIOPinConfigure(GPIO_PA0_U0RX);
  		GPIOPinConfigure(GPIO_PA1_U0TX);
  		GPIOPinTypeUART(GPIO_PORTA_BASE, GPIO_PIN_0 | GPIO_PIN_1);
  		SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOF); //enable GPIO port for LED
  		GPIOPinTypeGPIOOutput(GPIO_PORTF_BASE, GPIO_PIN_2); //enable pin for LED PF2
  		UARTConfigSetExpClk(UART0_BASE, SysCtlClockGet(), 115200,
  				(UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE));
  		IntMasterEnable(); //enable processor interrupts
  		IntEnable(INT_UART0); //enable the UART interrupt
  		UARTIntEnable(UART0_BASE, UART_INT_RX | UART_INT_RT); //only enable RX and TX interrupts
/////////////////////////////////
  Kalman_Sim_initialize();

  while(1)
  {
    Read_Accelerometer();
    Calculate_Acc();
    Read_Compass();
    Compass_Heading();
    Calculate_Compass();
    Read_Gyro();
    Calculate_Gyro();

    fgyro[0]    = sen_data.gyro_x;
    fgyro[1]	= sen_data.gyro_y;
    fgyro[2]	= sen_data.gyro_z;

    facc[0]     = sen_data.accel_x;
    facc[1]	= sen_data.accel_y;
    facc[2]	= sen_data.accel_z;

    fmag[0]     = sen_data.magnetom_x;
    fmag[1]	= sen_data.magnetom_y;
    fmag[2]	= sen_data.magnetom_z;


    Kalman_Sim_step();

    data[0]=Out1[0];
    data[1]=Out1[1];
    data[2]=Out1[2];



      Timer_CyRun();

  }
}
示例#5
0
volatile void get_Angles()
{
	static float prev_g_d_roll  = 0;
	timer_old = timer_current;
	timer_current = rtc_get_value(&AVR32_RTC);

	if (timer_current > timer_old)
	{
		g_dt = (float)((timer_current-timer_old))*0.001*0.125*0.98; // Time elapsed in seconds -- sensors are in seconds
	}	
	else
	{
		g_dt = 0;		
	}
	
	// GET DATA
	Read_Gyro();
	Read_Accel();
	
	
	// GYROSCOPE
	
	// Y = roll
	float g_d_roll = gyro_x * GYRO_GAIN_RPS; // delta roll in radians/sec
	//g_roll = roll + g_d_roll * g_dt;
	g_roll = roll + ((g_d_roll+prev_g_d_roll)/2)*g_dt;
	prev_g_d_roll = g_d_roll;
	
	// X = pitch
	float g_d_pitch = gyro_y * GYRO_GAIN_RPS; // delta pitch in radians/sec
	g_pitch = pitch + g_d_pitch * g_dt;
	
	// Z = yaw
	float g_d_yaw = gyro_z * GYRO_GAIN_RPS; // delta yaw in radians/sec
	g_yaw = yaw + g_d_yaw * g_dt;
	
	
	// ACCELEROMETER
	float acc_x = accel_x * 0.002;
	float acc_y = accel_y * 0.002;
	float acc_z = accel_z * 0.002;
	
	a_roll = atan2(-acc_y, acc_z);
	
	a_pitch = atan(acc_x/sqrt(acc_y*acc_y + acc_z*acc_z));
	
	// Weigh
	roll = TRUST_GAIN * a_roll + (1-TRUST_GAIN) * g_roll;
	pitch = TRUST_GAIN * a_pitch + (1-TRUST_GAIN) * g_pitch;

	
}
示例#6
0
文件: main.c 项目: wh200720041/Robotx
void Send_IMU_Info(void){
	
	int16_t IMU_Buffer[9];
	Read_Acc(&IMU_Buffer[0]);
	//VCP_send_IMU_Multi(ACC_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);
	Read_Gyro(&IMU_Buffer[3]);
	//VCP_send_IMU_Multi(GYRO_INDEX,IMU_Buffer[3],IMU_Buffer[4],IMU_Buffer[5]);
	Read_Compass(&IMU_Buffer[6]);
	//VCP_send_IMU_Multi(COMPASS_INDEX,IMU_Buffer[6],IMU_Buffer[7],IMU_Buffer[8]);

	/*Read_Acc(&IMU_Buffer[0]);
	Read_Gyro(&IMU_Buffer[3]);
	Read_Compass(&IMU_Buffer[6]);*/
	VCP_send_IMU_All(IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2],IMU_Buffer[3],IMU_Buffer[4],IMU_Buffer[5],IMU_Buffer[6],IMU_Buffer[7],IMU_Buffer[8]);
}
示例#7
0
void read_sensors()
{
  Read_Gyro();   // Read gyroscope
  Read_Accel();  // Read accelerometer
  Read_Magn();   // Read magnetometer
}
示例#8
0
文件: main.c 项目: wh200720041/Robotx
void run_function2(void){
	uint8_t Xval, Yval = 0x00;
	int16_t IMU_Buffer[3];
	unsigned char buff[100];
	float IMU_Buffer1[3];
	uint8_t speed=0, accuracy=0; 
	int sum = 0;
	uint32_t ADC_temp = 0;
	if(VCP_receive_string(buff)){//if receive command
		if(buff[0]=='C'){
			Button_state = BUTTON_STATE_1;//stop sending message
			switch(buff[1]){
				case 'A': 
								Read_Acc(IMU_Buffer);
									switch(buff[2]){
											case 'X': VCP_send_IMU_Single(ACC_INDEX,IMU_Buffer[0]);break;
											case 'Y': VCP_send_IMU_Single(ACC_INDEX,IMU_Buffer[1]);break; 
											case 'Z': VCP_send_IMU_Single(ACC_INDEX,IMU_Buffer[2]);break; 
											case 'A': VCP_send_IMU_Multi(ACC_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);break;
											default :break;
									} 
									break; 
				case 'G': //GyroReadAngRate(IMU_Buffer);
									Read_Gyro(IMU_Buffer);
									switch(buff[2]){
											case 'X': VCP_send_IMU_Single(GYRO_INDEX,IMU_Buffer[0]);break;
											case 'Y': VCP_send_IMU_Single(GYRO_INDEX,IMU_Buffer[1]);break; 
											case 'Z': VCP_send_IMU_Single(GYRO_INDEX,IMU_Buffer[2]);break; 
											case 'A': VCP_send_IMU_Multi(GYRO_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);break;
											default :break;
									} 
									break;
				case 'C': //LSM303DLHC_CompassReadMag(IMU_Buffer);
									Read_Compass(IMU_Buffer);
									switch(buff[2]){
											case 'X': VCP_send_IMU_Single(COMPASS_INDEX,IMU_Buffer[0]);break;
											case 'Y': VCP_send_IMU_Single(COMPASS_INDEX,IMU_Buffer[1]);break; 
											case 'Z': VCP_send_IMU_Single(COMPASS_INDEX,IMU_Buffer[2]);break; 
											case 'A': VCP_send_IMU_Multi(COMPASS_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);break;
											default :break;
									} 
									break;
				case 'I': speed = buff[3]-'0';accuracy = buff[4]-'0';
									switch(buff[2]){
											case 'A': Acc_Init(speed,accuracy);break;
											case 'C': Compass_Init(speed,accuracy);break;
											case 'G': Gyro_Init(speed,accuracy);break;
											default : break;
									} 
									break;
				case 'M':sum =(buff[5]-'0')*100 + (buff[6]-'0')*10+(buff[7]-'0');
									if(buff[2] == 'P'){//percentage
										if(sum>100)
											sum =100;
										if(sum<0)
											sum = 0;
										//convert to steps
										if(buff[4]=='-') 
											sum = 100 - sum;  
										else if(buff[4]=='+')
											sum = 100 + sum;
										else 
											break;
										sum = sum * 255 / 200;
										//set the speed
										if(buff[3] == 'L')
											Potentialmeter_SetValue(sum,CHIP1); 
										else if(buff[3] == 'R')
											Potentialmeter_SetValue(sum,CHIP2); 
									
									}else if(buff[2]=='S'){//steps
										if(sum>255)
											sum =0;
										if(sum<0)
											sum = 0;
										//buffer4 is no use
										//set the speed
										if(buff[3] == 'L')
											Potentialmeter_SetValue(sum,CHIP1); 
										else if(buff[3] == 'R')
											Potentialmeter_SetValue(sum,CHIP2); 
									}else 
										break;
									break;
				case 'L':if(buff[3]=='1') STM_EVAL_LEDOn(buff[2]-'1'); else STM_EVAL_LEDOff(buff[2]-'1'); break;
				case 'S': sum = (buff[2]-'0')*100+(buff[3]-'0')*10+(buff[4]-'0') ;Sample_time=sum; break;
				default :break;				
			}	
				Button_state = BUTTON_STATE_3;
		}
	}
	State2_count ++;
	if(State2_count > 200000){
		State2_count =0;
		STM_EVAL_LEDToggle(LED4);
	}
	
	/*
	ADC_temp = ADC3ConvertedValue*3000/0xFFF;
	if(ADC_temp > 0&&ADC_temp<1000)
		STM_EVAL_LEDOn(LED3);
	else if(ADC_temp > 1000&&ADC_temp<2000 )
		STM_EVAL_LEDOn(LED4);
	else if(ADC_temp > 2000&&ADC_temp<3000 )
		STM_EVAL_LEDOn(LED5);
	else{
		STM_EVAL_LEDOff(LED3);
		STM_EVAL_LEDOff(LED4);
		STM_EVAL_LEDOff(LED5);
	}
	VCP_send_int((uint16_t)ADC_temp);
	wait(1000);*/
}
示例#9
0
文件: main.c 项目: wh200720041/Robotx
void run_function1(void){
//DATA TRANSMISSION
	unsigned char buff[100];
	float IMU_Buffer1[3];
	  //float Buffer[6];
  uint8_t Xval, Yval = 0x00;
	int16_t IMU_Buffer[3];
//	unsigned char start[] = "start";
//	LSM303DLHC_MEMS_Test();
	int speed=0, accuracy=0; 
		int sum = 0;
	if(VCP_receive_string(buff)){//if receive command
		if(buff[0]=='C'){
			switch(buff[1]){
				case 'A': 
								Read_Acc(IMU_Buffer);
									switch(buff[2]){
											case 'X': VCP_send_IMU_Single(ACC_INDEX,IMU_Buffer[0]);break;
											case 'Y': VCP_send_IMU_Single(ACC_INDEX,IMU_Buffer[1]);break; 
											case 'Z': VCP_send_IMU_Single(ACC_INDEX,IMU_Buffer[2]);break; 
											case 'A': VCP_send_IMU_Multi(ACC_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);break;
											default :break;
									} 
									break; 
				case 'G': //GyroReadAngRate(IMU_Buffer);
									Read_Gyro(IMU_Buffer);
									switch(buff[2]){
											case 'X': VCP_send_IMU_Single(GYRO_INDEX,IMU_Buffer[0]);break;
											case 'Y': VCP_send_IMU_Single(GYRO_INDEX,IMU_Buffer[1]);break; 
											case 'Z': VCP_send_IMU_Single(GYRO_INDEX,IMU_Buffer[2]);break; 
											case 'A': VCP_send_IMU_Multi(GYRO_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);break;
											default :break;
									} 
									break;
				case 'C': //LSM303DLHC_CompassReadMag(IMU_Buffer);
									Read_Compass(IMU_Buffer);
									switch(buff[2]){
											case 'X': VCP_send_IMU_Single(COMPASS_INDEX,IMU_Buffer[0]);break;
											case 'Y': VCP_send_IMU_Single(COMPASS_INDEX,IMU_Buffer[1]);break; 
											case 'Z': VCP_send_IMU_Single(COMPASS_INDEX,IMU_Buffer[2]);break; 
											case 'A': VCP_send_IMU_Multi(COMPASS_INDEX,IMU_Buffer[0],IMU_Buffer[1],IMU_Buffer[2]);break;
											default :break;
									} 
									break;
				case 'I': speed = buff[3]-'0';accuracy = buff[4]-'0';
									switch(buff[2]){
											case 'A': Acc_Init(speed,accuracy);break;
											case 'C': Compass_Init(speed,accuracy);break;
											case 'G': Gyro_Init(speed,accuracy);break;
											default : break;
									} 
									break;
				case 'M':sum =(buff[5]-'0')*100 + (buff[6]-'0')*10+(buff[7]-'0');
									if(buff[2] == 'P'){//percentage
										if(sum>100)
											sum =100;
										if(sum<0)
											sum = 0;
										//convert to steps
										if(buff[4]=='-') 
											sum = 100 - sum;  
										else if(buff[4]=='+')
											sum = 100 + sum;
										else 
											break;
										sum = sum * 255 / 200;
										//set the speed
										if(buff[3] == 'L')
											Potentialmeter_SetValue(sum,CHIP1); 
										else if(buff[3] == 'R')
											Potentialmeter_SetValue(sum,CHIP2); 
									
									}else if(buff[2]=='S'){//steps
										if(sum>255)
											sum =0;
										if(sum<0)
											sum = 0;
										//buffer4 is no use
										//set the speed
										if(buff[3] == 'L')
											Potentialmeter_SetValue(sum,CHIP1); 
										else if(buff[3] == 'R')
											Potentialmeter_SetValue(sum,CHIP2); 
									}else 
										break;
									break;
				case 'L':if(buff[3]=='1') STM_EVAL_LEDOn(buff[2]-'1'); else STM_EVAL_LEDOff(buff[2]-'1'); break;
				case 'S': sum = (buff[2]-'0')*100+(buff[3]-'0')*10+(buff[4]-'0') ;Sample_time=sum; break;
				default :break;				
			}	
		}

	}
		
//	Potentialmeter_SetValue(i++,CHIP1);
	
//	VCP_receive_string(buff);
//	VCP_send_str(buff);
	/*
//MEMS303	
	LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_H_M, 6, buff);
	VCP_send_str(buff);
	VCP_put_char(100);
	LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_X_L_M, 6, buff);
	VCP_send_str(buff);
	VCP_put_char(100);
	LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_M, 6, buff);
	VCP_send_str(buff);
	VCP_put_char(100);
	LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_M, 6, buff);
	VCP_send_str(buff);
	VCP_put_char(100);
	LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_M, 6, buff);
	VCP_send_str(buff);
	VCP_put_char(100);
	LSM303DLHC_Read(MAG_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_M, 6, buff);
	VCP_send_str(buff);
	VCP_put_char(101);
	//VCP_put_char('\n');
	
	L3GD20_Read(buff,L3GD20_OUT_X_L_ADDR,6);
	VCP_send_str(buff);
	VCP_put_char(102);
	L3GD20_Read(buff,L3GD20_OUT_X_H_ADDR,6);
	VCP_send_str(buff);
	VCP_put_char(102);
	L3GD20_Read(buff,L3GD20_OUT_Y_L_ADDR,6);
	VCP_send_str(buff);
	VCP_put_char(102);
	L3GD20_Read(buff,L3GD20_OUT_Y_H_ADDR,6);
	VCP_send_str(buff);
	VCP_put_char(102);
	L3GD20_Read(buff,L3GD20_OUT_Z_L_ADDR,6);
	VCP_send_str(buff);
	VCP_put_char(102);
	L3GD20_Read(buff,L3GD20_OUT_Z_H_ADDR,6);
	VCP_send_str(buff);
	VCP_put_char(103);
	
	
	*/
	
  
  /* Demo Gyroscope */
  //Demo_GyroConfig();
  /*
  // Read Gyro Angular data 
  Read_Gyro(IMU_Buffer);
  
  // Update autoreload and capture compare registers value
  Xval = ABS(IMU_Buffer[0]);
  Yval = ABS(IMU_Buffer[1]);
  
  if ( Xval>Yval)
  {
    if (IMU_Buffer[0] > 1115.0f)
    {       
      STM_EVAL_LEDOn(LED4);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED5);
      STM_EVAL_LEDOff(LED6);
    }
    if (IMU_Buffer[0] < -1115.0f)
    {
      STM_EVAL_LEDOn(LED5);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED6);
    }
  }
  else
  {
    if (IMU_Buffer[1]< -1115.0f)
    {
      STM_EVAL_LEDOn(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED5);
      STM_EVAL_LEDOff(LED6);
    }
    if (IMU_Buffer[1] > 1115.0f)
    {
      STM_EVAL_LEDOn(LED6);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED5);
    } 
  } 
	
	
	LSM303DLHC_CompassReadAcc(IMU_Buffer1);
	Xval = ABS(IMU_Buffer1[0]);
  Yval = ABS(IMU_Buffer1[1]);
  
  if ( Xval>Yval)
  {
    if (IMU_Buffer1[0] > 1115.0f)
    {       
      STM_EVAL_LEDOn(LED4);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED5);
      STM_EVAL_LEDOff(LED6);
    }
    if (IMU_Buffer1[0] < -1115.0f)
    {
      STM_EVAL_LEDOn(LED5);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED6);
    }
  }
  else
  {
    if (IMU_Buffer1[1]< -1115.0f)
    {
      STM_EVAL_LEDOn(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED5);
      STM_EVAL_LEDOff(LED6);
    }
    if (IMU_Buffer1[1] > 1115.0f)
    {
      STM_EVAL_LEDOn(LED6);
      STM_EVAL_LEDOff(LED3);
      STM_EVAL_LEDOff(LED4);
      STM_EVAL_LEDOff(LED5);
    } 
  } 
	//MEMS303	
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A, 6, buff);
	VCP_put_char(buff[0]);
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_H_A, 6, buff);
	VCP_put_char(buff[0]);
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Y_L_A, 6, buff);
	VCP_put_char(buff[0]);
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Y_H_A, 6, buff);
	VCP_put_char(buff[0]);
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Z_L_A, 6, buff);
	VCP_put_char(buff[0]);
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_Z_H_A, 6, buff);
	VCP_put_char(buff[0]);
	
	LSM303DLHC_Read(ACC_I2C_ADDRESS, LSM303DLHC_OUT_X_L_A, 6, buff);
	VCP_send_str(buff);
	//VCP_put_char('\n');*/
	STM_EVAL_LEDOn(LED5);
	wait(10000);
//	Potentialmeter_SetValue(i++,CHIP2);
	STM_EVAL_LEDOff(LED5);
	wait(10000);

	
}