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

Измерения с помощью GPADC

В этой прикладной заметке собраны сведения об АЦП для семейств SF32LB52x, SF32LB55x, SF32LB56x, SF32LB57x и SF32LB58x. Программный порядок работы в целом одинаков, однако ограничения входа, назначение выводов и точки калибровки различаются. Перед настройкой аппаратуры и прошивки выберите нужное семейство по таблицам.

GPADC — это АЦП общего назначения SiFli, предназначенный, например, для измерения сигналов датчиков и напряжения аккумулятора. Его не следует путать с аудио-АЦП, имеющимся в SF32LB52x, SF32LB56x, SF32LB57x и SF32LB58x, или с сигма-дельта-АЦП в SF32LB55x и SF32LB58x. В этой заметке рассматривается только GPADC; сведения об остальных преобразователях приведены в документации по аудио и сигма-дельта-АЦП соответствующего семейства.

Область применения и модель каналов АЦП

В прикладных заметках SDK для SF32LB52x, SF32LB55x, SF32LB56x и SF32LB58x описаны восемь каналов АЦП — от GPADC_CH0 до GPADC_CH7. Они предназначены для аналоговых сигналов, например выходов датчиков и измерения напряжения аккумулятора. В карте каналов GPADC из SDK для SF32LB57x указано 12 каналов: выводы PA28–PA38 соответствуют GPADC_CH0–GPADC_CH10, а канал измерения аккумулятора обозначен как GPADC_CH11 (BAT в карте SDK). В руководстве по аппаратной разработке SF32LB57x соответствующий сигнал корпуса обозначен как VBAT или VBATS — в зависимости от варианта питания. Корректный результат измерения зависит от выбранного канала, входной цепи и калибровки для конкретного устройства.

На SF32LB52x предусмотрен выделенный тракт измерения аккумулятора на GPADC_CH7 (BAT): в примере SDK указано, что этот канал подключён к VBAT через внутренний делитель, а для пересчёта результата в напряжение аккумулятора применяется коэффициент vbat_factor из SDK. В отличие от него, на SF32LB56x и SF32LB58x канал GPADC_CH7 соответствует внешним выводам PB32 и PB39 соответственно. Канал аккумулятора SF32LB57x — это GPADC_CH11; используйте сигнал VBAT или VBATS, соответствующий варианту питания, и соблюдайте ограничения домена аккумулятора. Наличие на плате подключения канала к делителю аккумулятора само по себе не означает, что в микросхеме есть выделенный встроенный канал измерения аккумулятора.

Характеристики АЦП и входная цепь

Таблица: Характеристики обычных входов GPADC по семействам SF32
Семейство Каналы GPADC Разрешение Типичная точность Максимальное напряжение на обычном входе GPADC
SF32LB55x 8 10 бит 3–4 mV 1,1 V (X1); 3,3 V (X3)
SF32LB52x 8 12 бит 1–2 mV 3,3 V
SF32LB56x / 58x 8 12 бит 1–2 mV 3,3 V
SF32LB57x 12 12 бит 1–2 mV 3,3 V

Указанные выше предельные входные напряжения относятся к обычным входам GPADC; выделенные каналы измерения аккумулятора имеют собственные схемы подключения и ограничения. В примере SF32LB55x используется делитель 1 MΩ / 220 kΩ с временем установления RC-цепи 157 ms. В сводной таблице ADC руководства SF32LB56x указаны 470 kΩ / 1000 kΩ и 200 ms для SF32LB52x, SF32LB56x и SF32LB58x; для SF32LB57x эта рекомендация не приводится. Для 57x используйте тракт измерения аккумулятора и ограничения, документированные для конкретной модификации, не перенося на неё эти номиналы и время установления. Рекомендации относятся к внешним делителям. В частности, на выделенном тракте измерения аккумулятора SF32LB52x GPADC_CH7 уже используется внутренний делитель. Не добавляйте внешний делитель, если этого не требует схема целевой платы. Допуск резисторов влияет на точность; если в устройстве используется внешний делитель, при необходимости отдельно откалибруйте его на производстве.

Таблица: Тракты измерения напряжения аккумулятора в семействах SF32
Семейство Тракт измерения аккумулятора Примечание по проектированию
SF32LB55x Внешний делитель подключён к выбранному входу GPADC; в эталонной схеме используется PB10 / GPADC_CH1. Выход делителя должен оставаться в пределах выбранного диапазона X1/X3.
SF32LB52x Выделенный GPADC_CH7 / BAT; в примере SDK указано подключение VBAT через внутренний делитель. Используйте vbat_factor из SDK для пересчёта результата выделенного канала в напряжение аккумулятора.
SF32LB56x / 58x Внешний делитель на плате подключён к выбранному выводу GPADC; в карте SDK для GPADC_CH7 указаны PB32 / PB39 соответственно. Проверьте фактическое подключение делителя в схеме целевой платы. Это обычные выводы GPADC, а не встроенные выделенные каналы аккумулятора.
SF32LB57x Выделенный GPADC_CH11; в карте SDK он обозначен BAT, а в руководстве по аппаратной разработке используется VBAT или VBATS в зависимости от варианта питания. Уточните предел измерения канала аккумулятора для конкретной модификации. Для вариантов питания 3,3 V руководство задаёт диапазон GPADC 0–4,5 V для VBATS; не подменяйте его номинальным пределом вывода 4,7 V.

В FAQ OpenSiFli по АЦП для внешнего измерения напряжения аккумулятора на SF32LB55x приведён делитель 1 MΩ / 220 kΩ с резисторами с допуском 1%. Высокое сопротивление уменьшает постоянный ток утечки через делитель, а допуск 1% ограничивает погрешность коэффициента деления и помогает сохранить точность измерения. Выход делителя — это точка измерения для АЦП, а не напряжение аккумулятора. При использовании этой схемы сверяйтесь с электрическими ограничениями и схемой целевого устройства.

Делитель VBAT из руководства SDK для SF32LB56x

Рисунок: Делитель VBAT и точка измерения АЦП из руководства SDK для SF32LB56x.

Справочные значения напряжения для делителя 1 MΩ / 220 kΩ SF32LB55x

Рисунок: Справочные значения напряжения на выходе делителя SF32LB55x из FAQ OpenSiFli по АЦП.
Таблица: Справочное выходное напряжение делителя SF32LB55x 1 MΩ / 220 kΩ
Входное напряжение аккумулятора Выход PB10_BAT_DET_ADC
3,0 V 0,540983607 V
3,3 V 0,595081967 V
3,6 V 0,649180328 V
4,0 V 0,721311475 V
4,2 V 0,757377049 V
5,0 V 0,901639344 V

В эталонной схеме SF32LB55x VBAT через R125 (1 MΩ) подключён к PB10_BAT_DET_ADC. Резистор R126 (220 kΩ) и конденсатор C118 (0,1 µF) подключают этот узел к земле параллельно. Считайте эти значения справочными и сверяйте их со схемой и электрическими ограничениями целевого устройства.

Схема внешнего делителя для измерения напряжения аккумулятора на SF32LB55x

Рисунок: Цепь внешнего измерения напряжения аккумулятора на SF32LB55x.

Аналоговое питание и опорное напряжение

Аналоговое питание и разводка выводов опорного напряжения зависят от семейства. Ориентируйтесь на схему целевого устройства, а не предполагайте одинаковую разводку GPADC для всех модификаций:

Таблица: Подключение питания и опорного напряжения GPADC по семействам SF32
Семейство Подключение питания и опорного напряжения
SF32LB52x / 56x Подайте стабильные 3,3 V на AVDD33_ANA. В эталонной схеме GPADC_VREF подключён к земле через конденсатор; это не вход питания.
SF32LB55x В эталонной схеме показаны AVDD33_ANA и AVSS33_ANA; подключайте и развязывайте их согласно схеме целевого устройства.
SF32LB57x Подайте 3,3 V на AVDD33_ANA. GPADC_VREF — вывод опорного напряжения: подключите к земле только указанный конденсатор и не подавайте на вывод внешнее напряжение.
SF32LB58x В эталонной схеме показаны AVDD33_ANA / AVSS33_ANA, GPADC_VREFP с указанным конденсатором и GPADC_VREFN, подключённый к земле. Ни один из выводов опорного напряжения нельзя использовать как вход питания.

Пара выводов SF32LB58x GPADC_VREFP / GPADC_VREFN не взаимозаменяема с одиночным выводом GPADC_VREF, используемым в других семействах. В схемах SDK также показаны фильтрующие компоненты, специфичные для каждого семейства; используйте точную эталонную схему и номиналы целевого устройства. Не подавайте питание непосредственно на выводы опорного напряжения GPADC. AVDD33_ANA — аналоговое питание, а AVSS33_ANA, если он предусмотрен, — аналоговая земля.

Подключение аналогового питания и опорного напряжения GPADC из руководства SDK для SF32LB56x

Рисунок: Подключения аналогового питания и опорного напряжения GPADC, различающиеся по семействам, показанные в руководстве SDK для SF32LB56x.

Настройка вывода АЦП

Перед выборкой настройте выбранный входной вывод в аналоговый режим. В руководстве приведены следующие общие примеры вызова API:

HAL_PIN_Set_Analog(PAD_PB08, 0);
HAL_PIN_Set_Analog(PAD_PB13, 0);

Эти вызовы показывают API настройки аналогового вывода, но не задают вывод для конкретного семейства. Выберите физический вход по карте каналов:

Таблица: Соответствие выводов и каналов GPADC для семейств SF32
Семейство GPADC_CH0 GPADC_CH1 GPADC_CH2 GPADC_CH3 GPADC_CH4 GPADC_CH5 GPADC_CH6 GPADC_CH7
SF32LB55x PB08 PB10 PB12 PB13 PB16 PB17 PB18 PB19
SF32LB52x PA28 PA29 PA30 PA31 PA32 PA33 PA34 BAT
SF32LB56x PB22 PB23 PB24 PB25 PB26 PB27 PB28 PB32
SF32LB58x PB32 PB33 PB34 PB35 PB36 PB37 PB38 PB39
SF32LB57x PA28 PA29 PA30 PA31 PA32 PA33 PA34 PA35

В источниках SiFli есть расхождение по распиновке SF32LB52x: в специальной прикладной заметке ADC для SF32LB52x для ревизии A0 внешним выводам PB08, PB10, PB12, PB13, PB16, PB17, PB18 и PB19 соответствуют каналы GPADC_CH0–GPADC_CH7; в сводной таблице ADC руководства SF32LB56x указаны PA28–PA34 для GPADC_CH0–GPADC_CH6 и BAT для GPADC_CH7. Строка SF32LB52x выше соответствует сводной таблице и не является универсальной распиновкой для всех вариантов 52x. Перед разводкой или настройкой GPADC для устройства 52x сверьте точную модель и ревизию с конфигурацией мультиплексирования выводов в соответствующей версии SDK и схемой платы; не смешивайте эти карты.

У SF32LB57x предусмотрено ещё четыре канала АЦП: PA36 соответствует GPADC_CH8, PA37 — GPADC_CH9, PA38 — GPADC_CH10, а сигнал измерения аккумулятора — GPADC_CH11 (BAT в карте SDK; VBAT или VBATS в руководстве по аппаратной разработке, в зависимости от варианта питания). Этот канал относится к домену напряжения аккумулятора и имеет иной диапазон измерений, чем обычные входы GPADC. Для вариантов питания 3,3 V соблюдайте указанный в руководстве диапазон GPADC 0–4,5 V для VBATS, а не предел вывода 4,7 V. Поэтому карту 12 каналов и вход измерения аккумулятора нельзя считать взаимозаменяемыми с приведёнными выше картами для семейств с восемью каналами.

Только на SF32LB55x вывод PIN также можно напрямую назначить каналу GPADC, например: HAL_PIN_Set(PAD_PB08, GPADC_CH0, PIN_NOPULL, 0). Не переносите это назначение на другие семейства.

Настройка аналогового режима входа для измерения напряжения аккумулятора на SF32LB55x

Рисунок: Настройка вывода SF32LB55x в аналоговый режим для измерения напряжения аккумулятора через АЦП.

Чтение канала АЦП

SiFli-SDK регистрирует АЦП как устройство измерения напряжения аккумулятора; в руководстве в качестве имени устройства по умолчанию используется bat1. Через интерфейс устройств RT-Thread найдите это устройство, откройте его только для чтения, включите нужный канал и считайте необработанное значение:

uint32_t channel = 1;
uint32_t value;
rt_device_t dev = rt_device_find("bat1");

if (dev) {
    rt_device_open(dev, RT_DEVICE_FLAG_RDONLY);
    rt_device_control(dev, RT_ADC_CMD_ENABLE, (void *)channel);
    rt_device_read(dev, channel, &value, 1);
}

На уровне HAL результат преобразования считывается вызовом HAL_ADC_GetValue(&hadc, slot). Передайте инициализированный дескриптор ADC и номер слота, настроенного для преобразования; проверьте, что этот слот сопоставлен с нужным каналом и выводом PAD.

Калибровка АЦП и пересчёт напряжения

В руководстве пересчёт описан линейной зависимостью:

Vreal = (Valueadc − Offset) × Ratio

Offset — необработанное значение при 0 V; Ratio — приращение напряжения на один отсчёт АЦП. Заводская калибровка компенсирует разброс параметров при производстве, однако в руководстве также приведена двухточечная калибровка собранной входной цепи:

  1. Подайте два точных стабильных напряжения и считайте соответствующие значения АЦП.
  2. Используйте две точки калибровки, указанные для целевого семейства; не заменяйте их значениями 0 V или максимальным входным напряжением.
  3. Вызовите sifli_adc_calibration, чтобы вычислить и сохранить коэффициенты ratio и offset.
  4. Пересчитывайте последующие необработанные значения по сохранённым коэффициентам. При вычислении напряжения источника сигнала также учитывайте коэффициент деления.

В исходной реализации ADC_RATIO_ACCURATE задан как 1000, а начальные значения adc_vol_offset и adc_vol_ratio равны соответственно 200 и 3930. Этот устаревший вспомогательный код иллюстрирует линейный расчёт, но не заменяет процедуру калибровки, предоставляемую версией SDK для целевого устройства. Если доступна соответствующая функция, используйте API калибровки HAL или драйвера устройства.

Диапазоны калибровки SF32LB55x

В FAQ OpenSiFli по АЦП подробнее описан процесс калибровки SF32LB55x. При вызове sifli_adc_init из заводской области Flash считываются сохранённые калибровочные значения, идентифицируемые параметром FACTORY_CFG_ID_ADC. Функция sifli_adc_calibration по этим значениям вычисляет линейные коэффициенты offset и ratio; для последующих выборок используется расчёт sifli_adc_get_mv, соответствующий выбранному диапазону.

Документированы два диапазона калибровки:

Выбор режима калибровки и получение заводских значений SF32LB55x

Рисунок: Инициализация калибровки SF32LB55x, выбор диапазона и расчёт offset/ratio.
  • Диапазон X1: 0,3 V и 0,8 V. В сохранённых калибровочных значениях установлен бит 15, поэтому реализация выбирает режим малого диапазона. Точность снижается вблизи 0 V и при напряжении выше 1 V. В этом режиме GPADC_ADC_CFG_REG1_ANAU_GPADC_ATTN3X отключён, внутренний делитель не используется, а напряжение в точке измерения АЦП не должно превышать 1,1 V.
  • Диапазон X3: 1,0 V и 2,5 V. Это прежний метод калибровки. Он включает GPADC_ADC_CFG_REG1_ANAU_GPADC_ATTN3X и внутренний делитель с ослаблением 3×; входное напряжение не должно превышать 3,3 V.

Управление внутренним делителем SF32LB55x в режимах X1/X3

Рисунок: Включение и отключение внутреннего делителя SF32LB55x в зависимости от выбранного диапазона калибровки.

Не выбирайте диапазон калибровки только по таблице: проверьте заводскую конфигурацию и реализацию SDK для целевого устройства. Режимы X1 и X3 относятся только к документации SF32LB55x, цитируемой здесь, и не должны автоматически переноситься на другие семейства.

Таблица: Точки двухточечной калибровки, указанные в сводной прикладной заметке по ADC
Семейство Напряжения калибровки
SF32LB55x 0,3 V и 0,8 V
SF32LB52x / 56x / 58x 1,0 V и 2,5 V
SF32LB57x 1,0 V и 2,5 V

Для SF32LB52x в документации разных версий есть расхождение: сводная прикладная заметка по ADC указывает 1,0 V и 2,5 V для двухточечной калибровки, а актуальная справка API HAL называет диапазон X1 с точками 0,3 V и 0,8 V стандартным для SF32LB52X. Не считайте эти пары взаимозаменяемыми значениями по умолчанию. Перед выбором точек калибровки или допустимого входного напряжения проверьте точную версию SDK, заводские данные и диапазон, используемый при выполнении кода.

static uint32_t adc_vol_offset = 200;
static uint32_t adc_vol_ratio = 3930;
#define ADC_RATIO_ACCURATE 1000

int sifli_adc_get_mv(uint32_t value)
{
    return (value - adc_vol_offset) * adc_vol_ratio / ADC_RATIO_ACCURATE;
}

int sifli_adc_calibration(uint32_t value1, uint32_t value2,
                          uint32_t vol1, uint32_t vol2,
                          uint32_t *offset, uint32_t *ratio)
{
    uint32_t gap1, gap2;

    if (offset == NULL || ratio == NULL) return 0;

    gap1 = (value1 > value2) ? (value1 - value2) : (value2 - value1);
    gap2 = (vol1 > vol2) ? (vol1 - vol2) : (vol2 - vol1);

    if (gap1 == 0) return 0;

    *ratio = gap2 * ADC_RATIO_ACCURATE / gap1;
    adc_vol_ratio = *ratio;
    *offset = value1 - (vol1 * ADC_RATIO_ACCURATE / adc_vol_ratio);
    adc_vol_offset = *offset;

    return adc_vol_offset;
}

Проверка калибровки после запуска и пробуждения

При отладке измерения напряжения аккумулятора на SF32LB55x FAQ OpenSiFli по АЦП предупреждает о возможной неточности показаний в течение примерно первых 300 ms после запуска или пробуждения из-за заряда и разряда RC-цепи. По наблюдениям, форма сигнала стабилизируется примерно через 350 ms. Добавьте необходимую задержку перед измерением либо отбрасывайте первые нестабильные выборки. При измерении узла делителя мультиметром или осциллографом учитывайте входное сопротивление прибора: согласно FAQ, оно может вызвать падение напряжения примерно на 30 mV.

Установление сигнала измерения аккумулятора после запуска SF32LB55x

Рисунок: Форма сигнала SF32LB55x при запуске; стабилизация занимает около 350 ms.

Проверка вывода АЦП SF32LB55x после перехода в Standby и пробуждения

Для входа измерения аккумулятора PB10 на SF32LB55x проверяйте настройку вывода как перед переходом в Standby, так и после пробуждения. До инициализации на PB10 по умолчанию включена внутренняя подтяжка вверх. В pinmux.c задайте для вывода PIN_NOPULL и PIN_ANALOG_INPUT; иначе подтяжка может остаться включённой и время от времени вызывать завышенные показания.

Форма сигнала в узле измерения аккумулятора SF32LB55x в режиме Standby

Рисунок: Пример формы сигнала в узле измерения аккумулятора SF32LB55x, когда устройство находится в режиме Standby.

Форма сигнала в узле измерения аккумулятора SF32LB55x после пробуждения

Рисунок: Пример формы сигнала в узле измерения аккумулятора SF32LB55x после выхода из режима Standby.

Первичная проверка

Прежде чем реализовывать многоканальный или циклический сбор данных, проверьте один канал, подав на него стабильное напряжение, измеренное независимым прибором:

  1. Проверьте назначение вывода и аналоговую настройку для целевого семейства.
  2. Убедитесь, что напряжение на выходе делителя не превышает ограничение АЦП данного семейства.
  3. Сравните необработанные и откалиброванные показания с поданным напряжением.
  4. Зафиксируйте параметры делителя и условия калибровки в протоколе испытаний платы.

При подключении UART для вывода журналов SF32LB56x к внешнему ПК опорный уровень последовательного адаптера должен соответствовать напряжению I/O микросхемы. В FAQ OpenSiFli по АЦП предупреждается: если I/O работает от 3,3 V, а адаптер настроен на опорный уровень 5 V, показания АЦП могут оказаться значительно ниже ожидаемых. Например, аккумулятор на 4 V может отображаться как 3,3 V.

Официальные источники

Последнее обновление: