Перейти к содержанию
    

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В 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));
}

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

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

Куда копать ?

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...