AnsweredAssumed Answered

Problems encounterd when trying to convert double to string

Question asked by anton.bogdan on Jun 24, 2014
Latest reply on Jun 25, 2014 by anton.bogdan
Hi,
i recently started a school project regarding orientation using MEMS sensors.
I own a MPU6050, and a fusion alrogithm already known developed by Sebastian Madgwick.

Here is my code, and i will explain .

i tryied  do a translation from here  http://mbed.org/users/aberk/code/IMUfilter_RPYExample/  to IAR 6.30, and tryied to show the angles on a plain 20x4 LCD

Setup 2 timers interupts, one at 200hz, and the other at 10hz
Sensors are sampled at 200hz, and the filter is sampled at 10hz.
The problem apears when i try to convert the values to strings,
for example
 sprint(tyaw,"%f", dyaw);
it returns me -nan, all 3 strings returns -nan on display.
I cant understand why?
Tryied even to declare dyaw as float, but the same -nan apears.
Also try do integrate a "Display function" wich do all the string conversions, and include`it in the imufilter clas, and the problems is stil there

 Is there a problem in my timer routines? i cant understand why.
The comunication with MPU is ok, saw`it with a logic analizyer, and is there...
Thanks
Why is it showing -nan ?



int main(){
 
SystemInit(); ///// Initialize System Clocks and PLLs 
SysTick_Init();
lcd_init(); // init display
mpu_I2Cinit();
delay_nms(100);
mpu_init();
delay_nms(100);
 
calibrateAccelerometer(); // take samples of acc then average
delay_nms(30);
calibrateGyroscope();  // take samples of gyro, then avarage
delay_nms(30);
   RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2 | RCC_APB1Periph_TIM3, ENABLE);
 // timer 2 setup to generate every 10ms ( 10hz) interrupt
   TIM_InitStruct.TIM_Prescaler = 2000 - 1; 
   TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_InitStruct.TIM_Period = 4200 - 1; //105          
   TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;    
   TIM_InitStruct.TIM_RepetitionCounter = 0;             
   TIM_TimeBaseInit(TIM2, &TIM_InitStruct);
   TIM_ITConfig(TIM2, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM2, ENABLE);    
     
// timer 3 setup to generate every 2.5ms ( 200hz) interrupts
   TIM_InitStruct.TIM_Prescaler = 2000 - 1;
   TIM_InitStruct.TIM_CounterMode = TIM_CounterMode_Up;
   TIM_InitStruct.TIM_Period = 210 - 1;                 
   TIM_InitStruct.TIM_ClockDivision = TIM_CKD_DIV1;    
   TIM_InitStruct.TIM_RepetitionCounter = 0;             
   TIM_TimeBaseInit(TIM3, &TIM_InitStruct);
   TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM3, ENABLE);    
    
    
   // interrupt priority for timer 2
   NVIC_InitStructure.NVIC_IRQChannel = TIM2_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
 
   // interrupt priority for timer 3
 
   NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority =0;
   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
   NVIC_Init(&NVIC_InitStructure);
 
char troll[10];
char tpitch[10];
char tyaw[10];
 
 
while(1){
 double droll  = toDegrees(imuFilter.getRoll());   // read roll after euler computation
 double dpitch = toDegrees(imuFilter.getPitch()); // read  pitch after euler computation
 double dyaw   = toDegrees(imuFilter.getYaw());  // read yaw after euler computation
  
 sprintf(troll,"%f", droll);  // convert to string
 sprintf(tpitch,"%f", dpitch); // convert to  string
 sprintf(tyaw,"%f", dyaw);  // convert to string
  
 lcd_char(1,1,troll);  // display troll angle
 lcd_char(2,1,tpitch); // display pitch angle
 lcd_char(3,1,tyaw);  // display yaw angle
}}
 
 
#ifdef __cplusplus
extern "C" {
#endif
//delay_nms(1);
  void SysTick_Handler(void) {
  TimeTick_Decrement();
}
 
void TIM3_IRQHandler(void){ // 200hz
if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)
{
  sampleAccelerometer(); // sample accelerometor sensors (x,y,z)
  sampleGyroscope(); // sample gyroscopes sensors (x,y,z)
   
  TIM_ClearITPendingBit(TIM3, TIM_IT_Update);  } }
 
void TIM2_IRQHandler(void){ // 10hz
if (TIM_GetITStatus(TIM2, TIM_IT_Update) != RESET)
{
  //Update the filter variables.
    imuFilter.updateFilter(w_y, w_x, w_z, a_y, a_x, a_z); // updateing filter with values from gyro & acc sampled @ timer 3 rate
    //Calculate the new Euler angles. from updatefilter equations
    imuFilter.computeEuler();
     
TIM_ClearITPendingBit(TIM2, TIM_IT_Update);  }   }
 
#ifdef __cplusplus
}
#endif



Outcomes