АЦП микроконтроллеров STM32F10x

АЦП микроконтроллеров STM32F10x получает опорное напряжение с внешнего источника. Если у микроконтроллера меньше 100 выводов, то к нему невозможно подключить внешний ИОН, тогда в качестве опорного напряжения используется напряжение питания.

Хотя микроконтроллеры имеют встроенный ИОН, этот ИОН нельзя использовать в качестве опоры АЦП, но зато можно измерить его напряжение. Благодаря этому мы получаем возможность хитрым способом измерить опорное напряжение АЦП (то есть, по сути напряжение питания). Делается это следующим образом:

  1. выбрать канал 17,
  2. произвести измерение,
  3. рассчитать опорное напряжение АЦП по формуле:

U_{REFADC}=\frac{2^n}{C_{REFINT}}\cdot U_{REFINT}

где:

  • UREFINT = 1,2 В — опорное напряжение внутреннего ИОН;
  • n = 12  — разрядность АЦП;
  • СREFINT — результат АЦ-преобразования.

В дальнейшем, зная UREFADC, можно производить обычные измерения, рассчитывая напряжение на входе АЦП по формуле:

U_{ADC}=\frac{C_{ADC}}{2^n}\cdot U_{REFADC}

Объединяя предыдущие формулы, получаем:

U_{ADC}=\frac{C_{ADC}}{C_{REFINT}}\cdot U_{REFINT}

Иллюстрация к вышеописанному:

Схема АЦП STM32F10x

Реклама

Программирование микроконтроллеров STM32W108

Статья будет дополняться по мере углубления автора в микроконтроллеры STM32W108.

Среды для программирования

Подключение библиотеки SimpleMAC

Библиотека содержит два API:

  • HAL (абстрактное представление аппаратных средств)
  • SimpleMAC (управление радиочастотным модулем)

SimpleMAC API документировано значительно лучше, чем HAL API. Можно даже сказать, что HAL API совсем не документировано, что очень усложняет его использование.

Компилятору следует указать следующие пути поиска заголовочных файлов:

  • <Каталог SimpleMAC>/STM32W108
  • <Каталог SimpleMAC>/STM32W108/hal
  • <Каталог SimpleMAC>/STM32W108/hal/micro

К проекту требуется добавить следующие ассемблерные файлы (из директории <Каталог SimpleMAC>/STM32W108/hal/micro/cortexm3):

  • spmr.s
  • context-switch.s
  • cstartup_M.s

А также все файлы исходных кодов (*.c) из директории <Каталог SimpleMAC>/STM32W108/hal/micro/cortexm3.

В начале каждого файла исходных кодов (*.c) библиотеки можно обнаружить строчку:

#include PLATFORM_HEADER

Необходимо самим задать определение PLATFORM_HEADER в опциях компилятора.

В зависимости от того какими средствами разработки вы пользуетесь, PLATFORM_HEADER должно содержать одно из значений:

  • <hal/micro/cortexm3/compiler/iar.h>
  • <hal/micro/cortexm3/compiler/gnu.h>

Чтобы задать определение в EWARM, следует на вкладке Preprocessor в поле Defined Symbols добавить следующую строчку:

PLATFORM_HEADER=<hal/micro/cortexm3/compiler/iar.h>

Если вы программируете в среде EWARM, то следует подключать файл iar.h. Если в среде TrueSTUDIO, то — gnu.h.

HAL API предоставлен в исходном коде. SimleMAC API наоборот: предоставлен в виде объектных файлов:

  • <Каталог SimpleMAC>/STM32W108/simplemac/library/simplemac-library.a
  • <Каталог SimpleMAC>/STM32W108/simplemac/library/libsimplemac-library-gnu.a

В среде EWARM в опциях линкера на вкладке Library в поле Additional Libraries требуется указать первый объектный файл.

Начинать писать свою программу в файле main.c надо со строчек:

#include PLATFORM_HEADER
#include <hal/hal.h>
#include <simplemac/include/phy-library.h>

Использование SImpleMAC API

Прототипы функций, структуры и определения — все содержится в единственном файле phy-library.h.

В программе требуется объявить глобальную переменную radioTransmitConfig типа RadioTransmitConfig.
Переменная radioTransmitConfig должна быть инициализирована до вызова функции ST_RadioTransmit(). Во время передачи переменную нельзя модифицировать.
RadioTransmitConfig — это структура для управления передачей, содержащая следующие поля:

Тип Имя Описание
boolean waitForAck Ожидать подтверждение приема (ACK) если запрос подтверждения установлен в поле контроля пакета (FCF)
boolean checkCca Проверка занятости канала и выполнение backoff перед передачей
int8u ccaAttemptMax
int8u backoffExponentMin
int8u backoffExponentMax
int8u minimumBackoff
boolean appendCrc Добавка контрольной суммы к передаваемым пакетам

В свою программу следует добавить реализацию функций обратного вызова:

void ST_RadioSfdSentIsrCallback (int32u sfdSentTime) {}

void ST_RadioTxAckIsrCallback (void) {}

boolean ST_RadioDataPendingLongIdIsrCallback (int8u *longId) {}

boolean ST_RadioDataPendingShortIdIsrCallback (int16u shortId) {}

void ST_RadioOverflowIsrCallback (void) {}

void ST_RadioMacTimerCompareIsrCallback (void) {}

void ST_RadioTransmitCompleteIsrCallback ( StStatus status,
                                           int32u   sfdSentTime,
                                           boolean  framePending ) {}

void ST_RadioReceiveIsrCallback ( int8u   *packet,
                                  boolean ackFramePendingSet,
                                  int32u  time,
                                  int16u  errors,
                                  int8s   rssi ) {}

Управление портами ввода вывода

Функция для настройки портов:

void halGpioConfig (int32u io, int32u config)

Значения io Описание
PORTA_PIN(y) Порт A, где y — номер вывода 0…7
PORTB_PIN(y) Порт B, где y — номер вывода 0…7
PORTC_PIN(y) Порт C, где y — номер вывода 0…7
Значения config Описание
GPIOCFG_ANALOG Аналоговый вход или выход
GPIOCFG_IN Цифровой вход
GPIOCFG_IN_PUD Цифровой вход с подтяжкой к питанию или земле
GPIOCFG_OUT Двухтактный выход
GPIOCFG_OUT_ALT Альтернативный двухтактный выход
GPIOCFG_OUT_ALT_OD Альтернативный выход с открытым стоком
GPIOCFG_OUT_OD Выход с открытым стоком

Функция для управления состоянием портов:

void halGpioSet (int32u io, boolean value)

Значение io то же, что в предыдущей функции.

Значения value Описание
FALSE Логический 0
TRUE Логическая 1

Особо стоит сказать о настройке подтяжки.

Настройка вывода PA5 в режим подтяжки к питанию:


halGpioSet(PORTA_PIN(5), GPIOOUT_PULLUP);

halGpioConfig(PORTA_PIN(5), GPIOCFG_IN_PUD);

Настройка вывода PA4 в режим подтяжки к земле:


halGpioSet(PORTA_PIN(4), GPIOOUT_PULLDOWN);

halGpioConfig(PORTA_PIN(4), GPIOCFG_IN_PUD);

Дополнительные материалы

Сдвиг фазы сигнала с помощью RC-цепи

Теория

Одна RC-цепь способна сдвинуть фазу сигнала на угол до −90°, две RC-цепи — на угол до −180° и т. д.

Передаточная функция RC-цепи:

W = \frac{1}{1+pRC}

Амплитудно-частотная характеристика RC-цепи:

A = \frac{1}{\sqrt{1+(2\pi fRC)^2}}

где f — частота, Гц.

Фазо-частотная характеристика RC-цепи:

\varphi = {-arctg(2\pi fRC)}

Из последней формулы следует:

RC = \frac{tg(-\varphi)}{2\pi f}

Коэффициент усиления сигнала для заданной фазы:

A = \frac{1}{\sqrt{1+tg^2\varphi}}

Пример

Допустим требуется сдвинуть синусоидальный сигнал частотой f = 50 Гц на угол φ = −45°.

Автор подобрал номиналы резистора и конденсатора таким образом, чтобы сдвиг фазы был максимально близок к 45°:

R = 680 Ом

С = 4,7 мкФ

\varphi=-arctg(2\pi 50\cdot 680\cdot 4.7\cdot 10^{-6})=-45.116^{\circ}

При этом коэффициент усиления сигнала равен:

A = \frac{1}{\sqrt{1+tg^2(45.116^{\circ})}} = 0.706

Значение меньше единицы, значит сигнал ослабляется.

Теперь сравним два графика. Один получен в математической программе:


А другой, в программе моделирующей электрические цепи:


Графики различаются только в самом начале, так как RC-цепи необходимо некоторое время для установления сигнала.