[Решен] вывод на неправильном канале только с STM32

Zerox
Пн 25 июня 2018 г., 17:08
Привет, ребята,
У меня есть проблема с 16-битным I2C ADC ADS1115 (https: // учиться.Адафрут.com/adafruit-4-c ... S/Обзор), который дает мне выход на неправильном канале, но Только при использовании STM32.

ОС: Windwos
IDE: Arduino
Доска: общая синяя таблетки с STM32F103C8

Моя проводка:
VDD до 3.3 В
GND к GND
SCL в SCL
SDA в SDA
Addr в GND (в результате чего адрес I2C 0x48)
A0 до GND
A1 к GND
A2 к GND
От A3 до 3.3 В

я’M не выполняет дифференциальное измерение соединения A-пинтов с GND и 3.3V - это просто для тестирования. Различные напряжения из любого источника питания приводят к одной и той же ошибке.
Когда я подключаю A3 к напряжению, я получаю чтение для A0. Когда я подключаю A0 к напряжению, я получаю чтение для A1. Когда я подключаю A1, я получаю чтение для A2 и так далее.

Я попробовал другую рекламу1115, которая привела к той же ошибке.
Вы видите какие -либо недостатки в моем коде? Я в основном только что скопировал код из Adafruit (https: // учиться.Адафрут.com/adafruit-4-c ... Duino-код)

Когда я пробую точно такую ​​же проводку с arduino nano, выходы верны!.

Что’S действительно странно, потому что библиотека датчиков такая же, а протокол - i2c, поэтому он может’t - ошибка проводки на плате STM32.

Я ценю любую помощь.

Заранее большое спасибо!
#include "Wire.h" #include "Adafruit_ADS1015.h" //library for ADS1015 and ADS1115 Adafruit_ADS1115 ads1115(0x48); void setup() { while (!Serial); delay(1000); Wire.begin(); Serial.begin(115200); ads1115.begin(); // Initialize ads1115 } void loop() { int16_t adc0, adc1, adc2, adc3; adc0 = ads1115.readADC_SingleEnded(0); adc1 = ads1115.readADC_SingleEnded(1); adc2 = ads1115.readADC_SingleEnded(2); adc3 = ads1115.readADC_SingleEnded(3); Serial.print("AIN0: "); Serial.println(adc0); Serial.print("AIN1: "); Serial.println(adc1); Serial.print("AIN2: "); Serial.println(adc2); Serial.print("AIN3: "); Serial.println(adc3); Serial.print("\n \n "); delay(1000); }

Пито
Пн 25 июня 2018 г., 17:31
Попробуйте с uint32_t adc0, adc1, adc2, adc3;

Zerox
Пн 25 июня 2018 г., 17:54
Спасибо за очень быстрый ответ!

Я скоро попробую.

ADS1115 Parametrics рассказывают о максимальном аналоговом напряжении 5.5 В http: // www.тип.com/product/ads1115


С наилучшими пожеланиями

Zerox

Пито
Пн 25 июня 2018 г., 19:10
Максимальное напряжение 1115 на входах АЦП от GND (0.0 В) до VDD (3.3v в вашем случае).

Zerox
Пн 25 июня 2018 г., 21:00
К сожалению, изменение int16_t на int 32_t не решила проблему.

Хейсан
Пн 25 июня 2018 г., 21:38
Я не читал таблицу данных, но из библиотеки это выглядит как проблема времени... Попробуйте заменить каждое чтение ADC с помощью канала 0, чтобы все четыре чтения были:
ADS1115.readAdc_singledended (0);

Если это правильно считывает канал 0, попробуйте изменить код, чтобы все 4 прочитали из канала 1 - если он считывается с канала 1, то это почти наверняка проблема времени.

Zoomx
Вт 26 июня 2018 г. 10:50 утра
Поскольку функция uint16_t readADC_SingleEnded(uint8_t channel);

Пито
Вт 26 июня 2018 г. 11:01
Также дважды проверьте саму библиотеку. В прошлом у меня была проблема с библиотекой BMP180 - 8 -битные LIBS Arduino используют int/long с разными размерами, чем мы здесь используем..

PS: не могли бы вы подтвердить, что вы получите правильные значения ADC на основе приложенных входных напряжений (даже при разных входах)??
Разместите здесь пример - входное напряжение и значение, которое вы получаете.

Стивестронг
Вт 26 июня 2018 г., 11:06
Какое ядро ​​здесь вовлечено? Libmaple или ST или Generic?

Хейсан
Вт 26 июня 2018 г. 11:47
Конфигурация MUX составляет два бита в середине 8 -битной записи. Чтобы они были повреждены таким образом, что бинарное значение этих 2 битов всегда оказывается на 1 меньше, чем ожидаемое значение неправдоподобно. Но библиотека не проверяет бит состояния преобразования - она ​​просто ждет 8 мс и читает регистр преобразования. Если преобразование еще не завершено, оно будет читать результат предыдущего преобразования (я.эн. Введите A0 при чтении канала A1).

Глядя на реализацию Libmaple задержки (8), она задержится где -то от 7 до 8 мс (но в основном менее 8 мс), что может привести к такой ошибке.

Пито
Вт 26 июня 2018 12:44
Интересно, что у 1115 было 8 различных показателей дискретиза (8 - 860 образцов за секунду). Ожидание 8 мс для результата соответствует, может быть, 64.
Я использую 1110 с другой библиотекой, он корректирует ожидание на основе скорости дискретиза (4 ставки), однако.
Поскольку это ADC Delta Sigma, продолжительность конверсии отличается от «Sample/Data Sceep» Ads111x предлагает программируемые скорости данных о выходных данных. Используйте биты DR [2: 0] в регистре конфигурации, чтобы выбрать выходные скорости данных 8 SPS, 16 SPS, 32 SPS, 64 SPS, 128 SPS, 250 SPS, 475 SPS или 860 SPS. Преобразования в ADS111X оседают в пределах одного цикла; Таким образом, время преобразования равно 1 / DR. Кроме того. Не уверен, как это с 1115..

Zoomx
Вт 26 июня 2018 г. 14:45
[Хейсан - Вт 26 июня 2018 г. 11:47] - Но библиотека не проверяет бит состояния преобразования - она ​​просто ждет 8 мс и читает регистр преобразования. Если преобразование еще не завершено, оно будет читать результат предыдущего преобразования (я.эн. Введите A0 при чтении канала A1).
Это кажется хорошим моментом!

Zerox
Вт 26 июня 2018 г. 15:46
Большое спасибо за всю помощь, которую вы мне, ребята, даете мне!
Я стараюсь работать через ваши идеи шаг за шагом.

@Хейсан
Я изменил все показания на Ads1115.readAdc_singledended (0) и действительно программа представила значение на предполагаемом. Как я могу решить такую ​​проблему времени? Моя программа должна быть как можно быстрее. 10-100 показаний в секунду из примерно 24 аналоговых входов 5 ADS1115.

@zoomx
Я проверил все каналы, и ошибка всегда возникала одинаково одинаково. Показания на A0 -> Значение, указанное для A1, показания на A1 -> ценность, приведенная для A2,…, A3->А0. Вы имели в виду это с “Проверьте все каналы?”

@Pito
Я получаю следующие значения для соединений:
Земля ~ 0
Нет подключения 3000-33000
3.3 Вольт 15800-16600
Это диапазоны значений примерно 5 различных измерений (каждый раз отрывают микроконтроллер, отключая его от источника питания)
Каждый каналы показывают более или менее одинаковый результат.

@stevestrong
Это общее ядро

@Хейсан снова
“Конфигурация MUX составляет два бита в середине 8 -битной записи. Чтобы они были повреждены таким образом, что бинарное значение этих 2 битов всегда оказывается на 1 меньше, чем ожидаемое значение неправдоподобно. Но библиотека не проверяет бит состояния преобразования - она ​​просто ждет 8 мс и читает регистр преобразования.”

Я не сделал’не понимаю все, что ты написал здесь (я’M Новое в предмете извините)
Что есть:
mux config? С “поврежден” Вы имеете в виду ошибку, которая возникает из плохого соединения? Что такое “бит статуса преобразования”?


Это сообщество потрясающее.
С нетерпением жду ваших ответов.

С наилучшими пожеланиями
Zerox

Хейсан
Вт 26 июня 2018 г. 16:02
[Zerox - Вт 26 июня 2018 г. 15:46] - Большое спасибо за всю помощь, которую вы мне, ребята, даете мне!
Я стараюсь работать через ваши идеи шаг за шагом.
В папке библиотеки найдите 'ADAFRIT_ADS1X15/ADAFRIT_ADS1015.H 'и редактировать:

#define ads1115_conversiondelay (8)

быть:

#define ads1115_conversiondelay (9)

и посмотрите, решает ли это проблему?

Zerox
Вт 26 июня 2018 г. 16:14
@Хейсан

Это сработало!!!!!

Но для моего понимания, что именно я сделал?

Большое спасибо, все вы!

Хейсан
Вт 26 июня 2018 г., 16:29
[Zerox - Вт 26 июня 2018 г. 16:14] - @Хейсан

Это сработало!!!!!

Но для моего понимания, что именно я сделал?

Большое спасибо, все вы!
Библиотека ADAFRIT_ADS1X15 записывает команду «Читать ADC» в ADS1115, а затем ожидает 8 мс (ожидаемое время, которое АЦП примет для преобразования), затем считывает регистр результатов конверсии из АЦП. Если преобразование еще не завершено, то в конечном итоге она читает * предыдущий * результат преобразования.

В ядре STM32 выглядит ошибка, где, если вы скажете «задержка (8)», она задержится от 7 до 8 мс, но АЦП требует 8 мс, поэтому он читает старое значение. Изменение в файле заголовка делает эту «задержку (9)», которая задержится от 8 до 9 мс, поэтому преобразование завершено, и правильное значение прочитано.

Лучшим решением было бы обновить библиотеку драйверов, чтобы опросить конверсию полного бита, но это слишком много усилий ;) .

Zerox
Вт 26 июня 2018 г. 16:34
Теперь я понимаю.

Я опубликовал этот вопрос на Arduino и Adafruit Poard, а также вы не возражаете, если я опубликую исправление и упомяну эту доску и ваше имя?

С наилучшими пожеланиями

Zerox

Пито
Вт 26 июня 2018 г., 16:39
Эти задержки на 8/9 мс не будут работать с отбирательными показателями/скоростями передачи данных ниже 128 образцов/секунд (см. My Post).
Вы можете сделать 8 - 840 образцов АЦП в секунду. Таким образом, задержка должна быть установлена ​​на основе фактической «скорости отбора проб», которую вы хотите использовать. Или лучше с опросом флаг готового конверсии..

Хейсан
Вт 26 июня 2018 г., 16:44
[Zerox - Вт 26 июня 2018 г. 16:34] - Теперь я понимаю.

Я опубликовал этот вопрос на Arduino и Adafruit Poard, а также вы не возражаете, если я опубликую исправление и упомяну эту доску и ваше имя?

С наилучшими пожеланиями

Zerox
Конечно, но, как уже отмечалось, это не «правильное» решение, а обходной путь.
[Пито - Вт 26 июня 2018 г., 16:39] - Эти задержки на 8/9 мс не будут работать с отбирательными показателями/скоростями передачи данных ниже 128 образцов/секунд (см. My Post).
Вы можете сделать 8 - 840 образцов АЦП в секунду. Таким образом, задержка должна быть установлена ​​на основе фактической «скорости отбора проб», которую вы хотите использовать.
Эта конкретная библиотека имеет жесткую скорость дискретизации и предварительно рассчитанные задержки на основе этой жестко закодированной скорости дискретизации.

Пито
Вт 26 июня 2018 г., 16:48
Я знаю, что это не хорошо, более того, с 860 образцами/сек, этого достаточно, чтобы подождать 1.2 мс :)
Должна быть другая библиотека, которая не кодирована жесткой.

Zerox
Вт 26 июня 2018 г. 18:52
От того, что зависит?

Скорость бода? Как быстро требуется программирование, чтобы запустить одну петлю? Предварительно выбранное значение в библиотеке?

Пито
Вт 26 июня 2018 г., 19:04
Скорость отбора проб (измерения АЦП/второе) зависит от используемого чипа и вашей библиотеки возможностей.
Чип 1115 может провести 8-860 измерений в секунду.
Это может быть разрешение ADC, зависит от скорости отбора проб (двойная проверка).
Ваша библиотека должна иметь возможность установить скорость отбора проб. Вы можете попытаться установить его на максимум 860 (но это, вероятно, жестко закодировано). В этом случае достаточно иметь задержку 1/860 секунд.
Прочитайте таблицу вашего чипа, не полагайтесь только на библиотеки.

Хейсан
Вт 26 июня 2018 г., 19:09
Я сделал быстрый Google, и эта LIB выглядит так, как будто он может работать лучше:

https: // github.com/baruch/ads1115

Пито
Вт 26 июня 2018 г., 19:22
https: // github.com/baruch/ads1115 Что LIB не проверяет готовый бит конверсии и не ждет с этой задержкой, кажется, что это.
Он гласит в том, что исходит от чипа..
Однако не может быть трудно включить готовность к конверсии, однако..

Эта библиотека опрошены флаг готового конверсии:

https: // github.com/addicore/ads1115/blo ... DS1115.CPP

Хейсан
Вт 26 июня 2018 г., 8:00 вечера
[Пито - Вт 26 июня 2018 г., 19:22] - https: // github.com/baruch/ads1115 Что LIB не проверяет готовый бит конверсии и не ждет с этой задержкой, кажется, что это.
Он гласит в том, что исходит от чипа..
Однако не может быть трудно включить готовность к конверсии, однако..
Если вы посмотрите на код образца, он требует, чтобы вызывающий абонент опросил флаг готового конверсии, что может быть преимуществом, поскольку он становится не блокирующим процессом.

Zerox
Вт 26 июня 2018 г., 8:05 вечера
Спасибо за весь ответ’с. Я очень ценю помощь, которую я получаю от тебя!

Завтра проверю эти библиотеки и дам вам отзывы, как только смогу.

Пито
Вт 26 июня 2018 г., 21:09
[Хейсан - Вт 26 июня 2018 г., 8:00 вечера] - ..Если вы посмотрите на код образца, он требует, чтобы вызывающий абонент опросил флаг готового конверсии, что может быть преимуществом, поскольку он становится не блокирующим процессом.
Да, верно, я вижу это в примере (readme) if (!adc.is_sample_in_progress()) {

Zoomx
Вт 26 июня 2018 г. 22:23
[Zerox - Вт 26 июня 2018 г. 16:14] - Это сработало!!!!!
Пожалуйста, добавьте [Решен] в заголовок.

Поддержка STM32F103RT6