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

OSBoy notes.

Записки обо всём.

ATtiny13 — Регулятор ШИМ с использованием АЦП

В предыдущем примере был подробно рассмотрен принцип работы ШИМ в AVR микроконтроллерах, на примере ATtiny13. Теперь же рассмотрим пример реализации ШИМ регулятора.

Все опыты я провожу на своей отладочной плате, соответственно код привожу применительно к ней:

Видим, что код программы очень похож на код из предыдущего примера. Разница лишь в том, что в предыдущем примере, для демонстрации изменения ШИМ-сигналов на выходе, значение регистров сравнения плавно изменялось в бесконечном цикле, а здесь же — мы будем менять их вручную, с помощью переменного резистора, подключенного ко входу аналого-цифрового преобразователя (АЦП). На моей плате переменный резистор подключен ко входу ADC2 (PB4). АЦП будет отслеживать изменение входного напряжения и соответственно изменять значения регистров сравнения для таймера ШИМ.

Настройка АЦП

Рассмотрим подробнее, какие регистры отвечают за работу АЦП.

Регистр ADMUX (ADC Multiplexer Selection Register).
Для ATtiny13 его структура выглядит следующим образом:

Бит 6 — REFS0 (Reference Selection Bit): выбирает опорный сигнал напряжения для АЦП: *

  • 0 — в качестве опорного используется напряжение Vсс;
  • 1 — используется внутренний источник опорного напряжения 1.1В.

Бит 5 — ADLAR (ADC Left Adjust Result): Определяет порядок записи результатов преобразования в регистры ADCL и ADCH (см. ниже).

Биты 1-0 — MUX1-0 (Analog Channel Selection Bits): Отвечают за выбор входного канала: *

  • 00 — ADC0 (PB5);
  • 01 — ADC1 (PB2);
  • 10 — ADC2 (PB4);
  • 11 — ADC3 (PB3).

* Если какой-либо из битов REFS0, MUX0, MUX1 изменяется во время преобразования, изменение не будет действовать до тех пор, пока это преобразование не будет завершено (пока не установится бит ADIF в регмстре ADCSRA).

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

Регистр ADCSRA (ADC Control and Status Register A):

Бит 7 — ADEN (ADC Enable): Установка этого бита активирует АЦП. Если сбросить этот бит во время преобразования, то преобразование остановится.

Бит 6 — ADSC (ADC Start Conversion): Запускает преобразование. В режиме одиночного преобразования, нужно устанавливать этот бит для каждого преобразования. В режиме автоматического преобразования — нужно установить этот бит для запуска первого преобразования.

Бит 5 — ADATE (ADC Auto Trigger Enable): Активирует автопреобразование. АЦП начнет преобразование на положительном фронте триггерного сигнала. Источник триггера выбирается установкой бита выбора триггера АЦП: ADTS регистра ADCSRB.

Бит 4 — ADIF (ADC Interrupt Flag): Флаг прерывания АЦП. Устанавливается по завершению преобразования, когда регистры данных обновились.

Бит 3 — ADIE (ADC Interrupt Enable): Разрешает прерывания АЦП.

Биты 2-0 — ADPS2-0 (ADC Prescaler Select Bits): Устанавливают предделитель тактовой частоты для АЦП:

  • 000 — 2;
  • 001 — 2;
  • 010 — 4;
  • 011 — 8;
  • 100 — 16;
  • 101 — 32;
  • 110 — 64;
  • 111 — 128.

Регистры данных ADCH и ADCL.

Результат аналого-цифрового преобразования может принимать значения от 0 до 2 n -1 (где n — число разрядов АЦП). В ATtiny13 на борту десятиразрядный АЦП. Соответственно, результат АЦП может принимать 1024 значения (от 0 до 1023).
0 (0x00) — будет соответствовать входному напряжению 0В;
1023 (0x3FF) — входному напряжению, равному выбранному опорному (в зависимости от значения бита REFS0 регистра ADMUX).

По завершению преобразования, результат записывается в регистры данных ADCH и ADCL (соответственно, cтарший и младший регистры данных АЦП), в зависимости от значения бита ADLAR регистра ADMUX. Если бит ADLAR установлен — то ориентирование данных левое, если сброшен (по умолчанию) — то правое:

Когда ADCL считывается, регистр данных ADC не обновляется, пока не будет прочитан ADCH. Таким образом, если выбрано левое ориентирование данных (ADLAR=1) и нам достаточно 8-битной точности, то достаточно прочитать значение ADCH. В противном случае — сначала нужно считать значение ADCL, затем ADCH.

Регистр ADCSRB (ADC Control and Status Register B):

Биты 2-0 — ADTS2-0 (ADC Auto Trigger Source): Выбирают источник сигнала для старта преобразования в режиме автоизмерения. Преобразование будет запускаться каждый раз при установке выбранного флага прерывания:

  • 000 — постоянно запущено;
  • 001 — аналоговый компаратор;
  • 010 — внешнее прерывание INT0;
  • 011 — таймер/счётчик T0, по совпадению с регистром сравнения A;
  • 100 — таймер/счётчик T0, по переполнению;
  • 101 — таймер/счётчик T0, по совпадению с регистром сравнения B;
  • 110 — внешнее прерывание PCINT0.

Бит 6 — ACME (Analog Comparator Multiplexer Enable): в этой статье я не буду затрагивать применение этого бита, т.к. аналоговый компаратор — это уже отдельная тема.

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

Регистр DIDR0 (Digital Input Disable Register 0).

Биты 5-2 — ADC3D-ADC0D (ADC3-0 Digital Input Disable): Если какой-либо из входов ADC3-0 используется как аналоговый, то в соответствующий бит ADC3D-ADC0D нужно устанавливать логическую единицу. При этом, буфер цифрового ввода на соответствующем выводе АЦП отключается для экономии энергии. Соответствующий бит PIN-регистра при этом всегда будет содержать ноль.

Возвращаемся к нашей программе.

Итак, мы настроили таймер для ШИМ, и запустили АЦП: он будет постоянно отслеживать напряжение на входе ADC2, регулируемое переменным резистором, а каждый раз по окончанию преобразования будет срабатывать прерывание ISR(ADC_vect), в теле которого будут изменяться значения регистров сравнения для ШИМ-таймера, в зависимости от измеренного напряжения на входе АЦП. И не забываем, после настройки прерывания, разрешить прерывания глобально!

RoboZone.SU

  • Главная
  • Правила
  • Контакты
  • Просмотров: 71596
  • Автор: administrator
  • Дата: 19 июля 2008

BASCOM AVR – тестируем АЦП (ADC) — аналого-цифровой преобразователь.

АЦП ( ADC – analog digital converter ) – аналого-цифровой преобразователь.

АЦП присутствует практически во всех моделях современных МК, в том числе и в серии mega производства фирмы ATMEL. С помощью него можно выполнять множество полезных действий – контролировать напряжение, обрабатывать различные сигналы с сенсоров и датчиков, преобразовывать аналоговый аудио сигнал в цифровую форму и тд. и тп. Так что же представляет из себя АЦП?

Аналого-цифровой преобразователь конвертирует входящий аналоговый сигнал (напряжение) в цифровую форму. Разрешение преобразователя указывает на то количество дискретных значений которое он может дать. В данном примере используется микроконтроллер ATmega32 (наш контроллер MRC40 с экспериментальным модулем). В этом МК имеется 8 входов АЦП, каждый из которых имеет разрешение 10 бит. Соответственно каждый канал выдает 1024 дискретных значений. Для примера мы подключили построечный резистор к выводу 0 порта А по следующей схеме.

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

Результаты преобразования выводятся на текстовый ЖК-модуль. Значения представлены на дисплее в качестве дискретных значений (0 до 1023).

Предварительно рассмотрим команды и функции для работы с АЦП в компиляторе BASCOM AVR.

Конфигурирование аналого-цифрового преобразователя

ADC = single / ADC = free

PRESCALER – делит внутреннюю частоту МК на 2,4,8,16,32,64 или 128 так как для работы АЦП требуется частота от 50-200 КГц, параметр AUTO автоматически выберет наиболее подходящий коэффициент деления частоты.

Reference – выбор источника опорного напряжения. A REF – внешний источник, AVCC – напряжение питания схемы, INTERNAL – внутренний источник опорного напряжения на 2,56 в.

Start adc

V = GETADC(0)

Print V

STOP ADC – остановка режима аналого-цифрового преобразования.

V = GETADC(channel) – получение результата преобразования с конкретного канала (пина порта). Channel – номер канала АЦП.

На основе вышесказанного напишем тестовую программу:

$regfile = «m32def.dat» ‘ используем ATmega32 (MRC40 с универсальным модулем)

$crystal = 16000000 ‘ частота установленного кварца 16 mHz

$lib «lcd4.lbx» ‘используем 4-х битное подключение дисплея с помощью альтернативной библиотеки

‘Библиотека lcd4.lbx использует следующее подключение —

‘RW = PortB.1 в данном варианте не используется — просто подключен (так же его можно подключить на землю)

‘E2 = PortB.3 данный вывод используется для подключения некоторых дисплеев с двумя чипами (здесь не используется)

‘указываем конфигурацию подключения дисплея к портам МК

Config Lcdpin = Pin , Rs = Portb.0 , E = Portb.2 , Db4 = Portb.4 , Db5 = Portb.5 , Db6 = Portb.6 , Db7 = Portb.7

Config Lcd = 16 * 2 ‘используем дисплей на 2 строчки по 16 знакомест в каждой

Config Adc = Single , Prescaler = Auto , Reference = Avcc ‘ конфигурация АЦП

Start Adc ‘запускаем аналого-цифровое преобразование

Wait 1 ‘задержка 1 секунда

Cursor Off ‘отключаем отображение курсора на ЖК

Cls ‘очитка дисплея

Locate 1 , 4 ‘позиция курсора

Lcd «RoboZone.SU» ‘выводим надпись

Locate 2 , 5 ‘ позиция курсора

Lcd «ADC test» ‘выводим надпись

Wait 2 ‘задержка 2 секунды

‘главный цикл программы

W = Getadc(0) ‘считываем результат с пина 0 порта А.

Locate 1 , 4 ‘ позиция курсора

Lcd «ADC(0):» ; W ; » » ‘выводим результат преобразования на ЖК

Waitms 100 ‘ зедержка 0,1 секунды

Вращая движок построечного резистора вы изменяете напряжение на входе АЦП, что отобразится на экране ЖК. Значения будут изменяться в диапазоне от 0 до 1023.

Читайте также  Виды измерительных приборов в метрологии

Полученные дискретные значения, с помощью несложных расчетов можно превратить к примеру в вольты — получится простой вольтметр =). Экспериментируйте.

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

_________________
Порой мне кажется, что я делаю какое-то дерьмо, но когда я вижу, что делают другие, то я чувствую себя гением.

_________________
only pure true norwegian blackx

JLCPCB, всего $2 за прототип печатной платы! Цвет — любой!

Зарегистрируйтесь и получите два купона по 5$ каждый:https://jlcpcb.com/cwc

_________________
Меня зовут Димон .

Сборка печатных плат от $30 + БЕСПЛАТНАЯ доставка по всему миру + трафарет

_________________
only pure true norwegian blackx

При замене в современном автомобиле электромеханических реле на интеллектуальные силовые ключи PROFET производства Infineon необходимо учитывать особенности их коммутации по сравнению с «сухими контактами» реле, а также особенности управления с их помощью различными типами нагрузок.

_________________
Меня зовут Димон .

Вебинар посвящен проектированию и интеграции встроенных и внешних антенн Quectel для сотовых модемов, устройств навигации и передачи данных 2,4 ГГц. На вебинаре вы познакомитесь с продуктовой линейкой и способами решения проблем проектирования. В программе: выбор типа антенны; ключевые проблемы, влияющие на эффективность работы антенны; требования к сертификации ОТА; практическое измерение параметров антенн.

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

_________________
Меня зовут Димон .

_________________
only pure true norwegian blackx

_________________
Меня зовут Димон .

Плохая идея. И память так не сэкономите.

Вообще не пойму, мы в начале 90х живём и zx-спектрум — суперкомпьютер? Если не хватает ресурсов — возьмите МК пожирнее. Они сейчас в пять раз дешевле бутылки пива.

ISR (ADC_vect) //Обработчик прерывания от интегрированного АЦП
<
unsigned int ADCdata; //Буферная переменная для. хранения
ADCdata = ADCW; //результата преобразования
if (ADCdata > (2046 / 5)) PORTB = 1; //Если U > 2 В
else if (ADCdata
_________________
Docendo discimus

вроде все делаю по Евстифееву. но!
Не фурычит:(
Помогите провести операцию по трансплантации попы рук на место

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

я понял, что можно завести АЦП в режиме непрерывного преобразования.
соответственно результат можно получить практически всегда из регистра ADCH/ADCL.

Наверное, можно. Но правильнее было бы написать обработчик прерывания по завершению преобразования и брать данные уже там.

Дальше
Я пишу на ассемблере, а на Си программировал только для компьютеров, поэтому не очень хорошо знаком с Си-шными нотациями применительно к программированию для МК.
Но вот эта запись

Counter); //вывожу переменную с АЦП в порт.

>i)&1); //PB0 = DS. Show bit? getting of shr on pos geting circular counter i.
PORTB = PORTB|0b010; //PB1 is set 1.
>
PORTB = (PORTB&0b111000)|0b000100; //PB3 is SW.
>

ISR(ADC_vect)
<
if ((ADCH>>1) != (ResultADC>>1)) // отбрасываю младший разряд и проверяю, есть ли изменения. Устранение «дребезга»
<
ResultADC = ADCH;
>
>

int main(void)
<
cli(); //Запретил прерывания, дабы не повадно было
DDRB = 0b00111; //установил пол порта на вход, половину на выход
PORTB = 0b00000; //вЫключил порт
//========Разрешения прерываний АЦП микроконтроллера======
ADCSRA = ADCSRA|(1

соответственно этот код выводит в сдвиговый регистр значение «без проблем».

По поводу чтения из регистров.
В ДШ и у Евстифеева сказано, что регистры ADCL и ADCH блокируются для записи, до тех пор, пока не будет прочитан ADCH.
соответственно у меня идет выравнивание влево, и 2 разряда я игнорирую.
В протеусе — работает


сказано:

В моем случае, 8 бит мне за глаза

У меня код заведен на непрерывное преобразование. Но! есть одно но! Если в обработчике прерывания ADC_vect ничего нет — протеус деятельность не иммитирует.
Возможно в реальном камне такая же фигня. Так что по окончании преобразования, я подтираю шумок. и протеус моделит. Я с этими граблями натрахался за 2 дня. Реализую наверное так.

AVR Урок 22. Изучаем АЦП. часть 2

Урок 22

Изучаем АЦП

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

Дальнейшая задача – реализация АЦП в нашем проекта.

Ну и чтобы нам данную задачу выполнить, нам нужны будут определённые функции для обращения к АЦП контроллера.

Для этого зайдём в файл adc.c и создадим функцию инициализацию нашего АЦП

void ADC_Init ( void )

Также создадим на данную функцию прототип в хедер-файле adc.h для видимости её из внешних модулей, а также заодно и посмотрим всё содержимое данного файла

void ADC_Init ( void );

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

Начнем с управляющего регистра

void ADC_Init ( void )

ADCSRA |= (1 ADEN ) // Разрешение использования АЦП

|(1 ADPS2 )|(1 ADPS1 )|(1 ADPS0 ); //Делитель 128 = 64 кГц

Это не две строки, а одна, так писать в студии можно и даже нужно, так как код становится понятнее. А одна, потому что нет символа конца строки – точки с запятой.

Здесь мы включили бит ADEN, тем самым включили вообще модуль АЦП, а также установили делитель на 128, тем самым, помня то, что частота тактирования у нас 8 МГц и разделив её значение на 128, мы получили работу АЦП на частоте 64 кГц, что вполне нормально и надёжно, до 200 граничных далеко. Как видим, ничего сложного в инициализации регистра нет.

Также ещё в данной функции нам необходимо выбрать канал, к которому мы будем подключать измеряемое напряжение. У нас судя по схеме канал 0, поэтому соответствующий MUX мы и включим. А соответствующий MUX – это все нули в данных битах, поэтому ничего-то и включать не надо. Но мы ещё помним, что в регистре ADMUX у нас помимо всего прочего есть и управляющие биты, а именно биты REFS1 и REFS0, с помощью которых мы установим в качестве источника опорного напряжения внутренний источник на 2,56 вольта, а ADLAR мы не используем

ADCSRA |= (1 ADEN ) // Разрешение использования АЦП

|(1 ADPS2 )|(1 ADPS1 )|(1 ADPS0 ); //Делитель 128 = 64 кГц

ADMUX |= (1 REFS1 )|(1 REFS0 ); //Внутренний Источник ОН 2,56в, вход ADC0

Ну вот, в принципе, и вся инициализация.

Вызовем эту функцию в главном модуле программы в функции main() где-нибудь вот тут

LCD_ini (); //Инициализируем дисплей

ADC_Init (); //Инициализируем АЦП

clearlcd (); //Очистим дисплей

Ну и также нам нужна будет в модуле adc.c ещё одна функция, которая будет инициализировать непосредственно начало процесса аналого-цифрового преобразования в нашем ADC

Читайте также  Мониторинг параметров пк на pic

unsigned int ADC_convert ( void )

Само собой нужен будет в хедер-файле прототип на неё

void ADC_Init ( void );

unsigned int ADC_convert ( void );

Данная функция нам вернёт значение из регистровой пары ADC, которая и будет содержать величину нашего электрического сигнала в единицах, выражающих отношение измеряемого сигнала к опорному и умноженных на количество возможных отрезков, которых у нас 1023, ну или 1024. Насчёт этого ходят много слухов, но в технической документации на контроллер в расчетной формуле содержится именно 1024. Но это нам не так важно.

Включим преобразование с помощью бита ADSC

unsigned int ADC_convert ( void )

ADCSRA |= (1 ADSC ); //Начинаем преобразование

Теперь нам надо как-то отследить тот момент, когда данное преобразование закончится. А делается это достаточно легко с помощью мониторинга того же бита ADSC, который по окончании процесса преобразования сам сбрасывается в (When the conversion is complete, it returns to zero). Отслеживается данный бит с помощью условного цикла

ADCSRA |= (1 ADSC ); //Начинаем преобразование

while (( ADCSRA & (1 ADSC ))); //проверим закончилось ли аналого-цифровое преобразование

Ну и по окончании вернём результат в виде беззнаковой величины

while (( ADCSRA & (1 ADSC ))); //проверим закончилось ли аналого-цифровое преобразование

return ( unsigned int ) ADC ;

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

unsigned int adc_value ;

Вызовем функцию преобразования, которая нам положит в нашу переменную результат преобразования

adc_value = ADC_convert (); //Вызовем преобразование

Давайте сначала отобразим данную сырую величину, хотя бы посмотрим, что в ней есть. За основу мы пока возьмём код из наших часов, функция sprintf на помощь придёт в более поздних занятиях, время её пока не пришло и нам надо вообще понять, как преобразовываются символы. Это нам ой как пригодится в программировании светодиодных индикаторов

sendcharlcd ( adc_value /1000+0x30); //Преобразуем число в код числа

sendcharlcd (( adc_value %1000)/100+0x30); //Преобразуем число в код числа

sendcharlcd (( adc_value %100)/10+0x30); //Преобразуем число в код числа

sendcharlcd ( adc_value %10+0x30); //Преобразуем число в код числа

Здесь мы разбиваем по цифрам четырёхзначную величину.

Теперь мы соберём код, прошьём контроллер и посмотрим наши результаты, покрутив резистор на 10 килоом

Вот так вот оно всё и работает.

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

unsigned int adc_value ;

float n ;

Также забудем про существование функции sprintf и попробуем получить плавающий тип на дисплее программным путём. Для этого сначала преобразуем наш сырой результат в плавающий тип явным образом, то есть та же цифра будет, но только тип другой, не забыв, конечно, перед этим поставить курсор в нужное место на дисплее. Для этого существует понятие в языке СИ явного преобразования типов и разделим преобразованный результат на 400

sendcharlcd ( adc_value %10+0x30); //Преобразуем число в код числа

setpos (8,0);

n = ( float ) adc_value / 400;

Тут, конечно, возникает вопрос, а почему мы делим именно на 400. А вот почему.

Это ничто иное как 1024, разделённое на 2,56, то есть на наше опорное напряжение. Видимо, не зря разработчики контроллера выбрали именно такую величину опроного напряжения, чтобы всё делилось без остатка. Почему мы именно такое деление применяем. А потому что у нас есть формула в технической документации

Вот поэтому и мы и вычислили её самую последнюю часть. Осталось теперь лишь только перевернуть ещё наоборот, выразив отсюда входное напряжение, так как неизвестное у нас именно оно. И мы получим, что оно будет у нас равно ADC, делённому на 400, что мы, собственно и сделали выше в коде. Я думаю, всё предельно стало теперь всем понятно.

Осталось самое интересное – отобразить всё это на экран, зная, то.что мы не можем работать с дисплеем с плавающим типом. А оказывается всё просто. Всё решается вот таким кусочком кода

n = ( float ) adc_value / 400;

sendcharlcd (( unsigned char ) n +0x30); //Преобразуем число в код числа

sendcharlcd (‘.’); //Преобразуем число в код числа

sendcharlcd ((( unsigned char ) ( n *10))%10 +0x30); //Преобразуем число в код числа

sendcharlcd ((( unsigned char ) ( n *100))%10 +0x30); //Преобразуем число в код числа

Не пугайтесь, сейчас мы всё тут разрулим.

Сначала мы обратным преобразованием типов отсекаем вооще всю дробь и, зная, что дальше 9 мы не уйдём и у нас будет только одна цифра, да мы даже и дальше 2 тут не уйдём, у нас максимум 2,56, мы просто отображаем данную цифру.

Ну дальше по понятным всем причинам будет точка, обычная точка, никакая не плавающая.

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

Подобным образом поступим с цифрой следующей, только здесь мы умножаем результат на 100, что переносит в единицы уже вторую цифру после запятой. Можно продолжить дальше, но нам и двух цифр хватит.

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

Вроде бы и всё. Но мы с вами не испытали работу АЦП посредством прерываний.

Поэтому данные испытания мы проведём в следующей части нашего занятия.

Программатор и дисплей можно приобрести здесь:

Смотреть ВИДЕОУРОК (нажмите на картинку)

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

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

— ATtiny13 стоит дешевле;
— В ATtiny13 более оптимально используются ресурсы микроконтроллера;
— Размеры;
— Энергопотребление;
— Просто мне так захотелось.

Конечно на мои аргументы можно найти множество контраргументов, например ATmega8 при использовании V-USB может превратится в плату ввода/вывода которой не нужен переходник с UART на USB, правда кроме последнего, и с этим пожалуй не поспоришь.

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

Пару слов по схеме, кстати, вот она:

Скажу сразу, что не плохо бы уделить внимание фильтру питания, у меня это два конденсатора 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, отладка и всякое такое.

Что делает данные код — по началу создаётся программный 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.
Вот фьюзы из калькулятора фьюзов:

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

roboforum.ru

Технический форум по робототехнике.

  • Список форумовМастерскаяМикроконтроллеры
  • Изменить размер шрифта
  • Версия для печати
  • Магазин
  • Правила
  • Wiki
  • FAQ
  • Регистрация
  • Вход

Как в Bascom-е включить усиление в АЦП?

Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 00:49

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

Вопрос, как в васике сконфигурировать услиение в АЦП?
Или дурная идея?

Добавлено спустя 9 минут 37 секунд:
я так понимаю нужно теребенить MUX0 на предмет выставления в нем значения 01011
но боюсь васик меня не поймет.

Добавлено спустя 2 минуты 7 секунд:
опс. в меге88 нет такого усиления.

Добавлено спустя 4 минуты 16 секунд:
опа. зато в меге16 и меге32 есть.

так что снова продолжаем рыть.

Re: Как в Bascom-е включить усиление в АЦП?

avr123.nm.ru » 09 ноя 2008, 00:52

Re: Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 00:56

вот здесь для меги128 и по русски и вроде как перевод ДШ
http://www.gaw.ru/html.cgi/txt/doc/micr . 128/12.htm

но всё равно ни чё не понятно, а в ДШ тем более.

Re: Как в Bascom-е включить усиление в АЦП?

avr123.nm.ru » 09 ноя 2008, 00:59

у меня в курсе по AVR наверняка понятно — задача-упражнение 9 — http://avr123.nm.ru/z09.htm

=======
А может просто копаратор встроеный в AVR использовать как дискриминатор ? Сигнал через разделительный конденсатор 0.1 мкФ подают на входы компаратора через 2 резистора по 10 кОм например, а вход «-» заземляют конденсатором. т.е. на «-» сигнал идет через ФНЧ — его частоту нужно взять раза в 3 ниже частоты сигнала. На выходе копаратора будет цифровой сигнал — поток «1» и «0». Вход «-» нужно подключить резисторами по 1 мОм к земле и к питанию.

Re: Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 01:07

не, не прояснилось.

вот что я на рыл в хелпе васика

The GETADC() function only will work on microprocessors that have an A/D converter.
The pins of the A/D converter input can be used for digital I/O too.
But it is important that no I/O switching is done while using the A/D converter.
Make sure you turn on the AD converter with the START ADC statement or by setting the proper bit in the ADC configuration register.

Some micro’s have more then 7 channels. This is supported as well. The ADCSRB register contains a bit named MUX5 that must be set when a channel higher then 7 is used. The compiler (lib routine) will handle this automatic. This is true for new chips like Mega1280, Mega2560 and probably other new chips with 100 pins.

An example on how to read singled ended input on a Mega1280:
W = Getadc(0 , 64) ‘ from data sheet : 100000 ADC8
W = Getadc(1, 64) ‘ from data sheet : 100001 ADC9
This will read channel 0 and 1. The offset is 64 in order to use singled ended input.

но почему 64 .
там же нет такого коофициента усиления.

Re: Как в Bascom-е включить усиление в АЦП?

avr123.nm.ru » 09 ноя 2008, 01:11

64 это не усиление, а просто смещение на двоичное число 100000

Вот это прикололо !

Напиши конкретно — какой режим АЦП тебе нужен.

Re: Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 01:21

Re: Как в Bascom-е включить усиление в АЦП?

Кирилл » 09 ноя 2008, 01:23

Re: Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 01:28

а 100001 тоже 64 .

Добавлено спустя 3 минуты 29 секунд:
1. я правильно понимаю, что берем мегу32 и к ноге ADC0 подключаем УЗ-применик, а ADC1 так же как и вторую ногу УЗ-приемника вешаем на землю?
2. что и в какой последовательности нужно писать в ADMUX чтобы получить усиление 200?

Re: Как в Bascom-е включить усиление в АЦП?

Кирилл » 09 ноя 2008, 01:32

Re: Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 01:40

Re: Как в Bascom-е включить усиление в АЦП?

Кирилл » 09 ноя 2008, 01:45

Re: Как в Bascom-е включить усиление в АЦП?

EdGull » 09 ноя 2008, 01:52

Re: Как в Bascom-е включить усиление в АЦП?

Кирилл » 09 ноя 2008, 01:55

Re: Как в Bascom-е включить усиление в АЦП?

avr123.nm.ru » 09 ноя 2008, 01:57

100000 и 0 это 64 (100000 0 ) канал АЦП 0

100000 и 1 это 64 +1 (100000 1 ) канал АЦП 1

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1