目前在我们驱动的AO及AI功能中,Scale中的最大LSB取值有问题,公式是这样的:(USHORT) (max_count * (output_value - min_volt) / (max_volt - min_volt)),拿PCI-1741U来说,其max_count目前的取值是65535,其实正确取值应该是65536,虽然硬件上D/A转换器只有16位,无法输出真正的65536,可是在公式中max_count起着量程最大份数的角色,就是说虽然满量程是从0~65535,而实际的分数应该是65536。

    如果按我们目前的做法,将max_count定为65535就会出现很微小的问题,举个例子,量程范围+/-5V,输出0V,由于0V是+/-5V的中间值,因此自然会计算得出65535的一半,即32767.5,但这不是我们希望得到的,因为向硬件中写入的值只能是整型,所以浮点数被取整得到32767,在PCI-1741U的实际测试中发现以32767(即7FFFH)为输出值,测得的结果是-0.005V,现在我们打算采用65536作为max_count的值再试一试,经过公式计算得出的结果是一个整型32768(即8000H,比之前多了一个LSB),结果发现输出测得的结果是-0.004V,更接近0V!(比之前精确了0.001V)。

    虽然只有0.001V,但是在一些工业现场中,这个误差已经不算小了,目前我们所有linux驱动中的AI、AO都需要对此问题进行修改。

    注:还要注意在输出值为满量程的时候,要判断最终计算结果,避免溢出。