├── adc_stat.c ├── adc_stat.h ├── ads1256.c ├── ads1256.h ├── ads1256_defs.h ├── examples ├── example1.c └── example2.c ├── ads1256_InterruptHandlersConnector.c ├── docs ├── Скользящее среднее (алгоритм фильтра).pdf └── ADS1256 (Very Low Noise, 24-Bit Analog-to-Digital Converter datasheet) (Rev. K) [TI].pdf ├── LICENSE └── README.md /adc_stat.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/adc_stat.c -------------------------------------------------------------------------------- /adc_stat.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/adc_stat.h -------------------------------------------------------------------------------- /ads1256.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/ads1256.c -------------------------------------------------------------------------------- /ads1256.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/ads1256.h -------------------------------------------------------------------------------- /ads1256_defs.h: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/ads1256_defs.h -------------------------------------------------------------------------------- /examples/example1.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/examples/example1.c -------------------------------------------------------------------------------- /examples/example2.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/examples/example2.c -------------------------------------------------------------------------------- /ads1256_InterruptHandlersConnector.c: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/ads1256_InterruptHandlersConnector.c -------------------------------------------------------------------------------- /docs/Скользящее среднее (алгоритм фильтра).pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/docs/Скользящее среднее (алгоритм фильтра).pdf -------------------------------------------------------------------------------- /docs/ADS1256 (Very Low Noise, 24-Bit Analog-to-Digital Converter datasheet) (Rev. K) [TI].pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/Celeron/gcc-STM32_ADS1256_ADC_driver/HEAD/docs/ADS1256 (Very Low Noise, 24-Bit Analog-to-Digital Converter datasheet) (Rev. K) [TI].pdf -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) Celeron, 2018 http://InventProject.Info/ 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | "ADS1256" driver 2 | ================ 3 | 4 | Микросхема ADS1256 [Texas Instruments] это Малошумящий 24-битный АЦП с SPI интерфейсом. 5 | 6 | 7 | **Драйвер АЦП "ADS1256" реализован для архитектуры микроконтроллеров "STM32 Cortex-M" 8 | с использование низкоуровневых драйверов для SPI и EXTI из стандартного фреймворка "STM32CubeFW".** 9 | 10 | 11 | *К сожалению, в Интернете нашёл только любительские библиотеки (для Arduino) для работы с этим АЦП - поэтому ничего готового взять не удалось - пришлось создать свою версию Драйвера...* 12 | 13 | 14 | 15 | Требования 16 | ---------- 17 | 18 | Компилятор: GCC-совместимый (Keil, IAR)... Язык программирования "Си". 19 | 20 | 21 | Эта версия Драйвера заточена по микроконтроллеры STM32 Cortex-M и фреймворк "STM32CubeFW". 22 | 23 | *В принципе, драйвер можно легко портировать под другую архитектуру. Можно даже абстрагировать низкоуровневые методы в отдельный слой, и скомпоновать в отдельный модуль (портировочный адаптер). Но я пока этим не занимался...* 24 | 25 | Для организации низкоуровневой коммуникации по Шинам данных, Драйвер "ADC1256" использует фреймворк "STM32CubeFW". 26 | Из фреймворка "STM32CubeFW", используются HAL-драйверы для встроенной в микроконтроллер периферии (SPI и GPIO). 27 | В частности, используются методы: 28 | 29 | 1) GPIO: HAL_GPIO_ReadPin / HAL_GPIO_WritePin / HAL_GPIO_TogglePin; 30 | 31 | 2) SPI: HAL_SPI_Receive / HAL_SPI_Transmit, HAL_SPI_Receive_IT / HAL_SPI_Transmit_IT; 32 | 33 | 3) Для реализации режима "потоковой конверсии" (DATAC) - Обработчики прерываний SPI и EXTI подключены через Callback-функции: 34 | 35 | HAL_SPI_TxRxCpltCallback() 36 | 37 | HAL_GPIO_EXTI_Callback() 38 | 39 | Подключённые в STUB-модуле: "ads1256_InterruptHandlersConnector.c" 40 | 41 | 42 | 43 | Особенности и Ограничения драйвера 44 | ---------------------------------- 45 | 46 | 47 | 1) В Драйвере реализованы высокоуровневые API-функции для КОНФИГУРАЦИИ почти всех параметров и РЕЖИМОВ микросхемы ADS1256. 48 | 49 | Единственное, что не реализовано: настройка и **управление Портами GPIO** микросхемы ADS1256 (их 4 шт.) - решено пока не реализовывать, поскольку это редкоиспользуемая фича. 50 | 51 | 52 | 53 | 2) В Драйвере реализованы функции **"Асинхронной Конвертации Данных"** (режим DATAC, на прерываниях: "EXTI" по DRDY, и по "SPI"). 54 | 55 | Но для работы этого продвинутого режима (DATAC) требуется обеспечить некоторые особенности аппаратной конфигурации (причём, это не ограничения данного Драйвера, а требования наследуемые из оригинального Datasheet на микросхему!) 56 | Драйвер работает в предположении, что данные режимы обеспечены, в частности: 57 | 58 | SPI работает с "Full-Duplex Mode"; есть аппаратная шина DRDY; и др. 59 | 60 | Подробнее, эти требования расписаны в файле "ads1256.h" / в разделе "Потоковая конвертация: Асинхронное и неблокирующее..." / в комментарии "Требования и Ограничения". 61 | 62 | 63 | ПРИМЕЧАНИЕ: 64 | 65 | Если требования для обеспечения работы DATAC-режима не соблюдены - то "Асинхронная потоковая конвертация" запущена быть не может... 66 | 67 | Но, тем не менее, Драйвер АЦП всё ещё может ПОЛНОЦЕННО РАБОТАТЬ в режиме "одиночной финхронной выборки" и полностью доступны все API-методы для КОНФИГУРАЦИИ РЕЖИМОВ МИКРОСХЕМЫ. 68 | 69 | 70 | TESTING: 71 | 72 | Режим DATAC тестировался на максимальной скорости семплирования F_DATA=15000 SPS (в то время как абсолютный максимум для данной микросхемы = 30000 SPS), при скорости интерфейса F_SPI=562500 Гц. 73 | 74 | Результат: Периодический запрос Пакета данных (3байта) - вычитывается нормально. Запасы по таймингам есть. Но Скорость уже впритык. 75 | 76 | 77 | 78 | 3) Реализован продвинутый модуль "ADS_STAT" - функции **математической постобработки** результатов конвертации: "усреднение скользящим окном", "конвертация кода АЦП в реальные единицы измерение (в т.ч. Калибровка)", "регистрация данных в Режиме потоковой конвертации". 79 | 80 | Замечу, что этот модуль реализует функцию "Регистратор данных", который является ключевым для "Режима потоковой конвертации". Без этой фунции невозможно использование режима DATAC! 81 | Хотя, вы можете написать свою версию 1) функции "Регистратор данных" 2) и вообще весь модуль "математической постобработки" целиком... 82 | 83 | Между Драйвером АЦП "ads1256.c" и модулем математической постобработки "adc_stat.c" - нет жёстких зависимостей! Эти модули могут эксплуатироваться раздельно - просто их API спроектированы таким образом, что удобно использовать вместе - сателлитные модули. 84 | 85 | Также, вы можете использовать модуль математической постобработки "adc_stat.c" и с любым другим АЦП (например, встроенным в микроконтроллер). 86 | 87 | 88 | 89 | 4) В API Драйвера - Не реализован возврат "Кода ошибки" при выполнении API-методов. Т.е. не реализован традиционный метод, подобный: ADS1256_API_GetLastError()... 90 | 91 | Таким образом, после запуска Setter-методов - не совсем понятно, принял ли АЦП новую команду или нет? 92 | А может АЦП вообще "завис" или "отвалился от Шины"? 93 | 94 | Впрочем, такая модель принята для упрощения реализации драйвера, и чтобы сделать коммуникацию с АЦП более "легковесной". 95 | 96 | Т.е. поскольку АЦП удалённый, то Setter-метод и сам не знает "принял ли АЦП очередную команду?.." 97 | Для проверки реакции удалённого АЦП, по хорошему: каждому Setter-методу после отработки нужно было бы, каждый раз, вызывать парный ему Getter-метод и сверять возвращённый параметр с установленным ранее. 98 | Но "Setter" и "Getter" методы реализованы "атомарно" (принята такая концепция) - каждый делает только свою функцию. 99 | 100 | Рекомендую как метод: 101 | 102 | Если вам требуется достоверно убедиться, что АЦП принял устанавливаемый режим - то, после инициализации, вызовите серию Getter-методов самостоятельно, чтобы запросить текущий режим АЦП, и сверьте со своими установками. 103 | 104 | А в качестве "Keep alive / Ping" можете периодически вызывать метод: ADS1256_API_GetDeviceID()... Или, уж лучше сразу: ADS1256_API_ReadLastData(). Мне хватало последнего. 105 | 106 | 107 | 108 | 109 | Советы по аппаратной реализации Шины связи с АЦП 110 | ------------------------------------------------ 111 | 112 | Очень советую вам не игнорировать, а реализовать в аппаратной части "Шину CS" (Chip Select) - этот сигнал СТРОБИРУЕТ НАЧАЛО СЕССИИ КОММУНИКАЦИИ с АЦП. Таким образом, ПРЕПЯТСТВУЕТ СРЫВУ СИНХРЫ !!! 113 | *Да, сигнал CS предназначен не только для управления несколькими "Ведомыми" по одной Шине, но и обеспечивает стабильность связи даже с Одним Ведомым.* 114 | 115 | Без Строба по CS - Если по каким-то причинам (по причине НАНОСЕКУНДНОЙ ПОМЕХИ, конечно же) по шине SCLK пройдёт лишний фронт - то ВСЯ ДАЛЬНЕЙШАЯ КОММУНИКАЦИЯ с АЦП будет полностью похерена, до "сброса по питанию"! 116 | (Будут просто идти мусорные данные от АЦП, а он вас "не услышит", поскольку все команды будет воспринимать со сдвигом на один бит... Наступал на эти грабли!) 117 | Таким образом, АЦП даже не воспримет команду RESET и повторную последовательность Инициализации - это будет уже бестолку. 118 | 119 | *Напомню: микросхема АЦП работает в режиме "Ведомого", а потому только слушает шину SCLK. И никакого альтернативного канала связи, чтобы сообщить микроконтроллеру о своём здоровье, не имеет - кроме как по Шине SPI. И если нарушается связь по SPI, то АЦП становится неуправляемым!* 120 | 121 | В какой-то мере, после срыва синхронизации, микроконтроллер мог бы восстановить работоспособность АЦП послав ему "Сигнал Сброс по внешней асинхронной аппаратной Шине /RESET" (есть такой вход у микросхемы). 122 | Но замечу, после "аппаратного Reset" - требуется полная переинициализация Микросхемы АЦП. Это долго. И сложно реализовывать алгоритм эвристической детекции, что "АЦП двинулся синхрой и несёт какой-то бред"... Не рекомендую этот путь! 123 | 124 | Гораздо лучше и эффективнее: ПЕРЕД КАЖДОЙ сессией коммуникации с АЦП (типа, "команда-ответ") - разрешать Шину сигналом "Chip Select" - при этом, каждый раз, микросхема АЦП переинициализирует только свой интерфейс SPI. 125 | После получения "ответа" от АЦП, сигнал CS возвращается в "пассивное состояние". Такая логика реализована в этом Драйвере. И такая логика рекомендована Datasheet. 126 | 127 | При этом, даже если и пройдёт "наносекундная помеха" и будет срыв синхры - то похерится только текущий пакет данных. Но уже при следующей команде - коммуникация восстановится автоматически. 128 | Если помеха пройдёт не на этапе реконфигурации АЦП, а при очередном запросе результатов конвертации (что наиболее вероятно), то такой сбой даже не будет замечен (поскольку "сбойный замер" будет усреднён "скользящим окном" постобработки и отброшен как "статистическая погрешность"). 129 | 130 | 131 | 132 | Очень рекомендую сделать Подтяжки Шины, для самых критичных сигналов: 133 | 134 | **SCLK подтянуть к GND (подтяжкой 5K)** 135 | 136 | **/CS подтянуть к VDD (подтяжкой 5K)** 137 | 138 | *(Это очень важно, особенно в момент включения Питания: когда микроконтроллер ещё не проинициализирован и его Порты ввода/вывода находятся в высокоимпедансном состоянии - таким образом, Шина SPI полностью не управляема и по ней идёт всякий мусор от помех - и прямо в АЦП. Чтобы не случилось так, что Микроконтроллер проснётся, начнёт осознавать своё окружения - а АЦП уже "сдох", наловив мусорных данных, и уйдя в "глубокую залочку"...)* 139 | 140 | Подтяжка 5K может показаться великоватой, но такой номинал хорошо себя зарекомендовал в промышленной автоматике, в сильношумном окружении... Можете использовать номинал для подтяжек 5K..15K. (Меньше 15K не рекомендую использовать, в любом случае.) 141 | 142 | 143 | 144 | Следующие Шины не столь критичны, здесь по желанию: 145 | 146 | DIN и DOUT подтягивать не нужно - АЦП "глух и нем" к ним, в случае отсутствия сигнала синхры. 147 | 148 | /RESET можно жестко подтянуть к VDD и не использовать (мне он непригодился) 149 | 150 | 151 | 152 | 153 | Благодарности другим Авторам, материалы которых использовались 154 | -------------------------------------------------------------- 155 | 156 | Помимо официального Datasheet: http://www.ti.com/product/ADS1256 157 | 158 | 159 | Ориентировался на код других библиотек (любительских под Arduino): 160 | 161 | supremeremixx @ http://www.cyberforum.ru/arm/thread2226883.html 162 | 163 | Adien Akhmad @ https://github.com/adienakhmad/ADS1256 164 | 165 | Flydroid @ https://github.com/Flydroid/ADS12xx-Library 166 | 167 | --------------------------------------------------------------------------------