Сергей Борщ 140 29 сентября, 2021 Опубликовано 29 сентября, 2021 · Жалоба Только что, KnightIgor сказал: Стесняюсь спросить, но всё же: а что такое "пупок АЦП"? Единиц младшего разряда АЦП, проще говоря - считанное значение. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KnightIgor 2 1 октября, 2021 Опубликовано 1 октября, 2021 · Жалоба On 9/29/2021 at 2:27 PM, Сергей Борщ said: Единиц младшего разряда АЦП, проще говоря - считанное значение. Этот новояз прошел мимо меня... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AlanSbor 0 4 августа, 2022 Опубликовано 4 августа, 2022 · Жалоба В 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)); } Где я накосячил, почему датчики после цикла инициализации не приходят в чувство ? И так и не понял, нет алгоритма, на правильно привести к нулю все датчики ? Куда копать ? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 140 8 августа, 2022 Опубликовано 8 августа, 2022 · Жалоба Алгоритм "приведения в чувство" описан в конце документации (USING SET AND RESET TO REMOVE BRIDGE OFFSET и EXAMPLE OF SELFTEST). По исходникам вижу, что после включения делаю self-test как описано в документации, потом вычисляю смещение (Offset), опять же по документации и в процессе измерений вычитаю рассчитанное смещение из считанного результата. Для моей задачи (оценка положения кольцевого магнита в водяном счетчике) этого оказалось достаточно, более глубоко не копал. Плавающую точку в расчетах не использовал - там и 32-битных целых вполне хватает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться