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