我如何获得Raspbery pi的ina219传感器数据

时间:2019-03-16 05:02:03

标签: c++ c raspberry-pi3 sensor

我想问一些问题。

我正在尝试从具有树莓派的传感器“ ina219”中获取数据。 我尝试使用c ++获取数据,但是当我尝试使用python模块时,数据却不同

这些数据是经过尝试的,以下是python脚本中的数据

value:6912
value:10496
value:6912
value:6912
value:6912
value:10496
value:6912
value:3584
value:3584
value:-3329
value:0
value:14080
value:6912
value:6912
value:6912
value:3584
value:14080
value:14080
value:0
value:0
value:0
value:3584
value:3584
value:3584
value:6912
value:10496
value:10496
value:10496
value:10496
bus current:-0.695 mA
bus current:-0.598 mA
bus current:-0.598 mA
bus current:-0.598 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.598 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.598 mA
bus current:-0.598 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.598 mA
bus current:-0.598 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.695 mA
bus current:-0.598 mA

我无法想象是什么问题。是否有人成功通过Raspberry Pi作为C ++获得传感器数据?如果存在,请帮助我... 以下代码是用于电流传感器的c ++代码

uint16_t cal, config;
float r_shunt,current_lsb,power_lsb;


void configure(int fd);
void calibrate(int fd,float shunt_val, float v_shunt_max, float v_bux_max, float i_max_expected);

int main(){
    int fd;
    int16_t result;
    unsigned char buffer[100];

    fd = wiringPiI2CSetup(0x40);

    configure(fd);
    calibrate(fd, 0.1 , 0.2 , 32, 2);


    while(1){
        result = wiringPiI2CReadReg16(fd, 0x04);//0x02);

        if(result == -1)
            cout<<"Error. Error is:"<<errno<<endl;
        else
            cout<<"value:"<<result<<endl;//*current_lsb<<endl;
    }

    return 0;
}
void configure(int fd){
    config = 0;
    //config |= (RANGE_32V<<BRNG | GAIN_8_320MV<<PG0 | ADC_12BIT << BADC1 | ADC_12BIT << SADC1 | CONT_SH_BUS);
    config |= (1<<13 | 3<<11 | 3<<7 | 3 << 3 | 7);
    int result = wiringPiI2CWriteReg16(fd, 0x00,config);
    if(result == -1)
        cout<<"Error, is :"<<errno<<endl;
}

void calibrate(int fd,float shunt_val, float v_shunt_max, float v_bux_max, float i_max_expected){
    uint16_t digits;
    float min_lsb,swap;

    r_shunt = shunt_val;
    min_lsb = i_max_expected / 32767;

    current_lsb = min_lsb;
    digits = 0;

    while(current_lsb > 0.0){
        if((uint16_t)current_lsb /1){
            current_lsb = (uint16_t) current_lsb +1;
            current_lsb /= pow(10,digits);
            break;
        }else{
            digits++;
            current_lsb *= 10.0;
        }
    };

    swap = (0.04096)/(current_lsb*r_shunt);
    cal = (uint16_t)swap;
    power_lsb = current_lsb *20;
    int result = wiringPiI2CWriteReg16(fd, 0x05,cal);
    if(result == -1)
        cout<<"Error, is:"<<errno<<endl;

}

1 个答案:

答案 0 :(得分:0)

我看到了几种可能的差异:

  1. 配置与python脚本不同:

    • 运行您的python脚本
    • 在调用wiringPiI2CReadReg16(fd,0x00)来识别任何差异之前和之后,用configure(fd);转储配置寄存器(地址0x00)
  2. 校准并非完全相同:

    • 也许每次启动程序时都不需要校准INA。如果您的目标是确定python脚本结果为何不同,请进行一次校准并测试两个脚本。 (通过从CPP程序中删除校准并按此顺序依次运行python脚本和CPP程序)。
  3. 采样率不同(两次数据请求之间的时间):
    • 您正在一段时间(1)连续拨打result = wiringPiI2CReadReg16(fd, 0x04);,没有任何延迟。是否在python脚本中以相同的方式完成了?
    • 确定连续请求数据时的传感器行为(它是否重复相同的测量?)。您可能应该考虑以较低的速率请求数据。
    • 如果采样率与python脚本不同,则正常的做法是进行不同的测量,因为信号可能有噪声。