Измерения с помощью 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 | Разрешение | Типичная точность | Максимальное напряжение на обычном входе 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 уже используется внутренний делитель. Не добавляйте внешний делитель, если этого не требует схема целевой платы. Допуск резисторов влияет на точность; если в устройстве используется внешний делитель, при необходимости отдельно откалибруйте его на производстве.
| Семейство | Тракт измерения аккумулятора | Примечание по проектированию |
|---|---|---|
| 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% ограничивает погрешность коэффициента деления и помогает сохранить точность измерения. Выход делителя — это точка измерения для АЦП, а не напряжение аккумулятора. При использовании этой схемы сверяйтесь с электрическими ограничениями и схемой целевого устройства.


| Входное напряжение аккумулятора | Выход 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) подключают этот узел к земле параллельно. Считайте эти значения справочными и сверяйте их со схемой и электрическими ограничениями целевого устройства.

Аналоговое питание и опорное напряжение¶
Аналоговое питание и разводка выводов опорного напряжения зависят от семейства. Ориентируйтесь на схему целевого устройства, а не предполагайте одинаковую разводку GPADC для всех модификаций:
| Семейство | Подключение питания и опорного напряжения |
|---|---|
| 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, если он предусмотрен, — аналоговая земля.

Настройка вывода АЦП¶
Перед выборкой настройте выбранный входной вывод в аналоговый режим. В руководстве приведены следующие общие примеры вызова API:
Эти вызовы показывают API настройки аналогового вывода, но не задают вывод для конкретного семейства. Выберите физический вход по карте каналов:
| Семейство | 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). Не переносите это назначение на другие семейства.

Чтение канала АЦП¶
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.
Калибровка АЦП и пересчёт напряжения¶
В руководстве пересчёт описан линейной зависимостью:
Offset — необработанное значение при 0 V; Ratio — приращение напряжения на один отсчёт АЦП. Заводская калибровка компенсирует разброс параметров при производстве, однако в руководстве также приведена двухточечная калибровка собранной входной цепи:
- Подайте два точных стабильных напряжения и считайте соответствующие значения АЦП.
- Используйте две точки калибровки, указанные для целевого семейства; не заменяйте их значениями 0 V или максимальным входным напряжением.
- Вызовите
sifli_adc_calibration, чтобы вычислить и сохранить коэффициенты ratio и offset. - Пересчитывайте последующие необработанные значения по сохранённым коэффициентам. При вычислении напряжения источника сигнала также учитывайте коэффициент деления.
В исходной реализации 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, соответствующий выбранному диапазону.
Документированы два диапазона калибровки:

- Диапазон 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.

Не выбирайте диапазон калибровки только по таблице: проверьте заводскую конфигурацию и реализацию SDK для целевого устройства. Режимы X1 и X3 относятся только к документации SF32LB55x, цитируемой здесь, и не должны автоматически переноситься на другие семейства.
| Семейство | Напряжения калибровки |
|---|---|
| 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 после перехода в Standby и пробуждения¶
Для входа измерения аккумулятора PB10 на SF32LB55x проверяйте настройку вывода как перед переходом в Standby, так и после пробуждения. До инициализации на PB10 по умолчанию включена внутренняя подтяжка вверх. В pinmux.c задайте для вывода PIN_NOPULL и PIN_ANALOG_INPUT; иначе подтяжка может остаться включённой и время от времени вызывать завышенные показания.


Первичная проверка¶
Прежде чем реализовывать многоканальный или циклический сбор данных, проверьте один канал, подав на него стабильное напряжение, измеренное независимым прибором:
- Проверьте назначение вывода и аналоговую настройку для целевого семейства.
- Убедитесь, что напряжение на выходе делителя не превышает ограничение АЦП данного семейства.
- Сравните необработанные и откалиброванные показания с поданным напряжением.
- Зафиксируйте параметры делителя и условия калибровки в протоколе испытаний платы.
При подключении UART для вывода журналов SF32LB56x к внешнему ПК опорный уровень последовательного адаптера должен соответствовать напряжению I/O микросхемы. В FAQ OpenSiFli по АЦП предупреждается: если I/O работает от 3,3 V, а адаптер настроен на опорный уровень 5 V, показания АЦП могут оказаться значительно ниже ожидаемых. Например, аккумулятор на 4 V может отображаться как 3,3 V.
Официальные источники¶
- Руководство по использованию и настройке АЦП SF32LB52x
- Руководство по использованию и настройке АЦП SF32LB55x
- Руководство по использованию и настройке АЦП SF32LB56x
- Руководство по использованию и настройке АЦП SF32LB57x
- Руководство по использованию и настройке АЦП SF32LB58x
- Справка API HAL для АЦП SF32LB52x — определения диапазона калибровки по умолчанию.
- Руководство по проектированию аппаратуры SF32LB57x — накопители и производство — назначение выводов GPADC.
- Руководство по проектированию аппаратуры SF32LB57x — Минимальная система и питание — подключения аналогового питания и опорного напряжения, а также ограничения измерения сигнала аккумулятора для конкретного варианта питания.
- FAQ OpenSiFli по АЦП — заводские диапазоны калибровки и проверка SF32LB55x после запуска, перехода в Standby и пробуждения, а также рекомендации по уровню UART журналирования SF32LB56x.
Последнее обновление: