我有一个软电位器,我正在通过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);
}
答案 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);