- Необхідні матеріали
- АЦП на STM8S103F3P6
- Принципова схема для зчитування значень АЦП на STM8S та дисплея на РК-дисплеї
- Бібліотека ADC для STM8S103F3P6
- Програма STM8S для зчитування аналогової напруги та відображення на РК-дисплеї
- Зчитування аналогової напруги з двох потенціометрів за допомогою STM8S
Якщо ви звичайний читач, який дотримується наших підручників з мікроконтролера STM8S, ви б знали, що в нашому останньому підручнику ми дізналися, як підключити РК-дисплей 16x2 до STM8. Тепер, продовжуючи роботу з цим посібником, ми дізнаємось, як використовувати функцію АЦП на нашому мікроконтролері STM8S103F3P6. АЦП - це дуже корисна периферія на мікроконтролері, яка часто використовується вбудованими програмістами для вимірювання одиниць, які постійно змінюються, таких як змінна напруги, струму, температури, вологості тощо.
Як ми знаємо, «Ми живемо в аналоговому світі з цифровими пристроями», тобто все навколо нас, як швидкість вітру, інтенсивність світла, температура, і все, з чим ми маємо справу, такі як швидкість, швидкість, тиск тощо мають аналоговий характер. Але наші мікроконтролери та мікропроцесори є цифровими пристроями, і вони не зможуть вимірювати ці параметри без важливої периферії, яка називається аналого-цифрові перетворювачі (АЦП). Тож у цій статті давайте дізнаємося, як використовувати ADC на мікроконтролері STM8S із компілятором COMIC C.
Необхідні матеріали
У цій статті ми прочитаємо два аналогових значення напруги з двох потенціометрів та відобразимо їх значення АЦП на РК-дисплеї 16x2. Для цього нам знадобляться такі компоненти.
- STM8S103F3P6 Дошка розробки
- Програміст ST-Link V2
- РК-дисплей 16x2
- Потенціометри
- Підключення проводів
- 1k резистор
АЦП на STM8S103F3P6
Існує багато типів АЦП, і кожен мікроконтролер має свої власні технічні характеристики. На STM8S103F3P6 ми маємо АЦП з 5-канальним та 10-бітовим дозволом; з 10-бітовою роздільною здатністю ми зможемо виміряти цифрове значення від 0 до 1024, а 5-канальний АЦП вказує, що у нас є 5 контактів на мікроконтролері, який може підтримувати АЦП, ці 5 контактів виділено на малюнку нижче.
Як бачите, всі ці п'ять виводів (AIN2, AIN3, AIN4, AIN5 та AIN6) мультиплексуються з іншими периферійними пристроями, тобто, крім того, що вони діють лише як висновки АЦП, ці висновки також можуть використовуватися для здійснення інших комунікацій, наприклад, висновки 2 та 3 (AIN5 та AIN 6) можуть бути використані не тільки для АЦП, але також можуть бути використані для послідовного зв'язку та функцій GPIO. Зверніть увагу, що використовувати один і той же штифт для всіх трьох цілей буде неможливо, тому, якщо ми використовуємо ці два штифти для АЦП, то ми не зможемо здійснювати послідовний зв’язок. Інші важливі характеристики АЦП для STM8S103P36 можна знайти в таблиці нижче, взятій з таблиці даних.
У наведеній вище таблиці Vdd представляє робочу напругу, а Vss - землю. Отже, у нашому випадку на нашій платі розробки ми маємо мікроконтролер, що працює на 3,3 В, ви можете перевірити схему плати розробки з самого початку за допомогою підручника STM8S. З робочою напругою в 3,3 В, тактову частоту АЦП можна встановити від 1 до 4 МГц, а діапазон напруги перетворення - від 0 до 3,3 В. Це означає, що наш 10-розрядний АЦП зчитуватиме 0, коли надано 0V (Vss), і буде читати максимум 1024, коли надається 3.3V (Vdd). Ми можемо легко змінити це значення 0-5 В, змінивши робочу напругу блоку керування, якщо потрібно.
Принципова схема для зчитування значень АЦП на STM8S та дисплея на РК-дисплеї
Повна принципова схема, використана в цьому проекті, наведена нижче, вона дуже схожа на підручник з РК-дисплея STM8S, який ми обговорювали раніше.
Як бачите, єдиними додатковими компонентами, крім РК-дисплея, є два потенціометри POT_1 і POT_2 . Ці горщики підключені до портів PC4 та PD6, які є виводами ANI2 та ANI6, як було обговорено на зображенні розпіновки раніше.
Потенціометри підключені таким чином, що коли ми його змінюємо, ми отримаємо 0-5 В на наших аналогових виводах. Ми запрограмуємо наш контролер для зчитування цієї аналогової напруги в цифровому значенні (від 0 до 1024) та відображення її на РК-екрані. Потім ми також обчислимо еквівалентне значення напруги та відобразимо його на РК-дисплеї, пам’ятайте, що наш контролер живиться від 3,3 В, тому, навіть якщо ми подаємо 5 В на штифт АЦП, він зможе читати лише від 0 до 3,3 В.
Після завершення підключення моє обладнання виглядає так, як показано нижче. Ви можете побачити два потенціометри праворуч і програміст ST-link зліва.
Бібліотека ADC для STM8S103F3P6
Для програмування функціональних можливостей ADC на STM8S ми будемо використовувати компілятор Cosmic C разом із бібліотеками SPL. Але для полегшення процесів я створив ще один файл заголовка, який можна знайти на GitHub за посиланням нижче.
Бібліотека АЦП для STM8S103F3P6
Якщо ви знаєте, що робите, ви можете створити файл заголовка, використовуючи наведений вище код, і додати його до каталогу “включити файли” на сторінці проекту. Ще слідкуйте за початком роботи з підручником STM8S, щоб знати, як налаштувати середовище програмування та компілятор. Після того, як налаштування буде готове, ваша IDE повинна мати наступні файли заголовків, принаймні ті, що оточені червоним кольором.
Наведений вище файл заголовка складається з функції, яка називається ADC_Read () . Цю функцію можна викликати у вашій основній програмі, щоб отримати значення АЦП на будь-якому штифті. Наприклад, ADC_Read (AN2) поверне значення ADC на штифт AN2 як результат. Функція показана нижче.
unsigned int ADC_Read (ADC_CHANNEL_TypeDef ADC_Channel_Number) {unsigned int result = 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 (ENABLE); ADC1_StartConversion (); в той час як (ADC1_GetFlagStatus (ADC1_FLAG_EOC) == FALSE); результат = ADC1_GetConversionValue (); ADC1_ClearFlag (ADC1_FLAG_EOC); ADC1_DeInit ();
Як бачите, ми можемо передати цій функції вісім параметрів, і це визначає, як налаштовано АЦП. У нашому коді бібліотеки вище ми встановили режим перетворення на безперервний, а потім отримуємо номер каналу, переданий параметр. А потім ми повинні встановити частоту процесора нашого контролера, за замовчуванням (якщо ви не підключили зовнішній кристал), ваш STM8S буде працювати з внутрішнім генератором 16 МГц. Отже, ми згадали “ ADC1_PRESSEL_FCPU_D18 ” як значення попереднього масштабування. Усередині цієї функції ми використовуємо інші методи, визначені файлом заголовка SPL stm8s_adc1.h . Ми починаємо з деініціалізації контактів АЦП, а потім ADC1_Init () для ініціалізації периферії АЦП. Визначення цієї функції з посібника користувача SPL показано нижче.
Далі ми встановлюємо зовнішній тригер за допомогою таймера і відключаємо зовнішній тригер, оскільки ми не будемо його тут використовувати. І тоді ми маємо вирівнювання, встановлене праворуч, і останні два параметри використовуються для встановлення тригера Шмітта, але ми будемо відключати його для цього підручника. Отже, якщо коротко, то ми налаштуємо АЦП у режимі безперервного перетворення на необхідний штифт АЦП із зовнішнім тригером та тригером Шмітта відключеними. Ви можете перевірити таблицю даних, якщо вам потрібна додаткова інформація про те, як використовувати зовнішній тригер або опцію тригера Шмітта, ми не будемо обговорювати це в цьому посібнику.
Програма STM8S для зчитування аналогової напруги та відображення на РК-дисплеї
Повний код, що використовується у файлі main.c, можна знайти внизу цієї сторінки. Після додавання необхідних файлів заголовків та вихідних файлів ви зможете безпосередньо скомпілювати основний файл. Пояснення коду в основному файлі таке. Я не буду пояснювати програму ЖК STM8S, оскільки ми вже обговорювали це в попередньому уроці.
Призначення коду буде зчитувати значення АЦП з двох висновків і перетворювати їх у значення напруги. На РК-дисплеї ми також відображатимемо як значення АЦП, так і значення напруги. Отже, я використав функцію під назвою LCD_Print Var, яка приймає змінну у цілочисельному форматі та перетворює її в символ для відображення на РК-дисплеї. Ми використали прості оператори модуля (%) та поділу (/), щоб отримати кожну цифру зі змінної та ввести такі змінні, як d1, d2, d3 та d4, як показано нижче. Тоді ми можемо використовувати функцію LCD_Print_Char для відображення цих символів на РК-дисплеї.
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); }
Далі під головною функцією ми маємо чотири оголошені змінні. Два з них використовуються для збереження значення АЦП (від 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 відповідно. Ми повинні визначити ці штифти в плаваючому стані, як показано нижче. Ми також увімкнемо периферійний годинник для АЦП.
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);
Наступним кроком є перетворення цього показання АЦП (від 0 до 1023) в аналогову напругу. Таким чином, ми можемо відобразити точне значення напруги, вказане на виводах AIN2 та AIN6. Формули для розрахунку аналогової напруги можуть бути наведені за допомогою
Аналогова напруга = Зчитування АЦП * (3300/1023)
У нашому випадку на контролерах STM8S103F3 ми маємо АЦП з 10-бітовою роздільною здатністю, тому ми використали 1023 (2 ^ 10) . Крім того, на наших розробницьких потужностях контролер з 3,3 В, що становить 3300, тому ми розділили 3300 на 1023 у наведених вище формулах. Приблизно 3300/1023 дасть нам 3,226, тому в нашій програмі у нас є такі рядки для вимірювання фактичної напруги АЦП за допомогою напруги АЦП.
ADC_voltage_1 = ADC_value_1 * (3.226); // (3300/1023 = ~ 3.226) перетворити значення АЦП 1 на 0 до 3300 мВ ADC_voltage_2 = ADC_value_2 * (3.226); // перетворюємо значення АЦП 1 в 0 в 3300 мВ
Решта частини коду використовується лише для відображення цих чотирьох значень на РК-екрані. У нас також є затримка 500 мс, щоб РК-дисплей оновлювався кожні 500 мС. Ви можете зменшити це ще більше, якщо вам потрібні швидші оновлення.
Зчитування аналогової напруги з двох потенціометрів за допомогою STM8S
Складіть код і завантажте його на свою дошку розробників. Якщо у вас виникає помилка компіляції, переконайтесь, що ви додали всі файли заголовків та вихідні файли, як обговорювалося раніше. Після завантаження коду ви побачите невелике привітальне повідомлення з написом «ADC на STM8S», а потім ви побачите екран нижче.
Значення D1 та D2 позначають значення АЦП з контактів Ain2 та AIN6 відповідно. На правій стороні ми також відображаємо еквівалентні значення напруги. Це значення повинно дорівнювати напрузі, що з'являється на висновках AIN2 та AIN6 відповідно. Ми можемо перевірити те саме за допомогою мультиметра, ми також можемо змінювати потенціометри, щоб перевірити, чи змінюється відповідно і значення напруги.
Повну роботу також можна знайти у відео нижче. Сподіваюся, вам сподобався підручник і ви дізналися щось корисне. Якщо у вас виникли запитання, залиште їх у розділі коментарів нижче. Ви також можете використовувати наші форуми, щоб розпочати дискусію або опублікувати інші технічні питання.