C中的计算没有跟进

时间:2017-07-03 18:48:00

标签: c

我有一个软电位器,我正在通过ADC读取位置和力。 ADC是ADS1015,这就是我的读取功能称为“read_ads(...)”的原因。

我无法弄清楚为什么计算:((1-analog_val [1] / 1400)* 155)总是返回155,无论analog_val [1]的值如何。我试图获得0-155的一系列值。我不知道需要多少上下文,所以请问是否有任何信息缺失!

谢谢!

我的计划:

void myInterrupt (void) { 
/*
  analog_val[0] = Position (0-1750) (Baseline~=120->130)
  analog_val[1] = Force (0-1400) (tare to change baseline)
  analog_val[2] = Distance Sensor (250-900) (Baseline~=530)
  analog_val[3] = read_ads(3); // Ground
*/

  analog_val[1] = read_ads(1);
  analog_val[2] = read_ads(2);

  if (analog_val[1] > 100) {
    analog_val[0] = read_ads(0); // Position (0-1750) (Baseline~=120->130)
    z = (int)lookup[analog_val[0]];//-(int)(analog_val_1/6);
    printf("Z: %03d | ", z);
    z -= (1-analog_val[1]/1400)*155;
    printf("Z: %03d | Calc: %03d\n", z, (int)(1-analog_val[1]/1400)*155);

    z_prev = z;
  } else {
    z = z_prev;
    analog_val[0] = analog_val_prev[0];
  }



  writeBuf[0] = ((uint16_t)z >> 4) | 0b00110000;
  writeBuf[1] = (uint16_t)z << 4;

  wiringPiSPIDataRW(0, writeBuf, 2);

  analog_val_prev[0] = analog_val[0];
  //~ analog_val_prev[1] = analog_val[1];

  //~ printf("X: %04d | Y: %04d | Z: %04d\n", x, y, (int)z);
  printf("Pot Pos: %04d | Pot Force: %04d | Dist: %04d | Z: %03d\n", analog_val[0], 
  analog_val[1], analog_val[2], z);
}

2 个答案:

答案 0 :(得分:2)

你的z是int,猜测你的代码中有更多的内容,
对于任何analog_val [1] <1,((1-analog_val[1]/1400)*155)将为155。 1400。

你可能会得到更满意的结果 ((155-(analog_val[1]*155)/1400))

考虑使用浮点数学进行计算,然后输出int表示。

为了获得最佳效果,请使用调试器在您的代码中跟踪您的值,您可能会发现他们得到的地方&#34;虐待&#34;。

答案 1 :(得分:0)

analog_val[1]/1400中的除法运算符正在执行整数除法,这意味着任何小数部分都会被截断。因此,如果analog_val[1]小于1400,则此操作将导致0。

您需要将此参数转换为double或使用double常量作为dividor。强制浮点除法:

(1-analog_val[1]/1400.0)*155);