как я могу получить данные датчика ina219 с raspbery Pi - PullRequest
0 голосов
/ 16 марта 2019

Я хочу, чтобы некоторые из вас задали вопросы, ребята.

Я пытаюсь получить данные от текущего датчика 'ina219' с помощью Raspberry Pi.Я пытался получить данные с помощью 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 голосов
/ 16 марта 2019

Я вижу несколько возможных отличий:

  1. Конфигурация отличается от вашего скрипта Python:

    • Запустите ваш скрипт Python
    • Дампрегистр конфигурации (адрес 0x00) с wiringPiI2CReadReg16(fd,0x00) до и после вызова configure(fd); для выявления любых различий
  2. Калибровка не выполняется точно так же:

    • Возможно, нет необходимости калибровать INA при каждом запуске вашей программы.Если ваша цель состоит в том, чтобы определить, почему результат скрипта Python отличается, выполните калибровку один раз и протестируйте оба скрипта.(Удалив калибровку из вашей программы CPP и запустив в этом порядке сценарий python, а затем, например, программу CPP).
  3. Частота дискретизации отличается (время между двумя запросами данных):
    • Вы звоните result = wiringPiI2CReadReg16(fd, 0x04); некоторое время (1) непрерывно, без каких-либо задержек.Это делается так же в скрипте Python?
    • Определите поведение датчика при непрерывном запросе данных (повторяется ли одно и то же измерение?).Вам, вероятно, следует рассмотреть возможность запроса данных с более низкой скоростью.
    • Если частота дискретизации отличается от сценария Python, то это нормальное измерение, так как сигнал может быть шумным.
...