- Порівняння АЦП в Arduino та STM32F103C8
- АЦП в STM32
- Як аналоговий сигнал перетворюється в цифровий формат
- Шпильки ADC в STM32F103C8T6
- Потрібні компоненти
- Принципова схема та пояснення
- Програмування STM32 для зчитування значень АЦП
Однією із загальних особливостей, яка використовується майже в кожному вбудованому додатку, є модуль АЦП (аналого-цифровий перетворювач). Ці аналого-цифрові перетворювачі можуть зчитувати напругу з аналогових датчиків, таких як датчик температури, датчик нахилу, датчик струму, датчик Flex та багато іншого. Тож у цьому підручнику ми дізнаємось, як використовувати АЦП в STM32F103C8 для зчитування аналогових напруг за допомогою IDE Energia. Ми підключимо невеликий потенціометр до плати STM32 Blue Pill і подамо різну напругу на аналоговий штифт, зчитаємо напругу та відобразимо її на РК-екрані 16x2.
Порівняння АЦП в Arduino та STM32F103C8
На платі Arduino він містить 6-канальний (8 каналів на Mini та Nano, 16 на Mega), 10-бітний АЦП з діапазоном вхідної напруги 0V – 5V. Це означає, що він буде відображати вхідні напруги від 0 до 5 вольт у цілі значення від 0 до 1023. Тепер у випадку STM32F103C8 ми маємо 10 каналів, 12-бітний АЦП з діапазоном входів 0В -3,3В. Він відобразить вхідні напруги від 0 до 3,3 вольт у цілі значення від 0 до 4095.
АЦП в STM32
АЦП, вбудований в мікроконтролери STM32, використовує принцип SAR (послідовний регістр наближення), за допомогою якого перетворення виконується в кілька етапів. Кількість кроків перетворення дорівнює кількості бітів у перетворювачі АЦП. Кожен крок керується годинником АЦП. Кожен тактовий сигнал АЦП видає один біт від результату до виводу. Внутрішня конструкція АЦП базується на техніці з комутованим конденсатором. Якщо ви новачок у STM32, ознайомтеся з нашим посібником „Початок роботи з STM32”.
12-бітна роздільна здатність
Цей АЦП є 10-канальним 12-бітовим АЦП. Тут термін 10-канальний означає, що існує 10 висновків АЦП, за допомогою яких ми можемо вимірювати аналогову напругу. Термін 12-біт передбачає роздільну здатність АЦП. 12-біт означає 2 до ступеня десяти (2 12), що дорівнює 4096. Це кількість кроків вибірки для нашого АЦП, тому діапазон значень АЦП буде від 0 до 4095. Значення зросте від 0 4095 на основі значення напруги на крок, яке можна обчислити за формулою
НАПРУГА / КРОК = РЕФЕРЕНТНА НАПРУГА / 4096 = (3,3 / 4096 = 8,056 мВ) на одиницю.
Як аналоговий сигнал перетворюється в цифровий формат
Оскільки комп’ютери зберігають і обробляють лише двійкові / цифрові значення (1 і 0). Отже, аналогові сигнали, такі як вихідний сигнал датчика у вольтах, повинні бути перетворені в цифрові значення для обробки, і перетворення повинно бути точним.. Це збережене аналогове значення (0-3,3 В) перетворюється у цілі значення (0-4096) за формулою нижче:
INPUT VOLTAGE = (значення АЦП / роздільна здатність АЦП) * Опорне напруга
Роздільна здатність = 4096
Посилання = 3,3 В
Шпильки ADC в STM32F103C8T6
У STM32 є 10 аналогових контактів від PA0 до PB1.
Також перевірте, як використовувати АЦП в інших мікроконтролерах:
- Як використовувати АЦП в Arduino Uno?
- Зв'язок ADC0808 з мікроконтролером 8051
- Використання модуля АЦП мікроконтролера PIC
- Підручник з ADC Raspberry Pi
- Як використовувати АЦП в MSP430G2 - Вимірювання аналогової напруги
Потрібні компоненти
- STM32F103C8
- РК-дисплей 16 * 2
- Потенціометр 100k
- Макет
- Підключення проводів
Принципова схема та пояснення
Схема підключення РК-дисплея 16 * 2 та аналогового входу до плати STM32F103C8T6 наведена нижче.
Підключення, які виконуються для РК-дисплея, наведені нижче:
ЖК-номер |
Назва PIN-коду РК-дисплея |
Ім'я контакту STM32 |
1 |
Земля (Gnd) |
Земля (G) |
2 |
VCC |
5 В |
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) |
ПК13 |
14 |
Біт даних 7 (DB7) |
ПК14 |
15 |
Позитивний світлодіод |
5 В |
16 |
Світлодіод негативний |
Земля (G) |
З'єднання здійснюються відповідно до наведеної вище таблиці. У схемі є два потенціометри, перший використовується для дільника напруги, який може використовуватися для зміни напруги та забезпечення аналогового входу до STM32. Лівий штир цього потенціометра отримує вхідну позитивну напругу від STM32 (3,3 В), а правий штифт підключений до землі, центральний штифт потенціометра підключений до аналогового вхідного штифта (PA7) STM32. Інший потенціометр використовується для зміни контрастності РК-дисплея. Джерело живлення для STM32 забезпечується за допомогою USB-джерела живлення від ПК або ноутбука.
Програмування STM32 для зчитування значень АЦП
У нашому попередньому підручнику ми дізналися про програмування плати STM32F103C8T6 за допомогою порту USB. Тож нам зараз не потрібен програміст FTDI. Просто підключіть його до ПК через USB-порт STM32 і почніть програмувати за допомогою ARDUINO IDE. Програмувати ваш STM32 в ARDUINO IDE для зчитування аналогової напруги дуже просто. Це те саме, що плата arduino. Немає необхідності міняти штифти перемичок STM32.
У цій програмі зчитується аналогове значення та обчислюється напруга з цим значенням, а потім відображаються як РК-аналогові, так і цифрові значення.
Спочатку визначте ЖК-шпильки. Вони визначають, до якого контакту STM32 підключені РК-висновки. Ви можете змінити відповідно до ваших вимог.
const int rs = PB11, en = PB10, d4 = PB0, d5 = PB1, d6 = PC13, d7 = PC14; // згадуємо імена контактів, до яких підключений РК
Далі ми включаємо файл заголовка для РК-дисплея. Це викликає бібліотеку, яка містить код, як STM32 повинен взаємодіяти з РК-дисплеєм. Також переконайтеся, що функція Liquid Crystal викликається з назвами контактів, які ми щойно визначили вище.
#включати
Усередині функції setup () ми просто дамо вступне повідомлення для відображення на РК-екрані. Ви можете дізнатись про взаємодію РК із STM32.
lcd.begin (16, 2); // Ми використовуємо LCD * 16 * 2 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. Ці значення називаються значеннями АЦП, щоб отримати це значення АЦП просто використовуйте наступний рядок
int val = analogRead (A7); // зчитування значення АЦП з виводу PA 7
Тут функція analogRead () використовується для зчитування аналогового значення виводу. Нарешті ми зберігаємо це значення у змінній, яка називається “ val ”. Тип цієї змінної - ціле число, оскільки ми отримаємо лише значення в діапазоні від 0 до 4096, які будуть збережені в цій змінній.
Наступним кроком буде розрахунок значення напруги за значенням АЦП. Для цього ми маємо наступні формули
Напруга = (значення АЦП / роздільна здатність АЦП) * Еталонний напруга e
У нашому випадку ми вже знаємо, що роздільна здатність АЦП нашого мікроконтролера становить 4096. Значення АЦП також міститься в попередньому рядку і зберігає змінну, звану val. Опорна напруга дорівнює напрузі, при якому мікроконтролер працює. Коли плата STM32 харчування через кабель USB, то робоча напруга 3.3V. Ви також можете виміряти робочу напругу, використовуючи мультиметр через Vcc і штифт заземлення на платі. Отже, наведена вище формула вписується в наш випадок, як показано нижче
плаваюча напруга = (поплавок (val) / 4096) * 3,3; // формули для перетворення значення АЦП у напругу e
Вас може сплутати рядок float (val). Це використовується для перетворення змінної “val” із типу даних int у тип даних “float”. Це перетворення потрібно, оскільки лише якщо ми отримаємо результат val / 4096 у float, ми можемо помножити його на 3.3. Якщо значення отримується у цілому числі, воно завжди буде 0, а результат також буде нульовим. Після того, як ми розрахували значення АЦП і напругу, залишилось лише відобразити результат на РК-екрані, що можна зробити, використовуючи наступні рядки
lcd.setCursor (0, 0); // встановити курсор у стовпець 0, рядок 0 lcd.print ("ADC Val:"); lcd.print (val); // Відображення значення АЦП lcd.setCursor (0, 1); // встановити курсор у стовпець 0, рядок 1 lcd.print ("Напруга:"); lcd.print (напруга); // Відображення напруги
Повний код та демонстраційне відео наведено нижче.