Урок 5 – работа с ацп

AVR. Учебный курс. Использование АЦП

Многие AVR имеют на борту АЦП последовательного приближения.

АЦП это десятиразрядное, но при точности +/- 2 минимально значащих разрядов его можно смело считать восьмиразрядным 🙂 Так как в младших двух разрядах всегда мусор какой то, не похожий на полезный сигнал.

Тем не менее это неплохой инструмент для контроля напряжения, в восьмиразрядном режиме имеющий 256 отсчетов и выдающее частоту дискретизации до 15кГц (15 тысяч выборок в секунду).
 

Конфигурация источника
Сигнал в АЦП подается через мультиплексор, с одного из восьми (в лучшем случае, часто бывает меньше) входов.

Выбор входа осуществляется регистром ADMUX, а точнее его битами MUX3…MUX0. Записанное туда число определяет выбраный вход. Например, если MUX3..

0 = 0100, то подключен вывод ADC4.
 

Кроме того, существует несколько служебных комбинаций битов MUX, использующихся для калибровки.

Например, 1110 подключает к АЦП внутренний источник опорного напряжения на 1.22 вольта. А если записать в MUX3..

0 все единицы, то АЦП будет изнутри посажено на землю. Это полезно для выявления разных шумов и помех.  

У старших AVR семейства Mega (8535, 16, 32, 128) есть возможность включить АЦП в режиме дифференциального входа. Это когда на два входа приходят разные напряжения. Одно вычитается из другого, да еще может умножаться на коэффициент усиления. Зачем это нужно? А, например, когда надо замерить перекос напряжения измерительного моста. У какого-нибудь тензомоста при входном напряжении в пять вольт выходные сигналы будут различаться между собой всего лишь 30мВ, вот и поймай его. А так подал на диф вход, подогнал нужный коэффициент усиления и красота!
 

Таблицу значений MUX3..0 для диф включения я не буду тут приводить, она находится легко в даташите, зовется она «Input Channel and Gain Selections«. Я поясню лишь один тонкий момент.

В режиме выбора диф входа встречаются такие комбинации как: первый вход ADC0 и второй вход тоже ADC0 ну и коэффициент усиления еще. Как так? Ведь для диф входа нужно два разных входа! Вначале подумал опечатка, поднял даташит на другую АВРку — та же ботва.

Потом повтыкал в текст ниже и понял — это для калибровки нуля. Т.е. перед началом съема диф данных нам нужно закоротить входы, чтобы понять, что же у нас ноль. Так вот, комбинация когда два входа подключены к одной ноге это и есть та самая калибровочная закоротка входов.

Делаешь первое преобразование на такой фигне, получаешь смещение нуля. А потом вычитаешь его из всех полученных значений, что резко повышает точность.
 

Мультиплексирование каналов осуществляется только после того, как завершится преобразование, поэтому можно смело запускать АЦП на обсчет входных значений, записывать в MUX3..0 параметры другого входа, и готовится снимать данные уже оттуда.
 

Выбор опорного сигнала
Это максимальное напряжение, которое будет взято за максимум при измерениях. Опорное напряжение должно быть как можно стабильней, без помех и колебаний — от этого кардинальным образом зависит точность работы АЦП. Задается он в битах REFS1..0 регистра ADMUX.

  • По дефолту там стоит REFS1..0 = 00 — внешний ИОН, подключенный к входу AREF. Это может быть напряжение со специальной микросхемы опорного напряжения, или же со стабилитрона какого, если нужно замерять небольшое напряжение, заметно меньшее чем напряжение питания, скажем от 0 до 1 вольт, то чтобы было точнее, и чтобы оно не затерялось на фоне пятивольтового питания, то на AREF мы заводим опорное напряжение в 1 вольт.
  • REFS1..0 = 01 — тут просто берется напряжение питания. У всех почти Мег с АЦП есть вход AVCC — вот это напряжение питания для AЦП и порта на который это АЦП повешено. Подавать туда плюс питания желательно через LC фильтр, чтобы не было искажений.
  • REFS1..0 = 11 — внутренний источник опорного напряжения на 2.56 вольт. Честно говоря, качество этого источника мне сильно не понравилось. С ним показания АЦП плавают как говно в проруби. Но если невозможно обеспечить гладкую и стабильную подачу напряжения на AREF или AVCC то прокатит. Кстати, внутренний ИОН подключен к выводу AREF так что можно повесить туда кондер и попробовать его чуть чуть сгладить. Немного, но помогает.
  •  

Выбор режима запуска преобразования
В регистре SFIOR под АЦП отведено аж три бита. ADTS2..0 которые управляют режимами запуска АЦП.
 

  • По дефолту ADTS2..0 = 000 и это значит, что преобразование идет в непрерывном режиме. Ну или по ручному запуску.
  • ADTS2..0 = 001 — запуск АЦП от аналогового компаратора. Удобно блин. Например, чтобы не замерять постоянно входную величину, а запрограммировать компаратор на то, что как только у него вылезет что-либо выше порога, так тут же захватывать это дело на АЦП.
  • ADTS2..0 = 010 — запуск от внешнего прерывания INT0
  • ADTS2..0 = 011 — по совпадению таймера T0
  • ADTS2..0 = 100 — по переполнению таймера Т0
  • ADTS2..0 = 101 — по совпадению с таймера Т1
  • ADTS2..0 = 110 — По переполнению таймера Т1
  • ADTS2..0 = 111 — По событию «захват» таймера Т1

Скорость работы АЦП
Частота выборки АЦП задается в битах предделителя ADPS2…0 регистра ADCSR.

Саму таблицу можно поглядеть в даташите на соответствующий МК, скажу лишь то, что самая оптимальная точность работы модуля АЦП находится в пределах 50…200кГц, поэтому предделитель стоит настраивать исходя из этих соображений. С повышением частоты точность падает.
 

Прерывания.
Естественно у АЦП есть прерывания. В данном случае это прерывание по окончанию преобразования.

Его можно разрешить битом ADIE, а внаглую вручную палится оно по флагу ADIF (регистр ADCSRA).

Флаг ADIF автоматом снимается при уходе на вектор прерывания по АЦП.
 

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

В итоге, лишь один регистр занят полностью, а второй занимает лишь оставшиеся два бита.

Так вот, выравнивание может быть как по правому краю — старшие два бита в ADCH, а младшие в ADCL, либо по левому — старшие биты в ADCH, а два младших бита в ADCL.
 

[x][x][x][x][x][x][9][8]:[7][6][5][4][3][2][1][0] или [9][8][7][6][5][4][3][2]:[1][0][x][x][x][x][x][x]
Зачем это сделано? А это выборка разрядности так оригинально организована. Как я уже говорил, в младших разрядах все равно мусор и шумы (по крайней мере я от них так и не смог избавиться, как ни старался) . Так вот. Делаем выравнивание по левому краю. И загребаем старшие разряды только из регистра ADCH, а на младший забиваем. Итого, у нас число отсчетов становится 256. За выравнивание отвечает бит ADLAR в регистре ADMUX 0 — выравнивание по правой границе, 1 — по левой.
 

Запуск преобразования в ручном или непрерывном режиме.


Для запуска преобразования нужно вначале разрешить работу ADC, установкой бита ADEN в регистре ADCSR и в том же регистре ткнуть в бит ADSC.

Для запуска непрерывного преобразование (одно за другим) нужно также выставить бит ADFR (ADATE в некоторых AVR).
 

Повышение точности уходом в спячку.
Для повышения точности, чтобы внутренние цепи АЦП не гадили своими шумами, можно запустить АЦП в спящем режиме. Т.е.

проц останавливается, все замирает. Работает только WatchDog и блок АЦП.

Как только данные сосчитаются, генерируется прерывание которое будит процессор, он уходит на обработчик прерывания от АЦП и дальше все своим чередом.
 

А теперь приведу парочку примеров простой инициализации и работы с АЦП. Микроконтроллер ATMega16

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
; Мой любимый макрос для записи в порты :)))) .MACRO outi LDI R16,@1 OUT @0,R16 .ENDM  
; ADC Init – Инициализурем АЦП. Это можно сунуть куда – нибудь в начало кода   OUTI ADCSRA,(1

Источник: http://easyelectronics.ru/avr-uchebnyj-kurs-ispolzovanie-acp.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, исходник, прошивка) вы можете ниже

https://www.youtube.com/watch?v=JUy8tAjBvhc

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

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

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

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

x

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

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

AVR для начинающих. Урок 8. АЦП

Урок 8.

Аналого-Цифровой преобразователь — устройство, преобразующее входной аналоговый сигнал в цифровой код.

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

Именно благодаря АЦП микроконтроллер может оперировать аналоговыми сигналами.

Однако АЦП микроконтроллера может измерять только напряжение. Поэтому любую другую величину, например ток, перед измерением необходимо преобразовать в напряжение.

Преобразование входного сигнала в численное представление происходит относительно опорного напряжения. Опорное напряжение(Vref) — эталонное напряжение, относительно которого происходит преобразование входной величины. При использовании АЦП микроконтроллера AtMega8, опорное напряжение необходимо подавать на соответствующую ножку контроллера.

Измерение напряжения производится в диапазоне от 0 до Vref.Весь этот диапазон делится в соответствии с разрядностью. То есть если разрядность АЦП — 10 Бит, то диапазон делится на 1023, если 8 бит, то на 255 и так далее.

Предполагая, что Vref = 5 Вольтам, при разрядности 10 Бит мы получим шаг измерения 5/1023 = 0.0049 Вольт, а при разрядности 8 бит, шаг измерения станет 5/255 = 0.02 Вольт.

То есть, чем меньше разрядность — тем ниже точность преобразования.

Предположим, что мы подаем на вход 10 битного АЦП, c Vref =5 Вольтам, напряжение 3 вольта. На выходе АЦП мы получим численное представление входного напряжения. Легко подсчитать, что шаг измерения равен 0.0049 Вольт, значит, на выходе АЦП мы получим . То есть, для получения значения входного напряжения, необходимо шаг измерения умножить на выходное значение АЦП.

Давайте рассмотрим регистры, отвечающие за конфигурацию АЦП микроконтроллера AtMega8. АЦП в AtMega8 всего один, однако, имеет 8 входных каналов. За выбор входного канала, а так же настройку опорного напряжения отвечает регистр ADMUX.

ADMUX:

  • Биты REFS0-REFS1 отвечают за выбор опорного напряжения.
  • Биты MUX0-MUX3 отвечают за выбор входного канала.
  • Бит ADLAR. Определяет порядок записи результатов преобразования в регистры ADCL и ADCH.

Читайте также  AVR для начинающих. Урок 9. UART.

АЦП микроконтроллера AtMega8, может работать как в режиме однократного преобразования, так и в режиме непрерывного преобразования (Следующее преобразование начинается сразу после предыдущего). За настройку режима преобразования, прерываний, а так же тактирования АЦП, отвечает регистр ADCSRA.

ADCSRA:

  • Бит ADEN включает и выключает АЦП микроконтроллера.

           ADEN = 1 — АЦП включен.

           ADEN = 0 — АЦП выключен.

  • При записи 1 в бит ADSC, в режиме однократного преобразования запускается преобразование.
  • Бит ADFR, отвечает за выбор режима преобразования.

           ADFR = 1 — Непрерывное преобразование.

           ADFR = 0 — Однократное преобразование.

  • Бит ADIF, флаг окончания преобразования, становится равен 1 при окончании преобразования
  • Бит ADIE, разрешает прерывание АЦП.

           ADIE = 1 — Прерывание разрешено.

           ADIE = 0 — Прерывание запрещено.

  • Биты ADPS0-ADPS2 отвечают за выбор предделителя между частотой тактирования микроконтроллера и АЦП.

Результат преобразования помещается в пару регистров ADCH и ADCL, в виде заданным значением бита ADLAR.

В качестве примера соберем простой вольтметр с применением LCD WH1602, и встроенного АЦП микроконтроллера AtMega8.

Соберем в Proteus следующую схему:

Код прошивки на C:

#include void Pulse_E(void) //Переключить линию Evoid Send_Byte (char Data)// Отправить байт данных LCDvoid Send_Cmd (char Cmd)// Отправить команду LCDvoid Send_Str (char* str,char length)// Отправить строку LCD, длины lengthfor (int i = ;i

Источник: http://mkprog.ru/avr/avr-dlya-nachinayushhih-urok-8-atsp.html

Использование АЦП в AVR. Урок AVR 6

Источник: http://articles.greenchip.com.ua/1-1-39.html

ATmega8: использование АЦП на примере датчика освещенности собраного на фоторезисторе

разделы: AVR , дата: 24 октября 2015г

схема подключения

Попробуем сделать датчик освещености. В комбинации с модулем RTC такой датчик может управлять освещением и подсветкой в системах типа: “умный дом”. Датчик будет на фоторезисторе, сопротивление которого обратно пропорционально уровню освещености.

Фоторезистор будет подключаться по схеме делителя напряжения, где в верхнее плечо будет установлен постоянный резистор 10K, а в нижнее сам фоторезистор. Нулевая точка будет поключена к пину ADC0 микроконтроллера.

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

Но вернемся к фоторезистору. Модель котрая мне попалась под руку – VT93N2. Даташит на него представлен ниже:

Чтобы иметь предстваление как это все должно работать, я сначала проверил это на Arduino с помощью такого скетча:

Результат работы был таким:

Здесь низкие значения соответствуют слабой освещености, а высокие – относительно яркой.

    Теперь, некоторые моменты реализации АПЦ в AVR микроконтроллерах:
  1. АЦП там один. НО можно задавать несколько пинов, с которых АЦП будет последовательно снимать показания в порядке очереди. Это называется каналами.
  2. АЦП там 10-битный, но младшие два бита относятся к зоне погрешности, чтобы снимать с них достоверную информацию, нужно чтобы частота оцифровки не превышала определенного значения, и нужно использовать специальный спящий режим ADC Noise Reduction, когда программа и перефирия отключаются ради бесшумной работы АЦП. Другими словами, приходится использовать 8-битный АЦП или проще использовать внешний АЦП.
  3. Значения АЦП выводятся в долях между землей и опорным напряжением. И то и то должно подаваться от эталонных источников, иначе качество выходной “цифры” будет неважнецкое.
  4. Приминительно к ATmega8, там существует два управляющих регистра АЦП: ADCSRA и ADMUX.
  5. Т.к. АЦП формально 10-битный, есть два регистра приемника: ADCH и ADCL. Существует специальный порядок чтения этих регистров, чтобы пока питается один, другой не менял своего значения при очередном преобразовании.
  6. Установкой бита ADLAR в регистре ADMUX, возможен 8-режим, т.е. когда старшие 8 битов пишутся в ADCH, а значением ADCL, как правило, пренебрегают.
  7. Имеется два режима работы АЦП: разовое и беспрерывная работа с определенной частотой. Частота дискретизации(оцифовки) задается тремя младшими битами ADPS2:ADPS0 в регистре ADCSRA.
  8. Имется прерывание по вектору ADC, кторое вызывается при окончании дискретизации. Т.е. это момент, когда можно забрать свежие данные. Вместо прерывания можно пользоваться ADIF флагом в регистре ADCSRA.

Пора снова вернуться к фоторезистору. Код который у меня получился в итоге:

#include
#include
#include
#include static FILE mystdout = FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE); volatile uint8_t dataADC;
ISR(ADC_vect)
{ dataADC=ADCH;
}; int main(void)
{ init_uart(); DDRB |= (1

Источник: http://www.count-zero.ru/2015/adc/

Урок 6: Работа с АЦП

Опубликовано 2010-03-29 11:33:52 автором Ruslan

Часто бывает потребность замерять напряжения. Для этих целей в микроконтроллере есть АЦП (аналого-цифровой преобразователь). АЦП – это устройство, которое преобразует аналоговый сигнал в его цифровое представление. На вход АЦП подается аналоговый сигнал, а на выходе мы получаем эквивалентный цифровой сигнал.

  • Частота преобразования – это сколько раз в секунду АЦП сможет измерить напряжение
  • Разрядность – количество дискретных значений напряжения, на который делится весь рабочий диапазон входных напряжений. АЦП в AVR десяти разрядные. То есть, максимальное напряжение на входе АЦП будет переводиться в 210=1024
  • Диапазон входных напряжений – это минимальное и максимальное напряжение, которое можно подавать на входы АЦП. Для avr это диапазон от 0 до напряжения питания микроконтроллера

Для работы АЦП необходим источник опорного напряжения (ИОН). Это эталон, по отношению к которому он измеряет напряжение на входе. В AVR в качестве источника опорного напряжения может выступать напряжения питания МК, источник опорного напряжения, подключенный к ножке ARef и внутренний ИОН на 2,56 в. ИОН должен быть как можно стабильней, от этого зависит точность измерений. Чтобы пощупать все это, давайте сделаем простой вольтметр на 5в. Запускаем CVAVR, на вопрос запустить CodeWizardAVR кликаем “да” и переходим во вкладку ADC

Здесь:

  • ADC Enable – разрешает или запрещает работу АЦП
  • Use 8 bitАЦП будет 8 битным, то есть максимальное число на выходе АЦП – это 255 (по умолчанию АЦП 10-битный)
  • ADC Interrupt – будет генерироваться прерывание, когда АЦП закончит преобразование. При выборе этой опции появляются дополнительные пункты
    • Noise Canceler – при преобразовании процессор будет переходить в режим холостого хода (Idle Mode). Таким образом уменьшается количество помех, которые влияют на точность АЦП
    • Automatically scan inputs – поочередное автоматическое сканирование входов АЦП. Результаты измерения помещаются в массив
  • Volt Ref – выбирается источник опорного напряжения
    • AREF pin – источник опорного напряжения на ножке AREF
    • AVCC pin – источник опорного напряжения на ножке AVCC
    • Int., cap. on AREF – подключить к выводу aref внутренний источник опорного напряжения на 2,56в и конденсатор
  • Clock – выбор частоты работы АЦП

Нам для нашего вольтметра нужно установить источник опорного напряжения на ножке AVCC (ножка питание АЦП), частота преобразования 500 килогерц

Мы наши измерения с АЦП будем выводить на lcd-дисплей, для его инициализации переходим во вкладку LCD и устанавливаем все, как на скриншоте

Теперь все настройки выполнены, кликаем file->Generate. save and exit. Дописываем код, который сгенерировал CWAVR, и убираем в нём инициализации периферии МК, которые мы не используем, получается следующий код:

#include #include #include // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x12 ;PORTD #endasm #include #define ADC_VREF_TYPE 0x40 // Read the AD conversion result unsigned int read_adc(unsigned char adc_input) { ADMUX=adc_input | (ADC_VREF_TYPE & 0xff); // Delay needed for the stabilization of the ADC input voltage delay_us(10); // Start the AD conversion ADCSRA|=0x40; // Wait for the AD conversion to complete while ((ADCSRA & 0x10)==0); ADCSRA|=0x10; return ADCW; } void main(void) { char lcd_buffer[16]; unsigned int u; // ADC initialization // ADC Clock frequency: 500,000 kHz // ADC Voltage Reference: AVCC pin ADMUX=ADC_VREF_TYPE & 0xff; ADCSRA=0x81; // LCD module initialization lcd_init(16); while (1) { /*так как АЦП у нас 10-битный, то максимальное число, которое вернет функция, read_adc() будет равно 1024, это число будет эквивалентом напряжения на входе adc0. Например, если read_adc() вернул 512, то это значит, что на вход adc0 мы подали половину опорного напряжения Чтобы вычислить реальное напряжение, нам нужно составить пропорцию опорное напряжение – 1024 искомое напряжение – adc У нас опорное напряжение = 5 Искомое напряжение = 5 * adc/1024, или Искомое напряжение = 0,005*adc для простоты переведём вольты в миливольты, домножив на 1000 Искомое напряжение = 0,005*adc*1000 */ u=read_adc(0) * 5;//вызываем функцию для измерения напряжения и передаем ей номер ножки, на которой нужно измерить напряжение lcd_clear(); //чистим дисплей перед выводом lcd_gotoxy(0,0); // перевод курсор в положение x=0 y=0 sprintf(lcd_buffer,”U = %i mv”,u); // формируем строку для вывода lcd_puts(lcd_buffer); //выводим строку на дисплей delay_us(500); //делаем задержку 500 мл }; }

Программа готова, дело за схемой

Схема очень простая, на ней мы видим микроконтроллер atmega8 и lcd-дисплей знакосинтезирующий 16х2 (пример работы с lcd описан здесь). Наш простой вольтметр измеряет напряжения до 5 в. Как измерять напряжения больше 5 в читайте в этой статье. Схема выполнена в Proteus, все необходимые файлы для этого урока находятся в архиве Volt.zip.

Микроконтроллер stm32f1xx имеет на борту 3 12-ти разрядных АЦП. Каждое АЦП может быть подключено к любому из 16-ти аналоговых входов. Более того, каждое из АЦП может сканировать эти входы, снимая с них данные в заданном пользователем порядке. По окончании преобразования АЦП может выдать прерывание. Вообще АЦП может выдать одно из трёх прерываний: Об окончании преобразования обычного (регулярного) канала, об окончании преобразования по инжекторному каналу и событие по Watchdog. В режиме сканирования прерывание об окончании преобразования выдаётся только по завершении всего сканирования. И при использовании регулярных каналов, в которых данные записываются всегда в один и тот же регистр, вы будете получать результаты только последнего преобразования. Что бы этого не происходило, в микроконтроллере предусмотрено наличие так называемых инжекторных каналом, имеющих в своём наличии 4 разных регистра для записи данных. Т.е. если вам надо сканировать не более 4-х каналов, то результаты преобразований вы не потеряете. Т.к. каждый канал будет писать данные в свой регистр. Для параллельного снятия данных сразу по нескольким каналам, предусмотрена возможность одновременного запуска нескольких АЦП. Данный режим получил название Dual Mode.

Подключение АЦП

Прежде всего рассмотрим подключение АЦП. Для чего нужна каждая ножка показано в таблице 1. Таблица 1Из перечисленных ножек интересны -Vоп и +Vоп. Они определяют диапазон напряжений, воспринимаемых АЦП. Если подключить -Vоп к земле, а +Vоп к питанию, то АЦП сможет оцифровать аналоговые сигналы во всём диапазоне от 0, до питания. Т.к. питания МК составляет 3,3В, а разрядность АЦП равна 12-ти, т.е. мы имеем 2^12=4096 уровней квантовая, шум АЦП составит 3,3/4096=0,8 мВ.

Виды АЦП

В микроконтроллере существует 2 вида каналов АЦП: регулярные и инжекторные. Эти 2 канала настраиваются независимо. Но работать может только один из них для каждого канала. Основным различием этих каналов является то, что для хранения данных, получаемых с помощью регулярного канала используется только один регистр. Это не плохо, если вам надо снять за один раз данные только с одного канала для каждого АЦП. Но, если Вам надо производить сканирование данных, то все снятые данные будут записываться с один и тот же регистр. Т.о. при чтении данных в прерывании по окончании преобразования Вы будете получать только последние снятые данные. Эту проблему призваны исправить инжекторные каналы. У них предусмотрены 4 регистра для хранения данных. Т.е. Вы сможете хранить данные с 4-х каналов сканирования. Недостатком инжекторных каналов является несколько более сложная система настройки, в которой надо описать данные, с какого канала в какой регистр будут записаны.

Настройка регулярного канала

Рассмотрим настройку регулярного канала АЦП. Настроим АЦП на ножке А4. Прежде всего, надо узнать какие АЦП имеют доступ к этой ножке и какие каналы на неё выведены. В частности это 4-й канал первого АЦП. Как обычно используем стандартную схему: 1) Включить тактирование порта 2) Настроить вывод 3) Включить тактирование АЦП 4) Настроить АЦП 5) Включить нужные прерывания 6) Включить глобальные прерывания 7) Включить АЦП При настройке порта главное в режиме задать аналоговый режим.GPIO_InitTypeDef GPIO_Init_user; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); GPIO_Init_user.GPIO_Pin = GPIO_Pin_4; GPIO_Init_user.GPIO_Mode = GPIO_Mode_AN; GPIO_Init_user.GPIO_Speed = GPIO_Speed_2MHz; GPIO_Init_user.GPIO_OType = GPIO_OType_PP; GPIO_Init_user.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, & GPIO_Init_user);Включаем тактирование АЦП: RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);Настраиваем АЦП:ADC_InitTypeDef ADC_InitType; ADC_InitType.ADC_ContinuousConvMode = DISABLE; ADC_InitType.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitType.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T1_CC1; ADC_InitType.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None; ADC_InitType.ADC_NbrOfConversion = 1; ADC_InitType.ADC_Resolution = ADC_Resolution_12b; ADC_InitType.ADC_ScanConvMode = DISABLE; ADC_Init(ADC1, &ADC_InitType);Рассмотрим настройки подробнее:ContinuousConvMode – Этот режим, если включен, запускает следующее преобразование сразу по окончании предыдущего. Так можно добиться максимальной скорости работы АЦП. В нашем случае это не надо и данная функция отключена.DataAlign – выравнивание данных в 2-хбайтном слове. Есть 2 варианта. ADC_DataAlign_Right при котором данные выравниваются по правому краю, а неиспользуемые биты при этом равны нулю. Т.е. мы получаем обычные числа в 2-х байтах от 0 до 8192. При ADC_DataAlign_Left данные выравниваются по левому краю. Т.е. фактически для 12-ти битного преобразования они увеличиваются в 16 раз. Это может быть использовано например при передаче их через SPI, поддерживающий 12-ти битную передачу данных. Если настроить SPI на передачу начиная со старшего разряда. ExternalTrigConvEdge – настраивает запуск преобразования по какому либо событию, например переполнению таймера. В нашем случае не требуется.ExternalTrigConv – Устанавливает какие именно события запустят АЦП. Т.к. триггер отключен, то эта функция не используется.NbrOfConversion – число каналов, которые будет сканировать МК. Сюда записывается требуемое значение, а ниже, если это число больше 1 и ADC_ ScanConvMode=ENABLE, описывается какие каналы и в какой последовательности они будут сканироватьсяScanConvMode – Этот параметр определяет будет ли АЦП сканировать несколько каналов. Если этот режим включен, то АЦП будет последовательно оцифровывать данные с заданных каналов в заданной последовательности. И каналы и последовательность легко можно задать. Но возникает небольшая проблема со снятием данных. Настраиваем конкретный канал. В нашем случае это всего один канал, потому настройка будет выглядеть так: ADC_RegularChannelConfig(ADC1,ADC_Channel_4,1, DC_SampleTime_56Cycles); Из параметров тут: ADC1 – номер настраиваемого АЦП. ADC_Channel_4 задаёт снимаемый канал. 1 – так называемый rank. Показывает в каком порядке этот канал будет оцифровываться. В нашем случае канал один, потому и rank=1. DC_SampleTime_56Cycles – задаёт за какое время будет произведена оцифровка. Чем медленнее, тем точнее. Теперь осталось настроить прерывания и включить: NVIC_EnableIRQ(ADC_IRQn); ADC_ITConfig(ADC1, ADC_IT_EOC, ENABLE); ADC_Cmd(ADC1, ENABLE); На этом настройка закончена. Чтобы запустить преобразование, используйте функцию: ADC_SoftwareStartConv(ADC1); По окончании преобразования программа попадёт в функцию прерывания: void ADC_IRQHandler(void) { ADC_ClearFlag(ADC1, ADC_FLAG_EOC); ADC_result = ADC_GetConversionValue(ADC1); } Сбрасываем флаг и считываем результат преобразования.Можно скачать пример работы от сюда.

Категория: Уроки по программированию stm32f4xx | Добавил: Korvin (11.11.2013)

Источник: http://amberclan.clan.su/publ/uroki_po_programmirovaniju_stm32fxxx/uroki_po_programmirovaniju_stm32f4xx/urok_6_rabota_s_acp/11-1-0-124

Ацп микроконтроллера atmega8, цифровой вольтметр

АЦП – аналогово-цифровой преобразователь (ADC- Analog-to-Digital Converter). Преобразует некий аналоговый сигнал в цифровой. Битность АЦП определяет точность преобразования сигнала. Время преобразования – соответственно скорость работы АЦП.

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

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

Входное напряжение = Опорное напряжение*Z/2^N, где N – битность АЦП. Условимся, что этот регистр, как у ATmega8, 10-ти битный. Преобразование в нашем случае проходит в 10 стадий. Старший бит Z9 выставляется в единицу.

Далее генерируется напряжение (Опорное напряжение*Z/1024), это напряжение, с помощью аналогового компаратора сравнивается с входным, если оно больше входного, бит Z9 становиться равным нулю, а если меньше – остается единицей.

Далее переходим к биту Z8 и вышеописанным способом получаем его значения. После того, как вычисление регистра Z окончено, выставляется некий флаг, который сигнализирует, что преобразование закончено и можно считывать полученное значение.

На точность преобразования могут очень сильно влиять наводки и помехи, а также скорость преобразования. Чем медленнее происходит преобразования – тем оно точней.

С наводками и помехами следует бороться с помощью индуктивности и емкости, как советует производитель в даташите:

В микроконтроллерах AVR как источник опорного напряжения может использоваться вывод AREF, или внутренние источники 2,56В или 1,23В.

Также источником опорного напряжения может быть напряжение питания. В некоторых корпусах и моделях микроконтроллеров есть отдельные выводы для питания АЦП: AVCC и AGND.

Выводы ADCn – каналы АЦП.

С какого канала будет оцифровываться сигнал можно выбрать с помощью мультиплексора.
Теперь продемонстрируем примером сказанное выше. Соорудим макет, который будет работать как вольтметр с цифровой шкалой. Условимся, что максимальное измеряемое напряжение будет 10В. Также пусть наш макет выводит на ЖКИ содержимое регистра ADC.

Схема подключения:

Обвязка микроконтроллера и ЖКИ WH1602A стандартна. X1 – кварцевый резонатор на 4 Мгц, конденсаторы С1,С2 – 18-20 пФ. R1-C7 цепочка на выводе reset по 10 кОм и 0,1 мкФ соответственно.

Сигнальный светодиод D1 и ограничивающий резистор R2 200 Ом и R3 – 20 Ом. Регулировка контраста ЖКИ – VR1 на 10 кОм. Источник опорного напряжения мы будем использовать встроенный на 2,56В.

С помощью делителя R4-R5 мы добьемся максимального напряжения 2,5В на входе PC0, при напряжении на щупе 10В.

R4 – 3 кОм, R5 – 1 кОм, в их номиналу нужно отнестись тщательно, но если не возможности подобрать точно такие, можно сделать любой резистивный делитель 1:4 и программно подкорректировать показания, если это потребуется. Дроссель на 10мкГн и конденсатор на 0,1 мкФ для устранения шумов и наводок на АЦП на схеме не показан. Их наличие подразумевается само собой, если используется АЦП. Теперь дело за программой:

Программа на языке Си:

  1. #include<\p>

  2. #define RS 2 //RS=PD2

  3. #define E 3 //E=PD3

  4. #define TIME 10 //Константа временной задержки для ЖКИ

  5. //Частота тактирование МК – 4Мгц

  6. #define R_division 3.837524 //=R4/R5 константа

  7. unsigned int u=0; //Глобальная переменная с содержимым преобразования

  8. void pause (unsigned int a)<\p>

  9. {<\p>

  10. unsigned int i;

  11. for (i=a;i>0;i–);

  12. }

  13. void lcd_com (unsigned char lcd) //Передача команды ЖКИ

  14. {<\p>

  15. unsigned char temp;

  16. temp=(lcd&~(1

Источник: https://avrlab.com/node/94

Делаем модульный многоканальный АЦП

В различных проектах часто бывает необходимо следить за множеством параметров, которые представлены аналоговыми величинами. Конечно, часто хватает микроконтроллера, но иногда алгоритм обработки слишком сложен для него и требуется использование полноценного компьютера. К тому же на нём гораздо проще организовывать сохранение логов и красивую визуализацию данных.

В таком случае либо берётся готовое промышленное решение (которое, разумеется, стоит дорого, но часто является избыточным), либо делается что-то самодельное. В самом банальном случае это может быть плата Arduino с бесконечным циклом из analogRead и serial.write.

Если входных данных много (больше, чем аналоговых входов), то потребуется несколько плат, придумывать как их правильно опрашивать с компьютера и т. д.

Во многих случаях подойдёт разработанное мною решение (возможно, я не первый придумал именно такую реализацию, не особо интересовался этим вопросом), которое позволит сэкономить время на отладку и сделать относительную простую и понятную архитектуру системы.

Чтобы понять, подойдёт ли это решение вам, предлагаю ознакомится с его характеристиками:

Максимальное число каналов: 44;

Частота дискретизации: 1000 Герц;
Разрешение: 8 бит. Характеристики достаточно посредственные, однако для многих задач могут подойти. Это ведь не осциллограф, а система опроса датчиков. К тому же на её примере можно познакомится с использованием USART не совсем по назначению. Система состоит из отдельных модулей АЦП на базе микроконтроллера ATMEGA8 (можно применить другой МК семейства AVR с АЦП и аппаратным модулем USART, если немного изменить прошивку). Модулей может быть один или несколько, каждый предоставляет 6 или 8 АЦП в зависимости от корпуса микроконтроллера (выводная версия имеет 6 АЦП, а для поверхностного монтажа 8), только суммарное количество каналов не должно превышать 44. Главная особенность в том, что вне зависимости от количества модулей требуется лишь один USART со стороны компьютера (это может быть USB-переходник или аппаратный COM-порт). Это достигается засчёт того, что USART'ы всех микроконтроллеров соединяются последовательно (RX одного к TX другого), а RX и TX пины крайних в цепочке уже подсоединяются к компьютеру. Тут надо заметить то, что разрядность моего АЦП не совсем 8 бит — возможно лишь 255 градаций вместо 256. Значение 0xFF зарезервировано для особой цели. Если микроконтроллер получает его, то начинает выдавать каждый раз значение с очередного канала своего АЦП, а когда они кончаются ретранслирует 0xFF дальше по цепочке. Если же на вход USART приходит значение отличное от 0xFF, то микросхема просто пересылает байт далее. Таким образом передав одно произвольное значение и 44 0xFF можно получить значения со всех каналов всех АЦП (если АЦП меньше, то лишние каналы будут равны 0xFF). Произвольное значение нужно для того, чтобы все модули сбросили указатель на текущий канал АЦП, который надо передавать при получении 0xFF. В реальности удобнее передавать 45 0xFF, чтобы надёжно определять окончание приёма (если получили 0xFF, значит каналы закончились). Принципиальная схема содержит не очень много деталей:Программа для AVR выглядит предельно просто и занимает чуть меньше 300 байт памяти:#include
#include
#include
#include
// Firmware options
#define USART_BAUDRATE 460800
#define LED_PIN 1
#define ADC_COUNT 6
#define STARTUP_DELAY 1000
// Calculated UBRR value
#define UBRR (F_CPU / (16 * (uint32_t)USART_BAUDRATE) – 1)
// Global variables
uint8_t adc[ADC_COUNT]; // Buffer
uint8_t cur_in_adc; // Input byte index
uint8_t cur_out_adc; // Output byte index
// USART interrupt handler
ISR(USART_RXC_vect) { // Read data from USART uint8_t buffer = UDR; if (buffer == 0xFF) { if (cur_out_adc < ADC_COUNT) { // Return data byte from buffer UDR = adc[cur_out_adc]; cur_out_adc++; // Activate led PORTB |= _BV(LED_PIN); } else { // Chain 0xFF UDR = 0xFF; // Deactivate led PORTB &= ~_BV(LED_PIN); } } else { // Chain data byte UDR = buffer; // Reset byte counter cur_out_adc = 0; // Deactivate led PORTB &= ~_BV(LED_PIN); } } // Main function void main() { // Setup watchdog timer wdt_enable(WDTO_15MS); // Setup pin for led DDRB |= _BV(LED_PIN); // Blink led PORTB |= _BV(LED_PIN); for (uint8_t i = 0; i < STARTUP_DELAY / 5; i++) { _delay_ms(5); wdt_reset(); } PORTB &= ~_BV(LED_PIN); // Setup ADC ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(ADLAR); ADCSRA = _BV(ADEN) | _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // Setup USART UBRRL = UBRR & 0xFF; UBRRH = UBRR >> 8; UCSRA = 0; UCSRB = _BV(RXCIE) | _BV(RXEN) | _BV(TXEN); UCSRC = _BV(URSEL) | _BV(UCSZ1) | _BV(UCSZ0); // Enable interrupts sei(); // Main loop while (1) { // Reset watchdog timer wdt_reset(); // Select ADC channel ADMUX = _BV(REFS1) | _BV(REFS0) | _BV(ADLAR) | cur_in_adc; // Start conversion and wait until it performed ADCSRA |= _BV(ADIF) | _BV(ADSC); while (ADCSRA & _BV(ADSC)); // Put value from ADC to buffer uint8_t value = ADCH; adc[cur_in_adc] = (value != 0xFF) ? value : 0xFE; // Switch to next channel cur_in_adc++; if (cur_in_adc >= ADC_COUNT) { cur_in_adc = 0; } }
}

В репозитории на GitHub вы можете найти файлы схемы и печатной платы KiCad, а также пример программы для компьютера, которая читает данные с этой системы и выдаёт их в формате CSV.

Удобно, что последовательный порт используется практически на пределе своих возможностей, поэтому не требуется заботится о синхронизации данных (я просто отправляю каждую секунду сразу 1000 команд на чтение АЦП) — если мы передаём 46 килобайт данных каждую секунду со скоростью 460800 бит в секунду, то можно быть полностью уверенным, что блоки из 46 байт данных (один замер) будут приходить каждую миллисекунду (хотя буферизация ядром ОС и USB-переходником, конечно, внесёт задержку, но замеры всегда будут производится с нужной частотой). Печатная плата была спроектирована в KiCad:Все платы соединяются в цепочку, у последней платы RX и TX соединяются джампером. Качество работы АЦП можно оценить по этому изображению пилы на 10 Гц:Для сравнения изображение с осциллографа DS203 (он же и выступает генератором):К сожалению, у меня нет более качественного источника сигнала, но для низкочастотных сигналов моя система должна подойти. Надо отметить, что не каждый преобразователь USART-USB обеспечивает скорость 460800 бит/сек при полной загрузке канала. Преобразователь на базе CP2102 заставил меня долго искать ошибку в собственном коде, пока я не попробовал FT232. Также наблюдается потеря порядка 0.17% данных (в программе для компьютера приняты меры, чтобы не терялась синхронизация данных). Скорее всего это вызвано плохой линией USART, либо недоработкой в программе. В общем, для 90% применений не должно быть критично, но ставить на АЭС скорее всего не стоит.

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

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

Занятие 5. Аналого-цифровой преобразователь (АЦП, ADC) – PDF

Тема 4. Работа с аналоговыми сигналами Урок 4.1. Потенциометр 4.1.1. Аналоговый сигнал и АЦП Не секрет, что все величины в физическом мире носят аналоговый характер. Для измерения этих величин, люди придумали

Подробнее

Занятие 6. Широтно-импульсная модуляция 1. Управление уровнем напряжения Как нам уже известно, микроконтроллер умеет работать исключительно с цифровыми данными. Он легко может выполнять арифметические

Подробнее

Занятие 3. Обработка входных сигналов 1. Выключатель (switch) Выключатель это прибор, который позволяет замыкать и размыкать электрическую цепь. При этом, смена состояния выключателя может происходить

Подробнее

Номер редакции 2 ИНДИКАТОР ОБЪЕМА ТОПЛИВА KARAKAR FLI-AF УФА 2013 г. СОДЕРЖАНИЕ 1 ВВЕДЕНИЕ.3 2 ОПИСАНИЕ И РАБОТА…3 2.1 НАЗНАЧЕНИЕ ИЗДЕЛИЯ…3 2.2 ОБЛАСТЬ ПРИМЕНЕНИЯ..3 2.3 ТЕХНИЧЕСКИЕ ХАРАКТЕРИСТИКИ…4

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ МОСКОВСКИЙ АВИАЦИОННЫЙ ИНСТИТУТ (НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙЙ УНИВЕРСИТЕТ) Дисциплина: Проектирование устройств на программируемой элементой базе Учебное пособие

Подробнее

ИЗМЕРЕНИЕ РАССТОЯНИЯ ПРИ ПОМОЩИ ИНФРАКРАСНОГО ИЗЛУЧЕНИЯ Ло Ван Хао Научный руководитель: Нестеренко Т.Г. Томский политехнический университет, г. Томск Научные исследования были первой областью, где нашли

Подробнее

Усилитель для фотодиодов со встроенным термохолодильником AMT-07M Руководство по эксплуатации Содержание 1. Назначение 3 2. Условия эксплуатации 4 3. Вид прибора и элементы интерфейса 5 4. Порядок работы

Подробнее

СПЕЦИФИКАЦИЯ 1. ОСОБЕННОСТИ SMIC EEPROM КМОП 0,18 мкм Разрядность 10-бит Частота тактирования 100 МГц Высокие значения реального динамического диапазона на частотах выходного сигнала до 25 МГц Регулируемый

Подробнее

Audio DSP процессор BM2114dsp Содержание 1. Назначение устройства… 2 2. Описание… 2 3. Комплектация… 3 4. Подключение… 3 5. Подключение внешних устройств… 5 6. Настройки устройства… 6 7. Техника

Подробнее

ФЕДЕРАЛЬНОЕ АГЕНТСТВО ПО ОБРАЗОВАНИЮ Государственное образовательное учреждение высшего профессионального образования «НАЦИОНАЛЬНЫЙ ИССЛЕДОВАТЕЛЬСКИЙ ТОМСКИЙ ПОЛИТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ» А. В. Вольф, Е.

Подробнее

УДК 68.5. СИСТЕМА ПОЗИЦИОНИРОВАНИЯ И КОНТРОЛЯ УГЛОВОГО ПОЛОЖЕНИЯ УСТРОЙСТВ ПОВОРОТА Комаров А. Л. Научный руководитель доцент Иванов В.И. Сибирский федеральный университет Устройства поворота используются

Подробнее

По вопросам продаж и поддержки обращайтесь: +7(843) 206-01-48 (факс доб.0), ivs@nt-rt.ru http://irvis.nt-rt.ru ТЕРМОАНЕМОМЕТР МНОГОФУНКЦИОНАЛЬНЫЙ ИРВИС-ТА5.1 РУКОВОДСТВО ПО ЭКСПЛУАТАЦИИ Казань 2010 г.

Подробнее

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

Подробнее

Данное описание распространяется на контроллеры SMH2010 с программным ядром SmLogix. Оглавление Введение 1. Выбор схемы подключения аналоговых датчиков 1 2. Программирование 6 3. Изменения и дополнения

Подробнее

Занятие 1. Мобильная платформа МР1 1. Характеристики и возможности Роботы на колесном шасси без сомнения являются самыми распространенными. Именно колесный робот стал первой мобильной системой, способной

Подробнее

DMX КОНТРОЛЛЕР / РЕДАКТОР АДРЕСОВ K-8000D 4096 пикселей, SD карта, 5В 1. Основные сведения 1.1. Многофункциональный контроллер для управления гибким неоном, светодиодными лентами «бегущий огонь», светодиодными

Подробнее

Адаптер контроллеров АК-1 адресуемое интеллектуальное устройство, предназначенное для преобразования выходного интерфейса контроля и управления RS232 Контроллера Микропроцессорного электропитающих установок

Подробнее

«Основы микроэлектроники с использованием Ардуино» 9 класс 2 ПОЯСНИТЕЛЬНАЯ ЗАПИСКА Развитие современного производства дало толчок такому направлению как микроэлектроника. Все больше устройств появляется

Подробнее

LN-DMX-SPI 5-24В, 170 пикселей Конвертор DMX-SPI 1. Основные сведения об изделии LN-DMX-SPI предназначен для управления светодиодными источниками света, поддерживающими протокол SPI. Управляется цифровым

Подробнее

МИКРОСХЕМА ШЕСТНАДЦАТИРАЗРЯДНОГО ЦИФРО-АНАЛОГОВОГО ПРЕОБРАЗОВАТЕЛЯ С ПАРАЛЛЕЛЬНЫМ ИНТЕРФЕЙСОМ И ТОКОВЫМ ВЫХОДОМ (РАДИАЦИОННО-СТОЙКАЯ). 1586ПА3У Главный конструктор разработки В.А. Власов 2014 г. 2014 1

Подробнее

ЦИФРОВОЙ АКСЕЛЕРОМЕТР ZET 7151 РУКОВОДСТВО ПО ЭКСПЛУАТАЦИИ ЭТМС.421425.001-151 РЭ ООО «ЭТМС» Оглавление 1 Назначение и технические характеристики… 3 1.1. Назначение цифровых датчиков… 3 1.2. Условия

Подробнее

RaspiRobot простой контроллер коллекторных моторов Raspberry Pi Микрокомпьютер Raspberry Pi мог быть недорогим и функциональным контроллером для робототехники, если бы не одно но. В Raspberry Pi недостаточно

Подробнее

Общая информация Отладочная плата UNI-DS6 обеспечивает универсальную среду для программирования и экспериментирования с различными микроконтроллерами от разных производителей. Многочисленные модули, такие

Подробнее

МИКРОСХЕМЫ ДВЕНАДЦАТИРАЗРЯДНЫХ АНАЛОГО-ЦИФРОВЫХ ПРЕОБРАЗОВАТЕЛЕЙ С ПОСЛЕДОВАТЕЛЬНЫМ ИНТЕРФЕЙСОМ 1586ПВ1У Краткое описание. Главный конструктор разработки А.В. Власов 2013 г. 2013 Оглавление 1 Общие положения…

Подробнее

Демонстрационно-отладочная плата Eval17. Техническое описание. 1. Общие положения. Демонстрационно-отладочная плата Eval17 (далее Eval17) предназначена для демонстрации функционирования микроконтроллеров

Подробнее

Основы дискретизации сигналов (3 вопроса по 3 балла) 1. Преобразование непрерывных изображений и звука в набор дискретных значений в форме кодов называют информатизацией трансляцией кодированием дискретизацией

Подробнее

АВТОНОМНЫЙ РЕГИСТРАТОР ZET 7173 ZET 7173 РУКОВОДСТВО ПО ЭКСПЛУАТАЦИИ ЭТМС.421425.001-173 РЭ ООО «ЭТМС» Оглавление 1 Назначение и технические характеристики… 3 1.1. Назначение автономных регистраторов…

Подробнее

Требуемые инструменты, приборы, материалы Для подключения регистратора температуры «HI-P21» (далее – устройство) к терминалу GALIELOSKY (далее терминал) необходимо иметь: 1. Электромонтажный инструмент.

Подробнее

БЛОК ЦАП-5И-S ПВС5.422.096 ТО ТЕХНИЧЕСКОЕ ОПИСАНИЕ 2 СОДЕРЖАНИЕ 1. НАЗНАЧЕНИЕ…3 2. ФУНКЦИОНАЛЬНЫЙ СОСТАВ БЛОКА…3 3. ХАРАКТЕРИСТИКИ…3 4. РАСПРЕДЕЛЕНИЕ АДРЕСОВ…4 5. ПРИНЦИП РАБОТЫ БЛОКА…4 6. ПОДКЛЮЧЕНИЕ

Подробнее

e Service S 4965 DiSPLAY Сервисный прибор для линейки котлов c контроллером CVBC серии S4965: E.C.A., De Dietrich, Novum Feg, Данко, Маяк и др. 04.2014 Индикация должна быть понятной! Прибор расширяет

Подробнее

Тема 3. Индикация Урок 3.1. Сегментный светодиодный индикатор 3.1.1. Устройство сегментного индикатора Мы уже познакомились со светодиодом одним из наиболее часто используемых индикаторов. Обычным светодиодом

Подробнее

Терминал ввода-вывода данных DK-8072 Руководство пользователя Содержание 1 Введение…3 1.1 Назначение…3 1.2 Технические характеристики…3 1.3 Описание разъемов…4 2 Набор команд…5 2.1 Описание формата

Подробнее

Блок аналоговых сигналов БАС-02 Уважаемый потребитель! В связи с постоянной работой по совершенствованию блока аналоговых сигналов БАС-02, повышающей его надежность и улучшающей условия эксплуатации, в

Подробнее

Источник: https://docplayer.ru/41081328-Zanyatie-5-analogo-cifrovoy-preobrazovatel-acp-adc.html

Ссылка на основную публикацию
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}