- Необходими материали
- ADC на STM8S103F3P6
- Електрическа схема за четене на ADC стойности на STM8S и дисплей на LCD
- ADC библиотека за STM8S103F3P6
- Програма STM8S за четене на аналогово напрежение и дисплей на LCD
- Четене на аналогово напрежение от два потенциометъра с помощта на STM8S
Ако сте редовен читател, който следва нашите уроци за микроконтролер STM8S, бихте знаели, че в последния ни урок научихме как да свързваме 16x2 LCD със STM8. Сега, продължавайки с него в този урок, ще научим как да използваме функцията ADC на нашия микроконтролер STM8S103F3P6. ADC е много полезна периферия на микроконтролер, която често се използва от вградени програмисти за измерване на единици, които са в постоянна промяна като променливото напрежение, ток, температура, влажност и т.н.
Както знаем „Ние живеем в аналогов свят с цифрови устройства“, което означава, че всичко около нас като скорост на вятъра, интензивност на светлината, температура и всичко, с което се справяме като скорост, скорост, налягане и т.н., са аналогови по своята същност. Но нашите микроконтролери и микропроцесори са цифрови устройства и те няма да могат да измерват тези параметри без важна периферия, наречена Analog to Digital Converters (ADC). Така че в тази статия, нека се научим как да използваме ADC на STM8S микроконтролер с COMIC C компилатор.
Необходими материали
В тази статия ще четем две аналогови стойности на напрежението от два потенциометра и ще показваме стойността на ADC на 16x2 LCD дисплей. За целта ще са ни необходими следните компоненти.
- STM8S103F3P6 Разработваща дъска
- Програмист ST-Link V2
- 16x2 LCD
- Потенциометри
- Свързващи проводници
- 1k резистор
ADC на STM8S103F3P6
Има много видове ADC и всеки микроконтролер има свои собствени спецификации. На STM8S103F3P6 имаме ADC с 5-канална и 10-битова резолюция; с 10-битова резолюция ще можем да измерим цифровата стойност от 0 до 1024 и 5-канален ADC показва, че имаме 5 извода на микроконтролера, които могат да поддържат ADC, тези 5 извода са подчертани на снимката по-долу.
Както можете да видите, всички тези пет пина (AIN2, AIN3, AIN4, AIN5 и AIN6) са мултиплексирани с други периферни устройства, което означава, че освен че действат само като ADC щифт, тези щифтове могат да се използват и за извършване на други комуникации като например, щифтовете 2 и 3 (AIN5 и AIN 6) могат не само да се използват за ADC, но могат да се използват и за серийна комуникация и GPIO функции. Имайте предвид, че няма да е възможно да се използва един и същ щифт и за трите цели, така че ако използваме тези два щифта за ADC, тогава няма да можем да осъществяваме последователна комуникация. Други важни ADC характеристики за STM8S103P36 могат да бъдат намерени в таблицата по-долу, взета от листа с данни.
В горната таблица Vdd представлява работно напрежение, а Vss представлява земята. Така че в нашия случай на нашата платка за разработка имаме микроконтролер, работещ на 3.3V, можете да проверите схемата на платката за разработка от самото начало с ръководството за STM8S. С 3.3V като работно напрежение, нашата ADC тактова честота може да бъде настроена между 1 до 4MHz и обхватът ни на преобразуващо напрежение е между 0V до 3.3V. Това означава, че нашият 10-битов ADC ще чете 0, когато е предоставено 0V (Vss) и ще чете максимум 1024, когато е осигурен 3.3V (Vdd). Ние можем лесно да променим това 0-5V, като променим работното напрежение на MCU, ако е необходимо.
Електрическа схема за четене на ADC стойности на STM8S и дисплей на LCD
Пълната електрическа схема, използвана в този проект, е дадена по-долу, тя е много подобна на урока за STM8S LCD, който дискутирахме по-рано.
Както можете да видите, единствените допълнителни компоненти освен LCD са два потенциометра POT_1 и POT_2 . Тези саксии са свързани към портовете PC4 и PD6, които са щифтовете ANI2 и ANI6, както беше обсъдено по-рано на изображението на пиновете.
Потенциометрите са свързани по такъв начин, че когато го променяме, ще получим 0-5 V на нашите аналогови щифтове. Ще програмираме нашия контролер да отчита това аналогово напрежение в цифрова стойност (0 до 1024) и да го показва на LCD екрана. След това също ще изчислим еквивалентната стойност на напрежението и ще го покажем на LCD, не забравяйте, че нашият контролер се захранва от 3.3V, така че дори ако осигурим 5V към ADC щифта, той ще може да чете само от 0V до 3.3V.
След като свързването свърши, хардуерът ми изглежда така, както е показано по-долу. Можете да видите двата потенциометра отдясно и програмиста ST-link отляво.
ADC библиотека за STM8S103F3P6
За да програмираме за ADC функционалности на STM8S, ще използваме компилатора Cosmic C заедно с SPL библиотеките. Но за да улесня процесите, направих още един заглавен файл, който може да бъде намерен в GitHub с връзката по-долу.
ADC библиотека за STM8S103F3P6
Ако знаете какво правите, можете да създадете заглавен файл, използвайки горния код и да го добавите към директорията „включване на файлове“ на страницата на вашия проект. Иначе следвайте началните стъпки с урока STM8S, за да знаете как да настроите вашата програмна среда и компилатор. След като вашата настройка е готова, вашата IDE трябва да има следните заглавни файлове, поне тези, обградени в червено.
Горният заглавен файл се състои от функция, наречена ADC_Read () . Тази функция може да бъде извикана във вашата основна програма, за да получи стойността на ADC на всеки пин. Например ADC_Read (AN2) ще върне стойността на ADC на щифт AN2 като резултат. Функцията е показана по-долу.
неподписан int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int резултат = 0; ADC1_DeInit (); ADC1_Init (ADC1_CONVERSIONMODE_CONTINUOUS, ADC_Channel_Number, ADC1_PRESSEL_FCPU_D18, ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT, ADC1_SCHMITTTRIG_ALL, DISABLE); ADC1_Cmd (АКТИВИРАНЕ); ADC1_StartConversion (); докато (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); резултат = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Както виждате, можем да предадем осем параметъра на тази функция и това определя как е конфигуриран ADC. В нашия библиотечен код по-горе сме задали режим на преобразуване на непрекъснат и след това получаваме номера на канала, предаден на параметър. И тогава трябва да зададем честотата на процесора на нашия контролер, по подразбиране (ако не сте свързали външен кристал), вашият STM8S ще работи с 16Mhz вътрешен генератор. Така че споменахме “ ADC1_PRESSEL_FCPU_D18 ” като стойност за предварително скалиране . Вътре в тази функция използваме други методи, дефинирани от заглавния файл SPL stm8s_adc1.h . Започваме с Де-инициализиране на ADC щифтовете и след това ADC1_Init (), за да инициализираме ADC периферната. Дефиницията на тази функция от ръководството за потребителя на SPL е показана по-долу.
След това задаваме външния задействащ механизъм с помощта на таймер и деактивираме външния задействащ механизъм, тъй като няма да го използваме тук. И тогава имаме настройката за подравняване вдясно и последните два параметъра се използват за задаване на спусъка на Schmitt, но ние ще го деактивираме за този урок. Така че, за да го кажем накратко, ще настроим ADC да работи в режим на непрекъснато преобразуване на необходимия ADC щифт с деактивиран външен спусък и спусък на Schmitt. Можете да проверите листа с данни, ако имате нужда от повече информация за това как да използвате външния спусък или опцията за задействане на Schmitt, няма да го обсъждаме в този урок.
Програма STM8S за четене на аналогово напрежение и дисплей на LCD
Пълният код, използван във файла main.c, може да бъде намерен в долната част на тази страница. След добавяне на необходимите заглавни файлове и изходни файлове, трябва да можете директно да компилирате основния файл. Обяснението на кода в основния файл е както следва. Няма да обяснявам LCD програмата STM8S, тъй като вече обсъдихме това в предишния урок.
Целта на кода ще бъде да прочете стойностите на ADC от два извода и да ги преобразува в стойност на напрежението. Също така ще покажем на дисплея както ADC стойност, така и стойност на напрежението. И така, използвал съм функция, наречена LCD_Print Var, която приема променлива в цяло число формат и я преобразува в символ, така че да я покаже на LCD. Използвахме опростените модули (%) и операторите за разделяне (/), за да получим всяка цифра от променливата и да поставим променливи като d1, d2, d3 и d4, както е показано по-долу. След това можем да използваме функцията LCD_Print_Char, за да покажем тези символи на LCD.
void LCD_Print_Var (int var) {char d4, d3, d2, d1; d4 = var% 10 + '0'; d3 = (var / 10)% 10 + '0'; d2 = (var / 100)% 10 + '0'; d1 = (var / 1000) + '0'; Lcd_Print_Char (d1); Lcd_Print_Char (d2); Lcd_Print_Char (d3); Lcd_Print_Char (d4); }
След това под основната функция имаме декларирани четири променливи. Две от тях се използват за запазване на стойността на ADC (0 до 1024), а другите две се използват за получаване на действителната стойност на напрежението.
неподписан int ADC_value_1 = 0; неподписан int ADC_value_2 = 0; int ADC_voltage_1 = 0; int ADC_voltage_2 = 0;
След това трябва да подготвим GPIO щифтовете и конфигурацията на часовника за отчитане на аналоговото напрежение. Тук ще четем аналоговото напрежение от щифтове AIN2 и AIN6, които са съответно PC4 и PD6. Трябва да дефинираме тези щифтове в плаващо състояние, както е показано по-долу. Също така ще активираме периферния часовник за ADC.
CLK_PeripheralClockConfig (CLK_PERIPHERAL_ADC, ENABLE); // Активиране на периферния часовник за ADC GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT); GPIO_Init (GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_IT);
Сега, когато щифтовете са готови, трябва да влезем в безкрайния цикъл while, за да прочетем аналоговото напрежение. Тъй като разполагаме със заглавния файл, можем лесно да прочетем аналоговото напрежение от щифтове AIN2 и AIN 6, като използваме долните редове.
ADC_value_1 = ADC_Read (AIN2); ADC_value_2 = ADC_Read (AIN6);
Следващата стъпка е да преобразувате това ADC отчитане (0 до 1023) в аналогово напрежение. По този начин можем да покажем точната стойност на напрежението, дадена на щифтовете AIN2 и AIN6. Формулите за изчисляване на аналоговото напрежение могат да бъдат дадени от-
Аналогово напрежение = ADC четене * (3300/1023)
В нашия случай на контролери STM8S103F3 имаме ADC с 10-битова разделителна способност, така че сме използвали 1023 (2 ^ 10) . Също така на нашата разработка се захранва контролерът с 3.3V, което е 3300, така че ние разделихме 3300 на 1023 в горните формули. Приблизително 3300/1023 ще ни даде 3.226, така че в нашата програма имаме следните редове за измерване на действителното ADC напрежение, използвайки ADC напрежението.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) конвертираме ADC стойност 1 в 0 в 3300mV ADC_voltage_2 = ADC_value_2 * (3.226); // конвертираме ADC стойност 1 в 0 в 3300mV
Останалата част от кода се използва само за показване на тези четири стойности на LCD екрана. Също така имаме закъснение от 500ms, така че LCD да се актуализира на всеки 500mS. Можете да намалите това допълнително, ако имате нужда от по-бързи актуализации.
Четене на аналогово напрежение от два потенциометъра с помощта на STM8S
Компилирайте кода и го качете на вашия съвет за разработка. Ако получите грешка при компилирането, уверете се, че сте добавили всички заглавни файлове и изходни файлове, както беше обсъдено по-рано. След като кодът бъде качен, трябва да видите малко приветствено съобщение с надпис „ADC на STM8S“ и след това да видите екрана по-долу.
Стойностите D1 и D2 показват стойността на ADC от пина Ain2 и AIN6 съответно. От дясната страна имаме и показаните еквивалентни стойности на напрежението. Тази стойност трябва да бъде равна на напрежението, появяващо се съответно на щифтове AIN2 и AIN6. Можем да проверим за същото с помощта на мултицет, можем също така да варираме потенциометрите, за да проверим дали стойността на напрежението също се променя съответно.
Пълна работа може да се намери и във видеото по-долу. Надявам се, че ви е харесал урокът и сте научили нещо полезно, ако имате въпроси, оставете ги в раздела за коментари по-долу. Можете също да използвате нашите форуми, за да започнете дискусия или да публикувате други технически въпроси.