Beste,
Ik ben bezig met een accelerometer. (MPU9150)
De bedoeling is om Accelerometer raw uit te lezen en dan wat wiskunde los te laten zodat ik zijn pitch en roll waarde kan berekenen.
Echter het (tussen) berekende getal wat op mijn LCD komt is mis maar hoe komt dit?
de int "getal", moet 64bit zijn (accelCount[x] is 3x16bit, en dit in het kwadraat)
een deel van de code:
accelCount[0]=-192; // uint16_t
accelCount[1]=-57;
accelCount[2]=2060;
unsigned long long int getal =(accelCount[0]*accelCount[0]+accelCount[1]*accelCount[1]+accelCount[2]*accelCount[2]); // waarde is 4282713 (Excel berekening)
Init_Lcd();
LCD_position(0x80);
dtostrf(getal,1,3,Welcome); // Op LCD komt 23873.000 en moet 4282713 zijn
len1=strlen(Welcome);
{ // lets write topstring to the LCD
for (i=0; i< len1; i++) // the for loop steps through the string sending each letter
LCD_Send(Welcome[i]); // the Lcd_Send function is run for the given letter of the topstring at index i
}
bron:
http://ozzmaker.com/2014/12/11/berryimu/
Alvast bedankt,
Cesar
falaigai
Leren kan je alleen maar door te Doen
moet het niet zijn (accelcount[0]<<16 + accelcount[1]<<8 + accelcount[2])*(accelcount[0]<<16 + accelcount[1]<<8 + accelcount[2])
En hoe kan accelCount[0] en accelcount[1] negatief zijn als het uint16 is?
Data inlezen van MPU9150 is volgende code:
(Ik heb nu gesimuleerde invoer data gedaan omdat dit gemakkelijker te controleren is)
TWI_read_data_prog(MPU9150_ADDRESS,ACCEL_XOUT_H);
accelCount[0]=TWDR;
accelCount[0]=(int16_t)accelCount[0]<<8;
TWI_read_data_prog(MPU9150_ADDRESS,ACCEL_XOUT_L);
accelCount[0]=accelCount[0]+TWDR;
TWI_read_data_prog(MPU9150_ADDRESS,ACCEL_YOUT_H);
accelCount[1]=TWDR;
accelCount[1]=(int16_t)accelCount[1]<<8;
TWI_read_data_prog(MPU9150_ADDRESS,ACCEL_YOUT_L);
accelCount[1]=accelCount[1]+TWDR;
TWI_read_data_prog(MPU9150_ADDRESS,ACCEL_ZOUT_H);
accelCount[2]=TWDR;
accelCount[2]=(int16_t)accelCount[2]<<8;
TWI_read_data_prog(MPU9150_ADDRESS,ACCEL_ZOUT_L);
accelCount[2]=accelCount[2]+TWDR;"en hoe kan accelCount[0] en accelcount[1] negatief zijn als het uint16 is" ==> klopt, nu int16_t maar blijft zelfde probleem...
Bedankt falaigai
Edit gevonden
en daar lig ik dan meer als 20 uur op te zoeken:
uint64_t getal = (uint64_t)accelCount[0]*(uint64_t)accelCount[0]+(uint64_t)accelCount[1]*(uint64_t)accelCount[1]+(uint64_t)accelCount[2]*(uint64_t)accelCount[2];[Bericht gewijzigd door Flupke1 op (12%)]