智能车制作

标题: 求助!同一个变量分别定义char和float类型,用IAR J-lINK调试时char型值比float大10 [打印本页]

作者: 擦肩。回首。    时间: 2013-11-16 15:55
标题: 求助!同一个变量分别定义char和float类型,用IAR J-lINK调试时char型值比float大10
本帖最后由 擦肩。回首。 于 2013-11-16 16:02 编辑

求助!同一个变量分别定义char和float类型,用IAR J-lINK调试时char型值比float大10倍。比如我定义float angle=0;时计算得angle为32,而定义u8 angle=0 ;计算得的angle为3.2
但是我串口输出时用
if(angle>10.0)        printf("angle:%d  \n",(u8)angle);输出都为32.

我用的是野火的库,u8是unsigned char型。

float angle=0;时
[attach]52223[/attach]

u8  angle=0 ;时
[attach]52222[/attach]





作者: 野火    时间: 2013-11-16 16:38
把完整的 main 函数代码发来看看
作者: 擦肩。回首。    时间: 2013-11-16 18:03
本帖最后由 擦肩。回首。 于 2013-11-16 18:04 编辑
野火 发表于 2013-11-16 16:38
把完整的 main 函数代码发来看看

void main(){
      DisableInterrupts;
      /************初始化*******************/      PIT_init();                                //PIT定时中断初始化            
PWM_init();                                //电机PWM输出初始化           
Coder_init();                                //编码器脉冲读取初始化     
//CCD_init();                                      
ADC_init();                                //加速度计\陀螺仪输入初始化      
// LCD_KEY_init();     
uart_init(UART0,115200);                      //初始化串口0

     // time_delay_ms(6000);
      /************************************/
      EnableInterrupts;                                            //开总中断
      while(1)   
  {      
  Kalman_Filter(accelerometer_angle,gyroscope_rate);      
  if(angle>10.0)        
printf("angle:%d \n",(u8)angle);        
//uart_putchar(UART0,(char)asin((accelerometer_angle-111.0)*0.009));      
  //printf("gyroscope_rate:%d\n",(u16)(gyroscope_rate));      
time_delay_ms(100);        
  }
}


float angle_zero=164.0;                                  //平衡角度63
float angle=0;
void Kalman_Filter(float angle_m,float gyro_m)
{   
    angle_m=(accelerometer_angle-MID)/ACC;        //sin值
    if(angle_m>1)                                 //正弦值不能大于1或小于-1
        angle_m=1;
    else if(angle_m<-1)
        angle_m=-1;

    angle_m=180/3.14159*asin(angle_m);

    angle=angle_m;
}




作者: rubick    时间: 2013-11-16 19:26
  1. void main(){
  2.         DisableInterrupts;
  3.         /************初始化*******************/
  4.         PIT_init();                                //PIT定时中断初始化            
  5.         PWM_init();                                //电机PWM输出初始化           
  6.         Coder_init();                              //编码器脉冲读取初始化     
  7.         //CCD_init();                                      
  8.         ADC_init();                                //加速度计\陀螺仪输入初始化      
  9.         // LCD_KEY_init();     
  10.         uart_init(UART0,115200);                   //初始化串口0

  11.         // time_delay_ms(6000);
  12.         /************************************/
  13.         EnableInterrupts;                          //开总中断
  14.         while(1)   
  15.         {      
  16.                 Kalman_Filter(accelerometer_angle,gyroscope_rate);      
  17.                 if(angle>10.0)        
  18.                         printf("angle:%d \n",(u8)angle);        
  19.                 //uart_putchar(UART0,(char)asin((accelerometer_angle-111.0)*0.009));      
  20.                 //printf("gyroscope_rate:%d\n",(u16)(gyroscope_rate));      
  21.                 time_delay_ms(100);        
  22.         }
  23. }


  24. float angle_zero=164.0;                           //平衡角度63
  25. float angle=0;
  26. void Kalman_Filter(float angle_m,float gyro_m)
  27. {   
  28.         angle_m=(accelerometer_angle-MID)/ACC;        //sin值
  29.         if(angle_m>1)                                 //正弦值不能大于1或小于-1
  30.                 angle_m=1;
  31.         else if(angle_m<-1)
  32.                 angle_m=-1;

  33.         angle_m=180/3.14159*asin(angle_m);

  34.         angle=angle_m;
  35. }
复制代码
发代码时用[code]标记可以保留缩进。


作者: 擦肩。回首。    时间: 2013-11-16 19:45
rubick 发表于 2013-11-16 19:26
发代码时用[code]标记可以保留缩进。

谢谢!知道了!


作者: 擦肩。回首。    时间: 2013-11-24 20:38
后来我发现float是科学计数法表示的 后面还有E+1。刚好是乘以10没有错




欢迎光临 智能车制作 (http://111.231.132.190/) Powered by Discuz! X3.2