- Сравняване на ADC в Arduino и STM32F103C8
- ADC в STM32
- Как се преобразува аналогов сигнал в цифров формат
- ADC щифтове в STM32F103C8T6
- Необходими компоненти
- Електрическа схема и обяснения
- Програмиране на STM32 за четене на ADC стойности
Една обща характеристика, която се използва в почти всяко вградено приложение, е модулът ADC (аналогов към цифров конвертор). Тези аналогово-цифрови преобразуватели могат да отчитат напрежение от аналогови сензори като сензор за температура, сензор за наклон, сензор за ток, Flex сензор и много други. Така че в този урок ще научим как да използваме ADC в STM32F103C8 за четене на аналогови напрежения с помощта на Energia IDE. Ще свържем малък потенциометър към платката STM32 Blue Pill и ще подадем различно напрежение към аналогов щифт, ще прочетем напрежението и ще го покажем на LCD екрана 16x2.
Сравняване на ADC в Arduino и STM32F103C8
В платката Arduino той съдържа 6 канала (8 канала на Mini и Nano, 16 на Mega), 10-битов ADC с диапазон на входното напрежение 0V – 5V. Това означава, че ще преобразува входните напрежения между 0 и 5 волта в целочислени стойности между 0 и 1023. Сега в случая на STM32F103C8 имаме 10 канала, 12-битов ADC с входен обхват 0V -3.3V. Той ще картографира входните напрежения между 0 и 3.3 волта в целочислени стойности между 0 и 4095.
ADC в STM32
ADC, вграден в микроконтролери STM32, използва принципа SAR (регистър на последователно приближение), чрез който преобразуването се извършва в няколко стъпки. Броят на стъпките на преобразуване е равен на броя на битовете в ADC конвертора. Всяка стъпка се управлява от ADC часовника. Всеки ADC часовник генерира един бит от резултата до изхода. Вътрешният дизайн на ADC се основава на техниката на превключен кондензатор. Ако не сте запознати със STM32, разгледайте нашия урок Първи стъпки със STM32.
12-битова резолюция
Този ADC е 10-канален 12-битов ADC. Тук терминът 10 канал предполага, че има 10 ADC щифта, чрез които можем да измерим аналоговото напрежение. Терминът 12-битов предполага разделителната способност на ADC. 12-битово означава 2 в степен на десет (2 12), което е 4096. Това е броят на примерните стъпки за нашия ADC, така че диапазонът на нашите ADC стойности ще бъде от 0 до 4095. Стойността ще се увеличи от 0 до 4095 въз основа на стойността на напрежението на стъпка, която може да бъде изчислена по формула
НАПРЕЖЕНИЕ / СТЪПКА = РЕФЕРЕНТНО НАПРЕЖЕНИЕ / 4096 = (3,3 / 4096 = 8,056mV) за единица.
Как се преобразува аналогов сигнал в цифров формат
Тъй като компютрите съхраняват и обработват само двоични / цифрови стойности (1 и 0). Така че аналоговите сигнали като изхода на сензора във волта трябва да бъдат преобразувани в цифрови стойности за обработка и преобразуването трябва да бъде точно. Когато на аналоговите входове се подава входно аналогово напрежение на STM32, аналоговата стойност се чете и съхранява в цяла променлива. Тази съхранена аналогова стойност (0-3.3V) се преобразува в цели числа (0-4096), използвайки формулата по-долу:
INPUT VOLTAGE = (ADC Value / ADC Resolution) * Референтно напрежение
Резолюция = 4096
Референтен = 3.3V
ADC щифтове в STM32F103C8T6
В STM32 има 10 аналогови щифта от PA0 до PB1.
Също така проверете как да използвате ADC в други микроконтролери:
- Как да използвам ADC в Arduino Uno?
- Връзка ADC0808 с 8051 микроконтролер
- Използване на модул ADC на микроконтролера PIC
- Raspberry Pi ADC Урок
- Как да използвам ADC в MSP430G2 - Измерване на аналогово напрежение
Необходими компоненти
- STM32F103C8
- LCD 16 * 2
- Потенциометър 100k
- Макет
- Свързващи проводници
Електрическа схема и обяснения
Схемата за свързване на 16 * 2 LCD и аналогов вход към платка STM32F103C8T6 е показана по-долу.
Връзките, които се правят за LCD са дадени по-долу:
LCD щифт № |
Име на LCD щифт |
Име на щифта STM32 |
1 |
Земя (Gnd) |
Земя (G) |
2 |
VCC |
5V |
3 |
VEE |
ПИН от центъра на потенциометъра |
4 |
Избор на регистър (RS) |
PB11 |
5 |
Четене / запис (RW) |
Земя (G) |
6 |
Активиране (EN) |
PB10 |
7 |
Бит за данни 0 (DB0) |
Без връзка (NC) |
8 |
Бит за данни 1 (DB1) |
Без връзка (NC) |
9 |
Бит за данни 2 (DB2) |
Без връзка (NC) |
10 |
Бит за данни 3 (DB3) |
Без връзка (NC) |
11. |
Бит за данни 4 (DB4) |
PB0 |
12 |
Бит за данни 5 (DB5) |
PB1 |
13 |
Бит за данни 6 (DB6) |
PC13 |
14. |
Бит за данни 7 (DB7) |
PC14 |
15 |
LED Положителен |
5V |
16. |
LED отрицателен |
Земя (G) |
Връзките се извършват съгласно дадената по-горе таблица. В схемата има два потенциометра, първият се използва за делител на напрежението, който може да се използва за промяна на напрежението и осигуряване на аналогов вход към STM32. Лявият щифт на този потенциометър получава входно положително напрежение от STM32 (3.3V) и десният щифт е свързан към земята, централният щифт на потенциометъра е свързан към аналогов входен щифт (PA7) на STM32. Другият потенциометър се използва за промяна на контраста на LCD дисплея. Източникът на захранване за STM32 се осигурява чрез USB захранване от компютър или лаптоп.
Програмиране на STM32 за четене на ADC стойности
В нашия предишен урок научихме за програмиране на платка STM32F103C8T6 с помощта на USB порт. Така че сега нямаме нужда от програмист за FTDI. Просто го свържете към компютър чрез USB порт на STM32 и започнете да програмирате с ARDUINO IDE. Програмирането на вашия STM32 в ARDUINO IDE за четене на аналогово напрежение е много просто. Същото е като ардуино дъската. Няма нужда от смяна на джъмперните щифтове на STM32.
В тази програма ще прочете аналоговата стойност и ще изчисли напрежението с тази стойност и след това ще покаже аналогови и цифрови стойности на LCD екрана.
Първо дефинирайте LCD щифтове. Те определят към кой щифт на STM32 са свързани LCD щифтовете. Можете да модифицирате според вашите изисквания.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // споменаваме имената на щифтовете, към които е свързан LCD
След това включваме заглавния файл за LCD дисплея. Това извиква библиотеката, която съдържа кода за това как STM32 трябва да комуникира с LCD. Също така се уверете, че функцията Liquid Crystal е извикана с имената на щифтове, които току-що дефинирахме по-горе.
#include
Във функцията за настройка () , ние просто бихме предоставили встъпително съобщение, което да се покаже на LCD екрана. Можете да научите за свързването на LCD със STM32.
lcd.begin (16, 2); // Използваме 16 * 2 LCD lcd.clear (); // изчистване на екрана lcd.setCursor (0, 0); // В първия ред първа колона lcd.prin t ("CIRCUITDIGEST"); // Отпечатваме този lcd.setCursor (0, 1); // На втори ред първи колона n lcd.print ("STM32F103C8"); // Печат на закъснение (2000); // чакаме две секунди lcd.clear (); // изчистване на екрана lcd.setCursor (0, 0); // В първия ред първа колона lcd.print ("USING ADC IN"); // Отпечатваме този lcd.setCursor (0,1); // В първия ред на първата колона lcd.print ("STM32F103C8"); // Отпечатайте това закъснение (2000); // чакаме две секунди lcd.clear (); // Изчистване на екрана
И накрая, вътре в нашата функция за безкраен контур () , ние започваме да четем аналоговото напрежение, подавано към щифта PA7 от потенциометъра. Както вече обсъждахме, микроконтролерът е цифрово устройство и не може да отчита директно нивото на напрежението. Използвайки техниката на SAR, нивото на напрежението се преобразува от 0 до 4096. Тези стойности се наричат ADC стойности, за да получите тази стойност ADC, просто използвайте следния ред
int val = analogRead (A7); // отчитаме ADC стойността от щифт PA 7
Тук функцията analogRead () се използва за отчитане на аналоговата стойност на щифта. Накрая запазваме тази стойност в променлива, наречена „ val “. Типът на тази променлива е цяло число, защото ще получим само стойности, вариращи от 0 до 4096, които ще се съхраняват в тази променлива.
Следващата стъпка ще бъде да се изчисли стойността на напрежението от стойността на ADC. За целта имаме следните формули
Напрежение = (ADC стойност / разделителна способност на ADC) * Референтно напрежение e
В нашия случай вече знаем, че разделителната способност на ADC на нашия микроконтролер е 4096. Стойността на ADC също се намира в предишния ред и съхранява променливата, наречена val. В референтната напрежение е равно на напрежението в който оперира микроконтролер. Когато платката STM32 се захранва чрез USB кабел, работното напрежение е 3.3V. Можете също така да измерите работното напрежение, като използвате мултицет през Vcc и заземен щифт на платката. Така че горната формула се вписва в нашия случай, както е показано по-долу
плаващо напрежение = (плаващо (val) / 4096) * 3.3; // формули за преобразуване на стойността на ADC във voltag e
Може да бъдете объркани с линията float (val). Това се използва за преобразуване на променливата „val“ от тип данни int в тип „float“. Това преобразуване е необходимо, защото само ако получим резултата от val / 4096 в float, можем да го умножим 3.3. Ако стойността е получена в цяло число, тя винаги ще бъде 0 и резултатът също ще бъде нула. След като изчислим ADC стойността и напрежението, остава само да покажем резултата на LCD екрана, което може да се направи, като се използват следните редове
lcd.setCursor (0, 0); // задаваме курсора на колона 0, ред 0 lcd.print ("ADC Val:"); lcd.print (val); // Показва ADC стойност lcd.setCursor (0, 1); // задаваме курсора на колона 0, ред 1 lcd.print ("Voltage:"); lcd.print (напрежение); // Напрежение на дисплея
Пълният код и демонстрационното видео е дадено по-долу.