Уроки программирования STM8. Урок 5. STVD + CXSTM8. Основы работы с АЦП. Практика

В микроконтроллерах STM8S обычных линеек, установлен аналогово-цифровой преобразователь с разрядностью (точностью) 10 бит. Конкретно в STM8S103F3T6 имеется 5 аналоговых линий AIN2-AIN6, способных преобразовывать напряжение в диапазоне от 0 до Vdd. Отладочная плата Blue pill, используемая в этой практике, питает процессор напряжением 3,3V. Соответственно на аналоговую линию можно подавать напряжение в диапазоне от 0 до 3.3V.

10-Битная точность означает, что диапазон напряжений 0-3,3V будет представлен в цифровом виде как 0-1023. 10-битное максимальное число - это 1023 (210-1). Цифра, полученная в результате аналогово-цифрового преобразования, называется дискретным значением АЦП.

Dval = Uain/(Vdd/1023)

Где Dval - дискретное значение АЦП, Vdd - напряжение питания микроконтроллера, Uain - напряжение на линии порта (Uain<Vdd).

В этой практической работе мы продолжим работу над проектом в STVD. Задача следующего кода вот в чем:

1) Линия порта PC4 (AIN2) будет считываться АПЦ преобразователем.

2) В зависимости от потенциала на этом входе, светодиод будет светиться ярче или тусклее.

Вот и сам код программы

Архив с проектом можно скачать по этой ссылке https://drive.google.com/file/d/1dUOEa0oNKOQDF2cxdcMU3t4mTnakrgHF/view?usp=sharing

Проект из предыдущего практического занятия дополнился новыми строками и в общем, алгоритм работы стал таким (в тексте описания кода могут попадаться непонятные новичкам термины, но все будет более подробно объяснено в теоретической части занятия):

int adcTotalRes;

// Создаем новую переменную, в которую потом запишем результат преобразования АЦП

PB_DDR = 0b00100000;

// Установка 5-ого бита регистра DDR порта B, делает 5-ую линию порта цифровым выходом

ADC_CSR = 2;

// Часть инициализации АПЦ (ADC по-английски), подключает мультиплексор ко второму каналу (PC4 [AIN2])

ADC_CR2 = 0b00001000;

// установкой бита №3 этого регистра, указываем выравнивание результата преобразования "по правому краю"

ADC_CR1 |= 1; // включаем питание АЦП. Повторная запись этого бита запустит конвертирование (ADC Start)

PB_ODR = 0xFF;

// лог единицы на все линии порта B

delay(500);

// пользовательская функция паузы. Контроллер просто потупит заданное количество итераций

PB_ODR = 0;

// лог нули на все линии порта B. Подтянет катод светодиода к Vss (GND) и он засветится

delay(adcTotalRes);

// потупить столько итераций, сколько значения намерил АЦП, чем больше - тем дольше

adcTotalRes = (ADC_DRH<<8)|ADC_DRL;

// Собрали значения старшего и младшего 8 битных регистров результата и поместили в одну 16 битную ячейку памяти.

Впишите код в свой проект, поэкспериментируйте с платой, подайте сигнал 0 - 3.3V на PC4 (AIN2), посмотрите, как будет меняться интенсивность свечения светодиода. Можно прикасаться ко входу пальцами, тем самым подавая наводку от электрической сети. Разбор этого кода и теоретическая часть по основам работы с АЦП будут приведены в следующей статье.