예제 #1
0
파일: main.c 프로젝트: wrcu/L3G4200D_I2C
void gyro_sample()
{
		/* read the rate from the register */
        	gyrox_l_temp=I2C_readreg(L3G4200D_ADDR,OUT_X_L);
        	gyrox_h_temp=I2C_readreg(L3G4200D_ADDR,OUT_X_H);
        	gyrox_temp=((gyrox_h_temp << 8) | gyrox_l_temp);

        	gyroy_l_temp=I2C_readreg(L3G4200D_ADDR,OUT_Y_L);
        	gyroy_h_temp=I2C_readreg(L3G4200D_ADDR,OUT_Y_H);
        	gyroy_temp=((gyroy_h_temp << 8) | gyroy_l_temp);

        	gyroz_l_temp=I2C_readreg(L3G4200D_ADDR,OUT_Z_L);
        	gyroz_h_temp=I2C_readreg(L3G4200D_ADDR,OUT_Z_H);
        	gyroz_temp=((gyroz_h_temp << 8) | gyroz_l_temp);

		gyrox = gyrox_temp * gyro_sensitivity_250 /1000 ;  
		gyroy = gyroy_temp * gyro_sensitivity_250 /1000 ;
		gyroz = gyroz_temp * gyro_sensitivity_250 /1000 ;


		gyrox_angle=gyrox_angle+gyrox*0.01;
		gyroy_angle=gyroy_angle+gyroy*0.01;
		gyroz_angle=gyroz_angle+gyroz*0.01;

		Delay(10);

}
예제 #2
0
uint32_t ov7670_init()
{
	if (I2C_readreg(REG_PID) != 0x76) {
		return 1;
	}
	I2C_writereg(REG_COM7, COM7_RESET); /* reset to default values */
	I2C_writereg(REG_CLKRC, CLK_EXT);
	I2C_writereg(REG_COM7, COM7_FMT_VGA | COM7_RGB); /* output format: RGB */

	I2C_writereg(REG_COM10, COM10_PCLK_HB); /* set pclk to switch only when data is valid */

	return 0;
}
예제 #3
0
파일: main.c 프로젝트: wrcu/L3G4200D_I2C
int main(void)
{
    	int i=1;
    	USART3_Config();	
   	SysTick_Init();
    	init_I2C1();
    	sensor_ayarla();
    	printf("l3g4200d\r\n");
    	while (1){

    		if((I2C_readreg(L3G4200D_ADDR,STATUS_REG)&0x08)==0x08) 
    		{

			/* read the rate from the register */
        		gyrox_l_temp=I2C_readreg(L3G4200D_ADDR,OUT_X_L);
        		gyrox_h_temp=I2C_readreg(L3G4200D_ADDR,OUT_X_H);
        		gyrox_temp=((gyrox_h_temp << 8) | gyrox_l_temp);

        		gyroy_l_temp=I2C_readreg(L3G4200D_ADDR,OUT_Y_L);
        		gyroy_h_temp=I2C_readreg(L3G4200D_ADDR,OUT_Y_H);
        		gyroy_temp=((gyroy_h_temp << 8) | gyroy_l_temp);

        		gyroz_l_temp=I2C_readreg(L3G4200D_ADDR,OUT_Z_L);
        		gyroz_h_temp=I2C_readreg(L3G4200D_ADDR,OUT_Z_H);
        		gyroz_temp=((gyroz_h_temp << 8) | gyroz_l_temp);
			printf("gyrox_temp=%d   gyroy_temp=%d   gyroz_temp=%d\r\n",gyrox_temp,gyroy_temp,gyroz_temp);

			
			/* compute the value of rate */
			gyrox = gyrox_temp * gyro_sensitivity_250 /1000 ;  
			gyroy = gyroy_temp * gyro_sensitivity_250 /1000 ;
			gyroz = gyroz_temp * gyro_sensitivity_250 /1000 ;
			
			
			/* print the value of rate*/			
			gyrox_int = (int16_t)gyrox;
			gyrox_decimal = (gyrox - gyrox_int)*1000;
			if(gyrox_decimal < 0)
				gyrox_decimal=-gyrox_decimal;

			gyroy_int = (int16_t)gyroy;
			gyroy_decimal = (gyroy - gyroy_int)*1000;
			if(gyroy_decimal < 0)
				gyroy_decimal=-gyroy_decimal;

			gyroz_int = (int16_t)gyroz;
			gyroz_decimal = (gyroz - gyroz_int)*1000;
			if(gyroz_decimal < 0)
				gyroz_decimal=-gyroz_decimal;

			printf("gyrox_float=%d.%d\r\n",gyrox_int,gyrox_decimal);
			printf("gyroy_float=%d.%d\r\n",gyroy_int,gyroy_decimal);
			printf("gyroz_float=%d.%d\r\n",gyroz_int,gyroz_decimal);


			/* 頃角計算 */	
			i=1;
			for(i;i<=50;i++)
				gyro_sample();		

			//gyrox_angle=gyrox_angle+gyrox*0.5;
			//gyroy_angle=gyroy_angle+gyroy*0.5;
			//gyroz_angle=gyroz_angle+gyroz*0.5;


			/* print the value of angle */
			gyrox_angle_int = (int16_t)gyrox_angle;
			gyrox_angle_decimal = (gyrox_angle - gyrox_angle_int)*1000;
			if(gyrox_angle_decimal < 0)
				gyrox_angle_decimal=-gyrox_angle_decimal;
			
			gyroy_angle_int = (int16_t)gyroy_angle;
			gyroy_angle_decimal = (gyroy_angle - gyroy_angle_int)*1000;
			if(gyroy_angle_decimal < 0)
				gyroy_angle_decimal=-gyroy_angle_decimal;
			
			gyroz_angle_int = (int16_t)gyroz_angle;
			gyroz_angle_decimal = (gyroz_angle - gyroz_angle_int)*1000;
			if(gyroz_angle_decimal < 0)
				gyroz_angle_decimal=-gyroz_angle_decimal;


			
 			printf("gyrox_angle_float=%d.%d\r\n",gyrox_angle_int,gyrox_angle_decimal);
			printf("gyroy_angle_float=%d.%d\r\n",gyroy_angle_int,gyroy_angle_decimal);
			printf("gyroz_angle_float=%d.%d\r\n",gyroz_angle_int,gyroz_angle_decimal);
			printf("\r\n-------------------------------------------------------\r\n");
			Delay(500);
    }
   }
}
예제 #4
0
파일: main.c 프로젝트: openbox00/test
void vBalanceTask(void *pvParameters)
{
	const portTickType twosecDelay = 2000; 
	const portTickType xDelay = 3000; 
	vTaskDelay( twosecDelay  );
   	PWM_Motor1 = PWM_MOTOR_INIT_MAX;
   	PWM_Motor2 = PWM_MOTOR_INIT_MAX;
	PWM_Motor3 = PWM_MOTOR_INIT_MAX;
   	PWM_Motor4 = PWM_MOTOR_INIT_MAX;   	
  	vTaskDelay( xDelay );  //6S
  	PWM_Motor1 = PWM_MOTOR_INIT_MIN;
   	PWM_Motor2 = PWM_MOTOR_INIT_MIN;
	PWM_Motor3 = PWM_MOTOR_INIT_MIN;
   	PWM_Motor4 = PWM_MOTOR_INIT_MIN;   	
	/*inital Offset value of Gryo. and Acce.*/

  	LIS3DSH_Read(Buffer_Hx, LIS3DSH_OUT_X_H_REG_ADDR, 1);
	LIS3DSH_Read(Buffer_Hy, LIS3DSH_OUT_Y_H_REG_ADDR, 1);

	LIS3DSH_Read(Buffer_Lx, LIS3DSH_OUT_X_L_REG_ADDR, 1);
	LIS3DSH_Read(Buffer_Ly, LIS3DSH_OUT_Y_L_REG_ADDR, 1);

  	XOffset = (int16_t)(Buffer_Hx[0] << 8 | Buffer_Lx[0]);
 	YOffset = (int16_t)(Buffer_Hy[0] << 8 | Buffer_Ly[0]);


	/* reset gyro offset */	
    Buffer_GHx[0]=I2C_readreg(L3G4200D_ADDR,OUT_X_H);
    Buffer_GHy[0]=I2C_readreg(L3G4200D_ADDR,OUT_Y_H);
    Buffer_GHz[0]=I2C_readreg(L3G4200D_ADDR,OUT_Z_H);

    Buffer_GLx[0]=I2C_readreg(L3G4200D_ADDR,OUT_X_L);
    Buffer_GLy[0]=I2C_readreg(L3G4200D_ADDR,OUT_Y_L);
    Buffer_GLz[0]=I2C_readreg(L3G4200D_ADDR,OUT_Z_L);

  	GXOffset = (int16_t)(Buffer_GHx[0] << 8 | Buffer_GLx[0]);
 	GYOffset = (int16_t)(Buffer_GHy[0] << 8 | Buffer_GLy[0]);
 	GZOffset = (int16_t)(Buffer_GHz[0] << 8 | Buffer_GLz[0]);
	int i;

	for(i = 1;i<128;i++) {
 		Buffer_GHx[0]=I2C_readreg(L3G4200D_ADDR,OUT_X_H);
    	Buffer_GHy[0]=I2C_readreg(L3G4200D_ADDR,OUT_Y_H);
    	Buffer_GHz[0]=I2C_readreg(L3G4200D_ADDR,OUT_Z_H);

    	Buffer_GLx[0]=I2C_readreg(L3G4200D_ADDR,OUT_X_L);
    	Buffer_GLy[0]=I2C_readreg(L3G4200D_ADDR,OUT_Y_L);
    	Buffer_GLz[0]=I2C_readreg(L3G4200D_ADDR,OUT_Z_L);
	
  		GXOffset = (int16_t)(Buffer_GHx[0] << 8 | Buffer_GLx[0]);
 		GYOffset = (int16_t)(Buffer_GHy[0] << 8 | Buffer_GLy[0]);
 		GZOffset = (int16_t)(Buffer_GHz[0] << 8 | Buffer_GLz[0]);	
	}
	
	GXOffset = GXOffset / 128;
	GYOffset = GYOffset / 128;
	GZOffset = GZOffset / 128;

	angle_x = 0;
	angle_y = 0;

	pwm_flag = 0;

    argv.PitchP = 5.5f;
    argv.PitchD = 1.2f;
    argv.RollP = 5.5f;	
    argv.RollD = 1.2f;

	argv.YawD = 4.1f;

    Pitch_desire = 0.0f; //Desire angle of Pitch
    Roll_desire = 0.0f; //Desire angle of Roll

	xTimerStart(xTimerSampleRate, 0);		

	while(1){
	//qprintf(xQueueUARTSend, "P12:%d ,P13:%d ,P14:%d ,P15:%d  ,angle_x: %d,angle_y: %d\n\r", PWM_Motor1, PWM_Motor2, PWM_Motor3, PWM_Motor4, (int)angle_x, (int)angle_y);     
	}
}
예제 #5
0
파일: main.c 프로젝트: openbox00/test
/* sample rate and calculate rate (4ms,250HZ) */
void vTimerSample(xTimerHandle pxTimer)
{
	LIS3DSH_Read(Buffer_Hx, LIS3DSH_OUT_X_H_REG_ADDR, 1);
	LIS3DSH_Read(Buffer_Hy, LIS3DSH_OUT_Y_H_REG_ADDR, 1);

	LIS3DSH_Read(Buffer_Lx, LIS3DSH_OUT_X_L_REG_ADDR, 1);
	LIS3DSH_Read(Buffer_Ly, LIS3DSH_OUT_Y_L_REG_ADDR, 1);

	x_acc = (float)((int16_t)(Buffer_Hx[0] << 8 | Buffer_Lx[0]) - XOffset) * Sensitivity_2G / 1000 * 180 / 3.14159f;
	y_acc = (float)((int16_t)(Buffer_Hy[0] << 8 | Buffer_Ly[0]) - YOffset) * Sensitivity_2G / 1000 * 180 / 3.14159f;
	
    Buffer_GHx[0]=I2C_readreg(L3G4200D_ADDR,OUT_X_H);
    Buffer_GHy[0]=I2C_readreg(L3G4200D_ADDR,OUT_Y_H);
    Buffer_GHz[0]=I2C_readreg(L3G4200D_ADDR,OUT_Z_H);

    Buffer_GLx[0]=I2C_readreg(L3G4200D_ADDR,OUT_X_L);
    Buffer_GLy[0]=I2C_readreg(L3G4200D_ADDR,OUT_Y_L);
    Buffer_GLz[0]=I2C_readreg(L3G4200D_ADDR,OUT_Z_L);

	x_gyro = (float)((int16_t)(Buffer_GHx[0] << 8 | Buffer_GLx[0]) - GXOffset) * Sensitivity_250 / 1000;
	y_gyro = (float)((int16_t)(Buffer_GHy[0] << 8 | Buffer_GLy[0]) - GYOffset) * Sensitivity_250 / 1000;
	z_gyro = (float)((int16_t)(Buffer_GHz[0] << 8 | Buffer_GLz[0]) - GZOffset) * Sensitivity_250 / 1000;

	angle_x = (0.99f) * (angle_x + y_gyro * 0.004f) - (0.01f) * (x_acc);  		
	angle_y = (0.99f) * (angle_y + x_gyro * 0.004f) + (0.01f) * (y_acc); 

	argv.Pitch = angle_y;    //pitch degree
	argv.Roll = angle_x;     //roll degree
	argv.Pitch_v = x_gyro;   //pitch velocity
	argv.Roll_v = y_gyro;    //Roll velocity

	argv.Pitch_err = Pitch_desire - argv.Pitch;
	argv.Roll_err  = Roll_desire - argv.Roll;

	ROLL =	(int)(argv.RollP  * argv.Roll_err  - argv.RollD  * argv.Roll_v);
	PITCH = (int)(argv.PitchP * argv.Pitch_err - argv.PitchD * argv.Pitch_v);
	YAW   = (int)(argv.YawD * z_gyro);

	if (PITCH > MAXNUM) {
		PITCH =	MAXNUM;
	}else if (PITCH < MINNUM) {
		PITCH = MINNUM;
	}else{
		PITCH = PITCH;
	}

	if (ROLL > MAXNUM) {
		ROLL = MAXNUM;
	}else if (ROLL < MINNUM) {
		ROLL = MINNUM;
	}else{
		ROLL = ROLL;
	}

	if(argv.Roll > 35 || argv.Roll < -35){
		pwm_flag = 0;
		Motor_Control(PWM_MOTOR_MIN, PWM_MOTOR_MIN, PWM_MOTOR_MIN, PWM_MOTOR_MIN);
	}
	if(argv.Pitch > 35 || argv.Pitch < -35){
		pwm_flag = 0;
		Motor_Control(PWM_MOTOR_MIN, PWM_MOTOR_MIN, PWM_MOTOR_MIN, PWM_MOTOR_MIN);
	}

	if(pwm_flag == 0){

	}else{
		Motor1 = PWM_Motor1_tmp + PITCH - ROLL - YAW; 	//LD4	
		Motor2 = PWM_Motor2_tmp + PITCH + ROLL + YAW; 	//LD3			
		Motor3 = PWM_Motor3_tmp - PITCH + ROLL - YAW; 	//LD5
		Motor4 = PWM_Motor4_tmp - PITCH - ROLL + YAW; 	//LD6

		Motor_Control(Motor1, Motor2, Motor3, Motor4);
	}
}