Jump to content
    

I3C датчики как с ними работать ?

Только что, KnightIgor сказал:

Стесняюсь спросить, но всё же: а что такое "пупок АЦП"?

Единиц младшего разряда АЦП, проще говоря - считанное значение.

Share this post


Link to post
Share on other sites

On 9/29/2021 at 2:27 PM, Сергей Борщ said:

Единиц младшего разряда АЦП, проще говоря - считанное значение.

Этот новояз прошел мимо меня...

Share this post


Link to post
Share on other sites

В 27.09.2021 в 15:26, Сергей Борщ сказал:

Я вывожу на экран весь обмен и могу глазами смотреть именно отдаваемые данные. Результат с ними сходится.

Тоже маловероятно - я считываю данные через 5 секунд после запуска преобразования, а у него самое медленное преобразование - 6.6 мс, причем все три оси оцифровываются последовательно, то есть если бы оно не успевало - результаты оси Z сильно отличались бы. Но нет - они одного порядка.

У меня 5633 выдает все нули даже с поднесенным магнитом пока не сделаешь selftest. После selftest начинает отдавать отличные от нуля значения, но только со сброшенным Auto_SR_en. Если его выставить в 1 - при поднесении магнита наблюдается небольшой кратковременный всплеск в данных и буквально через 2-3 изменения с выхода снова идут нули. Хотя в документации сказано "This bit is recommended to set to “1” in the application".

Доброго вечерочка всем !

 

5633 - 30 штук, делаю инициализацию и вижу что датчики некоторые кто в лес кто по дрова. 

Делаю так 

 

     for (int n_arr_5_6 = 1; n_arr_5_6 < 9; n_arr_5_6++) {  //1 Channel

                                             selectI2CChannel(TCA9548ADDR_1 ,Array_TCA9548_CH [n_arr_5_6]);

                                             MMC5633_readProductId(data);
                                             vTaskDelay(10 / portTICK_PERIOD_MS);
                                             //MMC5633_CheckID();
                                             ESP_LOGI(TAG_init, "Funct readProductId: %x", data[0]);

                                              MMC5633_softwareReset();
                                              vTaskDelay(10 / portTICK_PERIOD_MS);
                                       //       ESP_LOGI(TAG_init, "softwareReset: Ok : %x, %x ",TCA9548ADDR_1,Array_TCA9548_CH[n_arr_5_6] );

                                              MMC5633_setContinuousMode(255);
                                              vTaskDelay(10 / portTICK_PERIOD_MS);
                                         //     ESP_LOGI(TAG_init, "TCA9548ADDR_ : %x, Array_TCA9548_CH : %x\n", TCA9548ADDR_1 ,Array_TCA9548_CH [n_arr_5_6]);

                                              //MMC5633_getMilliGauss(&magX, &magY, &magZ, &magAbs);
                                              MMC5633_readMag(&magX, &magY, &magZ, &magAbs);
                                              ESP_LOGI(TAG_init, "11Gauss X : %+9.4f, Gauss Y : %+9.2f, Gauss Z : %+9.2f, Средний Gauss : %+9.2f\n", magX, magY, magZ, magAbs);

                                              nums_sensor++;
                                             }

 

Выбор канала на TCA9548A 

void selectI2CChannel(int muxADD, int channelADD) {

  // create and execute the command link
  i2c_cmd_handle_t cmd = i2c_cmd_link_create();
  i2c_master_start(cmd);
  i2c_master_write_byte(cmd,(muxADD << 1) | I2C_MASTER_WRITE,true);
  i2c_master_write_byte(cmd,channelADD,true);
  i2c_master_stop(cmd);
  if(i2c_master_cmd_begin(I2C_NUM_0, cmd, 1000 / portTICK_RATE_MS) == ESP_OK) {
    printf("-> Select channel 0x%02x Mux I2C 0x%02x \r\n", channelADD, muxADD);
  }
  i2c_cmd_link_delete(cmd);

}

 

Чтение продукта  Id стандартно

void MMC5633_readProductId(uint8_t *data) {

  MMC5633_register_read(MMC5633_ADDR_PRODUCTID , data, 1);

}

MMC5633_softwareReset();

void MMC5633_softwareReset(void) {

  MMC5633_register_write_byte(MMC5633_ADDR_INTCTRL1, 0x80);

}

Выставляю MMC5633_setContinuousMode(255);

void MMC5633_setContinuousMode(uint8_t odr) {
  MMC5633_register_write_byte(MMC5633_ADDR_ODR, odr);
  MMC5633_register_write_byte(MMC5633_ADDR_INTCTRL0, 0b10100000); //
  MMC5633_register_write_byte(MMC5633_ADDR_INTCTRL1, 0b00000011); //
  MMC5633_register_write_byte(MMC5633_ADDR_INTCTRL2, 0b00010000); //
}

 

Читаю показания в миллигауссах

void MMC5633_readMag(float *magX, float *magY, float *magZ, float *magAbs) {
  //uint8_t data;
  MMC5633_register_write_byte(MMC5633_ADDR_INTCTRL0, 0b00100001);
  MMC5633_STATUS1_REG status;
    do {
        status.raw = MMC5633_readByte(MMC5633_ADDR_STATUS1);
       // ESP_LOGI(TAG1, "status.raw: %0x", status.raw);
    } while (status.meas_m_done == false);
    //ESP_LOGI(TAG1, "status.meas_m_done: %0x", status.meas_m_done);
    MMC5633_getMilliGauss(magX, magY, magZ, magAbs);
}

с разрешением 20 bit

void MMC5633_getMilliGauss(float *magX, float *magY, float *magZ, float *magAbs) {
    uint8_t mag[9] = {0};
    MMC5633_register_read(MMC5633_ADDR_XOUT0, mag, 9);
    *magX = (float)((mag[0] << 12 | mag[1] << 4 | mag[6]) - 524288) * 0.0625;
    *magY = (float)((mag[2] << 12 | mag[3] << 4 | mag[7]) - 524288) * 0.0625;
    *magZ = (float)((mag[4] << 12 | mag[5] << 4 | mag[8]) - 524288) * 0.0625;
    *magAbs =123.0;
    //*magAbs = sqrt(pow(*magX, 2) + pow(*magY, 2) + pow(*magZ, 2));
}

Где я накосячил, почему датчики после цикла инициализации не приходят в чувство ?

И так и не понял, нет алгоритма, на правильно привести к нулю все датчики ?

Куда копать ?

 

 

 

Share this post


Link to post
Share on other sites

Алгоритм "приведения в чувство" описан в конце документации (USING SET AND RESET TO REMOVE BRIDGE OFFSET и EXAMPLE OF SELFTEST).

По исходникам вижу, что после включения делаю self-test как описано в документации, потом вычисляю смещение (Offset), опять же по документации и в процессе измерений вычитаю рассчитанное смещение из считанного результата. Для моей задачи (оценка положения кольцевого магнита в водяном счетчике) этого оказалось достаточно, более глубоко не копал.

Плавающую точку в расчетах не использовал - там и 32-битных целых вполне хватает.

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...