Трьохканальний UART АЦП на ATtiny13



Привіт хабр. Я вже давно виношував зробити UART Аналогового-Цифрового Перетворювача на ATtiny13, навіщо робити саме на ATtiny13 адже є, наприклад, ATmega8 має аж 6 (для DIP корпусу) портів на яких за допомогою мультиплексора, можна проводити вимірювання АЦП?
Причин кілька:

— ATtiny13 коштує дешевше;
— У ATtiny13 більш оптимально використовуються ресурси мікроконтролера;
— Розміри;
— Енергоспоживання;
— Просто мені так захотілося.

Звичайно на мої аргументи можна знайти безліч контраргументів, наприклад ATmega8 при використанні V-USB може перетвориться на плату вводу/виводу якої не потрібен перехідник з UART на USB, правда крім останнього, і з цим мабуть не посперечаєшся.

Поставив собі за мету отримати досвід роботи із програмний UART'ом саме на ATtiny13, а досвід як кажуть, безцінний. По-любому нагоді для майбутніх проектів.
Ну гаразд, не буду тягнути і покажу, як працює в залозі:



Пару слів за схемою, до речі, ось вона:

Схема Proteus

Скажу відразу, що не погано б приділити увагу фільтру живлення, у мене це два конденсатора C1 — бажано «кераміка» і як можна ближче до ніжок МК, ну і C2 — електролітичний, другий можна поставити на 100 мкФ але у мене такого не виявилося під рукою, знайшов на 470 мкФ 10 Ст. Так само було б не погано по конденсатору на кожен порт АЦП, і як можна ближче до МК. R1 не принциповий, але за правилами «хорошого тону» — повинен бути присутнім.

Дані, як Ви могли бачити, приходять у форматі 1023,666,10, ну хоч бери й зберігай у форматі CSV на компі або іншому пристрої, яке буде приймати ці дані.
До речі приймає дані в моєму випадку недорогий перетворювач USB — UART заснований на мікросхемі PL2303HX. Пробував живити ATtiny13 від бортових 3.3 що на перетворювачі, за мультиметру до речі 3.4, працює, я спочатку думав що зміна харчування на таке високе значення якось позначиться на відправку даних, я десь читав страшилку мовляв, нагрій на пару градусів, остуди і все, прощай адекватні дані… Нічого подібного, охолоджував льодом, злегка грів запальничкою(без фанатизму) — все працює нормально, втрат не спостерігав.

Пару слів про код — код написаний в середовищі BASCOM-AVR на Basic'е, ось пропоную Вашій увазі мій код на написання я витратив близько чим 4-5 годин(так як я раніше не зустрічався з Basic'ом):

Код
Samples Alias 64 ' Аналог директиви #define на Сі
' Кількість вибірок АЦП 
$regfile = "attiny13.dat" ' Конфігурації за замовчуванням
$crystal = 1200000
$hwstack = 16
$swstack = 16
$framesize = 16
'$noramclear

Open "comb.0:9600,8,n,1" For Output As #1 ' Налаштування програмного UART, швидкість 9600 бод
' Ніжка PB0 буде як TXD, підключаємо до RXD перетворювача

Config Adc = Single , Prescaler = Auto , Reference = Avcc 'Конфігурування АЦП, вимір щодо Vcc
Start Adc ' Запускаємо перетворення

' Тут Adc - режим зчитування значення: Single - одиничне зчитування,
' також може бути Free (режим постійної роботи перетворювача)
' Prescaler = 128 - вибираємо частоту дискретизації шляхом ділення
' частоти кварцу на певне число (також може бути 2,4,8,16,32,64 або Auto).
' Якщо вибрати Auto, то компілятор сам вибере відповідну частоту роботи АЦП
' Reference - вибір джерела опорного напруги. Aref - зовнішнє джерело,
' Avcc напруга живлення схеми, Internal - внутрішній ІОН на 1,1 в.

Declare Function Adc_get(byval Adc_port As Byte) As Word ' Оголосимо змінну яка приймає номер потрібного порту АЦП
' І повертає усереднене від "Samples" кількість вибірок АЦП

Do ' Тут починається вічний цикл

Print #1 , Adc_get(1) ; "," ; Adc_get(2) ; "," ; Adc_get(3) ' Виводимо дані у форматі *,*,*

Loop ' Тут кінчається

Function Adc_get(byval Adc_port As Byte ) As Word ' Змінна типу Word може приймати value. до 65535

Dim Temp_result As Word ' Створимо змінну для буфера
Dim Adc_cycles As Byte ' І лічильник вибірок АЦП

Temp_result = 0

For Adc_cycles = 1 To Samples

Temp_result = Temp_result + Getadc(adc_port)

Next

Temp_result = Temp_result / Samples

Adc_get = Temp_result ' Ця функція повертає Temp_result

End Function


Що робить дані код — спочатку створюється програмний UART, тут це робиться дуже просто, задаємо потрібні параметри, порт, швидкість та інше, потім здійснюється конфігурація АЦП, оголошення функції, ну це зрозуміло, потім формується рядок і результатами усередненого числа від Samples вибірок АЦП. Чому я вибрав саме 64 а не приміром 42 або 108? Ну тому що 1023 * 64 це дорівнює 65 472, а для типу Word, який я використовував для буфера максимальне значення яке змінна може прийняти — 65 535, це число є найбільшим числом, представимом у вигляді двухбайтного слова без знака, якщо додати ще одну вибірку мінлива просто обнулиться якщо АЦП поверне 1023. З типом Long чому виникали проблеми, та особисто мені і 64 вибірки вистачає, нижче я покажу як це працює на графіку. Ну і потім в UART виводяться результати.



Як Ви можете бачити шум звичайно присутня, навіть не дивлячись на те що виводиться середнє значення з 64 вибірок, судячи з даташіту шум в ± 2 LSB — норма, у мене ж шум 1 LSB.

Скрін софта

Як Ви можете бачити, ATtiny13 відправляє значення 15-16 разів за секунду, що я вважаю не погано враховуючи що це програмний UART так і тиня робить по 64 вимірювання на порт, а їх причому три.

Пару слів про програмування — як я сказав на відео, частота МК 1.2 МГц, все фьюзы за замовчуванням, як у моєму попередньому топіку Музичний дверний дзвінок в стилі Star Wars.
Ось фьюзы з калькулятора фьюзов:

Фьюзыimage

Ну і під кінець пару фоток з різних ракурсів:

Невелика фотосесія




Посилання:

Альтернатива Wiring для Arduino — BASCOM-AVR
Софт яким робив графіки — Serial oscilloscope
Архів з попередником, hex-файл і схеми, Proteus 7 Professional

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.