Работа с ацп на примере attiny13 в bascom-avr

Проекты на микроконтроллерах AVR – Аналогово-Цифровой Преобразователь (АЦП) и Bascom-AVR

  Микроконтроллер – цифровой прибор, который понимает и работает только с цифровыми сигналами (нулями и единицами). Но вокруг нас все сигналы представлены в аналоговой форме – освещение, температура и давление, влажность, звуки – все это непрерывно меняющиеся физические величины. 

 Для того чтобы обрабатывать аналоговые сигналы, в большинство микроконтроллеров AVR встроен АЦП (ADC–analog digital converter) – аналого-цифровой преобразователь.

 Аналогово-Цифровой Преобразователь служит для преобразования аналогового сигнала на входе в цифровую форму, понятную для МК.

 Практически во всех современных микроконтроллерах от AVR имеется 10 битный АЦП, позволяющий оцифровывать аналоговый сигнал с дискретностью 1024 значений.

Этого достаточно чтобы, например, делать замеры напряжений (в разумных пределах), снимать показания с различных датчиков, таких как фотодиод и термопара, делать анализаторы спектра и многое другое.

 Примерная работа преобразования приведена на рисунке ниже; через равные промежутки времени (ось X) происходит считывание значения напряжения на входе АЦП (ось Y). Так как АЦП имеет ограниченную разрешающую способность, появляется дискретность (дробление) значений.  

  Величина по оХ называется частотой дискретизации, чем больше частота тем точнее может быть полученная информация о сигнале. АЦП в мк AVR может работать на частотах дискретизации от 50 до 200 кГц, это значит что микроконтроллер может до 200-х раз в секунду считывать уровень напряжения на входе АЦП.

  Для того чтобы начать работать с преобразователем его сперва необходимо сконфигурировать. В Bascom-AVR конфигурирование АЦП сводится всего к одной строчке:

Config Adc = SINGLE , Prescaler = 128 , Reference = Avcc

 здесь Adc – режим считывания значения: Single – единичное считывание, также может быть Free (режим постоянной работы преобразователя)

Prescaler = 128 – выбираем частоту дискретизации путем деления частоты кварца на определенное число (также может быть 2,4,8,16,32,64 или Auto). Если выбрать Auto, то компилятор сам выберет подходящую частоту работы АЦП

Reference – выбор источника опорного напряжения, у этого параметра может быть несколько значений:

Aref – внешний источник, Avcc – напряжение питания схемы, Internal – внутренний ИОН на 2,56 вольт или в некоторых микроконтроллерах 1,1 вольт.

тестовый исходник работы с АЦП в Bascom-AVR

 Изменяя напряжение на ножке ADC0 с помощью переменного резистора, мы увидим как меняется значение считанное с АЦП. На рисунке ниже показан скрин терминала с данными, которые получил с АЦП

Источник: http://AVRproject.ru/index/analogovo_cifrovoj_preobrazovatel_acp_i_bascom_avr/0-51

Работа с АЦП на микроконтроллерах AVR. Измеряем напряжение. Пример на Attiny13 — Сообщество «Электронные Поделки» на DRIVE2

Здравствуй, любитель микроконтроллеров!

Полный размер

Готовая плата

Пролог

Давненько я хотел попробовать работать с АЦП на микроконтроллерах AVR. Для меня была интересна возможность реагировать на поднятие напряжения, после того как завелся двигатель автомобиля. Думаю, такая возможность может быть многим полезна. Но чтобы следить за напряжением нужен некий индикатор.

И здесь я наткнулся на интересный способ подключения светодиодов у Степан Палыча, да и в книжках по микроконтроллерам этот способ тоже встречается. Придумал эту схему инженер Чарли Аллен в 1995 году и называют ее методом Чарли. Решил попробовать сделать также, печатка получилась довольно похожей.

Схема и алгоритм

Для отладки прошивки набросал схему в протеусе. Сверху светодиод, который мы будем зажигать при поднятии напряжения. Чуть ниже индикатор поднятия напряжения из 6 светодиодов.

Ниже для АЦП собран делитель напряжения на резисторах R4 и R5.

Чтобы эмитировать изменение напряжения в бортовой сети автомобиля, добавил еще резистор R6, и переменный резистор RV1 — на готовой плате их, конечно же, не будет.

Полный размер

Примерная схема в протеусе

Кроме этого, на схеме не хватает параметрического стабилизатора на резисторе и стабилитроне, который будет питать микроконтроллер. И нет одного конденсатора. Это все есть на макете платы.

Здесь хотелось бы отметить, что конденсатор 100n правильнее было бы поставить параллельно резистору R5, а не так как он стоит сейчас.

Ну и резисторы на светодиоды индикатора я поставил по 200 Ом (какие уж были), все равно достаточно ярко.

Алгоритм работы будет следующим. При подаче питания первое измерение напряжения с АЦП запоминается и далее следующие замеры сравниваются с ним. Пока напряжение не поднялось горит первый светодиод индикатора. Как только напряжение поднялось на 0.

25В, то загорается второй светодиод. Поднялось на 0.5В — загорается третий и т.д. Т.е. шакала деления индикатора — 0.25В. Для нашей задачи этого достаточно. При поднятии напряжения минимум на 0.5В, мы реагируем на это и включаем верхний светодиод.

Да не просто включаем, а подаем ему ШИМ сигнал с эффектом дыхания (Хотел проверить, не будет ли ШИМ давать помехи на АЦП). Если напряжение снижается, то ШИМ сигнал на светодиод отключается.

Кстати говоря, исходный код подробно комментировал, если что-то не ясно здесь, станет ясно при чтении комментариев к исходному коду.

Чтобы не было совсем скучно, добавил анимацию индикатора поднятия напряжения каждые 10 секунд. Бегущий огонек в сторону повышения и обратно.

Видео работы в автомобиле

А мне нужен индикатор-вольтметр, как сделать?

Да легко и просто, немного подправив прошивку.

А если еще освободить ногу контроллера, на которую мы подаем ШИМ сигнал, и использовать ее в индикаторе, то мы получим целых 12 светодиодов вместо 6! При реализации вольтметра стоит посмотреть: достаточно ли точно держит напряжение стабилизации стабилитрон при изменении температуры или же стоит заменить параметрический стабилизатор на что-то другое.

Исходный код, прошивку, модель в протеусе, макет платы можете скачать здесь.

Желаю творческих успехов!

Источник: https://www.drive2.ru/c/457511737193688175/

Трёхканальный 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'ом, но это время было потрачено не только на написание кода но и на то, чтобы разобраться с особенностями BASCOM-AVR, отладка и всякое такое.

Код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 может принимать знач. до 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 измерения на порт, а их причём три. МК потребляет следующий ток: Питание 5 В — 2.71 мА Питание 3.3 В 1.75 мА

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

Вот фьюзы из калькулятора фьюзов:ФьюзыНу и под конец пару фоток из разных ракурсов:Небольшая фотосессия
Ссылки:

Альтернатива Wiring для Arduino — BASCOM-AVR

Источник: https://habr.com/post/237543/

Трёхканальный UART АЦП на ATtiny13

По буржуйски: Three-channel UART ADC ATtiny13 

Видео работы:

Графики(ссылка на софт в конце статьи):

UART кстати программный, при питании 5-3 В проблем с приёмом данных не обнаружено.

Потребление МК меньше 2 mA в работе при напряжении 3.3 В, при напряжении 5 В ток 3.5 mA.

Схема:

Вот код дл BASCOM-AVR:

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 может принимать знач. до 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

Фьюзы:

Небольшая фотосессия:

Источник: http://razniepodelki.blogspot.com/2014/09/uart-attiny13.html

下载视频,免费观看

17:44

[MiHK]【突發】挑戰極限動作受傷

Источник: https://cnvid.net/video/%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0-%D1%81-%D0%B0%D1%86%D0%BF-%D0%BD%D0%B0-%D0%BF%D1%80%D0%B8%D0%BC%D0%B5%D1%80%D0%B5-attiny13-%D0%B2-bascom-avr-5HfdMJUVILA.html

ATTiny13 Заметки

Порты

Регистр DDRB=0 – переключение порта на вход,
DDRB=1 – переключение порта на выход
При DDRB=0, PORTB=1 включает подтягивающий регистр

Таймер Timer0

General Timer/Counter Control Register – GTCCR – основной регистр управления таймером/счетчиком
Bit0 (PSR10) = 1 – сброс предделителя. Устанавливается = 0 аппаратно.
Bit7 (TSM) = 1 – режим синхронизации. В этом режиме, значение записанное в бит PSR10 (Bit0) сохраняется, сигнал сброса предделителя удерживается. Это гарантирует остановку и конфигурирование таймера/счетчика без риска его изменение во время конфигурирования. При записи в бит TSM нуля, бит PSR10 очищается аппаратно, и таймер/счетчик запускается.

Timer/Counter Control Register A – TCCR0A – регистр A управления таймером/счетчиком

Bits 7:6 – COM0A1, COM0A0 Compare Match Output A Mode (ДШ стр. 65 – 66)
Bits 5:4 – COM0B1, COM0B10 Compare Match Output B Mode(ДШ стр. 66 – 67)
Bits 3, 2 – Res Reserved Bits
Bits 1:0 – WGM01,WGM00 Waveform Generation Mode (ДШ стр. 67)

Timer/Counter Control Register B – TCCR0B – регистр B управления таймером/счетчиком

Bit 7 – FOC0A Force Output Compare A (ДШ стр. 68)
Bit 6 – FOC0B Force Output Compare B (ДШ стр. 68)
Bits 5:4 – Res Reserved Bits
Bit 3 – WGM02 Waveform Generation Mode
Bits 2:0 – CS02, CS01, CS00 Clock Select

CS02 CS01 CS00 Описание
Нет источника (Таймер/Счетчик выключен)
1 Без деления
1 / 8
1 1 / 64
1 / 256
1 1 / 1024
1 1 Внешнее тактирование с вывода T0. Счет по заднему фронту
1 1 1 Внешнее тактирование с вывода T0. Счет по переднему фронту

Timer/Counter Register – TCNT0 – счетный 8-битный регистр. Не рекомендуется запись в регистр TCNT0 без остановки таймера/счетчика.

Output Compare Register A – OCR0A – регистр A сравнения

Output Compare Register B – OCR0B – регистр B сравнения

Timer/Counter Interrupt Mask Register – TIMSK0 – регистр маскирования прерываний таймера

Bits 7..4, 0 – Res Reserved Bits
Bit 3 – OCIE0B Timer/Counter Output Compare Match B Interrupt Enable (ДШ стр. 69 – 70)
Bit 2 – OCIE0A Timer/Counter0 Output Compare Match A Interrupt Enable (ДШ стр. 70)
Bit 1 – TOIE0 бит разрешения прерывания по переполнению (ДШ стр. 70)
Когда бит TOIE0 установлен в 1, и бит I статусного регистра установлен, прерывания по переполнению разрешены. Соответствующее прерывание выполняется когда происходит переполнение таймера/счетчика, т.е. когда устанавливается бит TOV0 регистра флагов прерываний таймера счетчика TIFR0.

Timer/Counter 0 Interrupt Flag Register – TIFR0 регистр флагов прерываний таймера счетчика

Bits 7..4, 0 – Res Reserved Bits
Bit 3 – OCF0B Output Compare Flag 0 B (ДШ стр. 70)
Bit 2 – OCF0A Output Compare Flag 0 A(ДШ стр. 70)
Bit 1 – TOV0 флаг переполнения таймера/счетчика(ДШ стр. 70)
Бит TOV0 устанавливается когда переполняется таймер/счетчик. TOV0 очищается аппаратно после выполнения перехода по вектору прерывания. Альтернативно TOV0 очищается записью логической 1 во флаг. Когда бит I статусного регистраSREGTOIE0 (разрешение прерываний по переполнению таймера/счетчика), и TOV0 установлены, прерывание по переполнению таймера/счетчика выполняется.
Установка этого флага зависит от установки битов WGM02WGM01, WGM00 (см. таблицу 33 “Waveform Generation Mode Bit Description” на стр. 67).

АЦП Analog to Digital Converter

В режиме одиночного преобразования Single Conversion mode, канал АЦП должен быть выбран до начала преобразования. Канал АЦП может быть изменен одним тактовым циклом после записи в ADSCединицы. Однако простой метод требует ожидания завершения преобразования перед сменой канала.
В режиме непрерывного преобразования выбор канала АЦП всегда должен прозводиться перед первым преобразованием. Канал АЦП может быть изменен одним тактовым циклом после записи в ADSC единицы. Однако простой метод требует ожидания завершения первого преобразования перед сменой канала. Т.к. следующее преобразование запустилось автоматически, результат будет отражать предыдущее измерение. Последующее преобразование будет отображать результат для нового канала.

ADC Multiplexer Selection Register – ADMUX

Bit 7 – Res Reserved Bits
Bit 6 – выбор опорного напряжения. 0 – напряжение питания, 1 – внутренний источник 1,1 В.
Bit 5 – ADLAR выравнивание результата: 1 – по левому краю, 0 – по правому
по правому краю — старшие два бита в ADCH, а младшие в ADCL
по левому — старшие биты в ADCH, а два младших бита в ADCL.
Bits 4…2 – Res Reserved Bits
Bits 1:0 – MUX1, MUX0 – выбор канала АЦП:
00 ADC0 (PB5)
01 ADC1 (PB2)
10 ADC2 (PB4)
11 ADC3 (PB3)

ADC Control and Status Register A – ADCSRA

Bit 7 – ADEN включение АЦП = 1, выключение АЦП = 0
Bit 6 – ADSC запуск преобразования
В режиме одиночного преобразования запись 1 запускает преобразование. В режиме непрерывного преобразования запись 1 запускает первое преобразование. Запись 1 после старта преобразования или во время преобразования увеличивает время выполнения до 25 тактовых циклов вместо положенных 13 циклов. Первое преобразование выполняет инициализацию АЦП.
Bit 5 – ADATE запись 1 включает режим авто-запуска АЦП. АЦП начинает преобразование по положительному фронту выбранного сигнала. Источник сигнала выбирается битами ADTS в регистре ADCSRB.
Bit 4 – ADIF флаг прерывания АЦП. Устанавливается по окончании преобразования. Сбрасывается аппаратно или принудительно – записью 1.
Bit 3 – ADIE бит разрешения прерываний АЦП. 1 – прерывания разрешены (бит I регистра SREG должен быть установлен).
Bits 2:0 – ADPS2, ADPS1, ADPS0 установка делителя тактовой частоты для АЦП:
0 0 0    2
0 0 1    2
0 1 0    4
0 1 1    8
1 0 0    16
1 0 1    32
1 1 0    64
1 1 1    128

ADC Control and Status Register B – ADCSRB

Bits 7, 5..3 – Res Reserved Bits
Bits 2:0 – ADTS2, ADTS1, ADTS0 выбор источника автозапуска АЦП:
0 0 0    Режим непрерывного преобразования
0 0 1    Аналоговый компаратор
0 1 0    Внешнее прерывание 0
0 1 1    Таймер счетчик сравнение с регистром Match A
1 0 0    Переполнение таймера/счетчика
1 0 1    Таймер счетчик сравнение с регистром Match B
1 1 0    Pin Change Interrupt Request

Digital Input Disable Register 0 – DIDR0

Bits 5..2 – ADC3D…ADC0отключение цифровых входов

Источник: http://avr-prog.blogspot.com/2014/02/attiny13_5.html

Урок 9. Работа с АЦП на примере ATtiny13 в BASCOM-AVR

В очередном уроке я расскажу про АЦП и работу с ним в микроконтроллерах AVR. Начнем, пожалуй, с теории: И так, что же такое АЦП? Это аналого-цифровой преобразователь, который преобразует входной аналоговый сигнал в цифровой.

АЦП есть практически во всех современных AVR микроконтроллерах, исключения лишь составляют AVR микроконтроллер ATtiny2313 и ещё некоторые.

На практике с помощью AVR микроконтроллера и АЦП можно реализовать много интересных вещей: вольтметры, осциллографы, звукозаписывающие устройства, термометры и это далеко не предел! В общем, применяется АЦП там, где аналоговый сигнал нужно перевести в цифровой.

Работа с АЦП в BASCOM-AVR

Для начала работы с АЦП в BASCOM-AVR нужно сконфигурировать сам АЦП, это делается вот так:
Config Adc= режим считывания, Prescaler = частота дискретизации, Reference = источник опорного напряжения
Режимы считывания: Single – единичное считывание, результаты заносятся в ADCL, ADCH; Free – постоянное считывание, результаты заносятся в ADCL, ADCH, но происходит всё автономно.
Частота дискретизации Prescaler может быть 2,4,8,16,32,64 или Auto, в случае Auto компилятор выбирает подходящую частоту работы АЦП.
Источник опорного напряжения Reference может быть: Aref – внешний источник, Avcc – напряжение питания схемы и Internal – внутренний.
Пример конфигурирования АЦП: Config Adc = Single, Prescaler = Auto, Reference = Internal
После конфигурирования АЦП необходимо его запустить командой Start Adc, теперь можно считать значение с любого канала АЦП командой Getadc(канал АЦП). В документации на микроконтроллер порты с АЦП маркируются так: ADC1, ADC2 и т.д.
Вот так:

Практика работы АЦП на примере ATtiny13

А теперь попробуем поработать с АЦП на практике и напишем программу в BASCOM-AVR. А что же будет делать программа? Спросите вы.

А принцип работы такой: вращая движок переменного резистора светодиоды должны загораться в соответствии с напряжением на выходе переменного резистора. Чем больше напряжение, тем больше светится светодиодов.

Для начала возьмём микроконтроллер ATtiny13, три светодиода, четыре резистора, переменный резистор и соберём простую схему что ниже:

И напишем несложную программку на BASCOM-AVR, применяя полученные знания:

$regfile = “attiny13.dat”
$crystal = 9600000 Config Adc = Single , Prescaler = Auto , Reference = Internal
Config Portb.0 = Output
Config Portb.1 = Output
Config Portb.2 = Output Start Adc Do
If Getadc(2) >= 341 Then
Portb.0 = 1
Else
Portb.0 = 0
End If
If Getadc(2) >= 682 Then
Portb.1 = 1
Else
Portb.1 = 0
End If
If Getadc(2) >= 1000 Then
Portb.2 = 1
Else
Portb.2 = 0
End If
Loop
End

Компилируем, прошиваем микроконтроллер и наслаждаемся! Кстати фьюз биты микроконтроллера необходимо установить на работу внутреннего тактового генератора на 9.6МГц. Вот пример установки фьюз битов в программе PonyProg2000:

Моя сборка на макетной плате с механическими контактами:

В файлах к статье есть проект в симуляторе Proteus:

Скачать файлы для урока (проект в Proteus, исходник, прошивка) вы можете ниже

Урок 10. Работа с UART интерфейсом

Скачать список элементов (PDF)

Прикрепленные файлы:

Яковлев Александр ВячеславовичОпубликована: 2012 г.0Вознаградить Я собрал 0 0

x

  • Техническая грамотность
  • Актуальность материала
  • Изложение материала
  • Полезность устройства
  • Повторяемость устройства
  • Орфография

Источник: http://cxem.gq/mc/mc128.php

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}