elchupanibrei (elchupanibrei) wrote,
elchupanibrei
elchupanibrei

Category:

Лабораторный блок питания. Вольтметр, работа с АЦП.

Решил тут пилить лабораторный блок питания. В фавориты выбились три участника: раз, два, три, три, три.



Первые два не понравились шумами ШИМ-а на выходе. Третий не понравился архаичным управленим. Буду скрещивать ужа с ежем - линейник номер три и немного магии.

Сердцем будет Arduino Nano v3.0 на чипе FTDI. В место ШИМ-а два 12-bit ADC MCP4725. Так же в ролях участвуют: энкодер, термистор для котроля температуры радиатора и вентилятора, клон четырехстрочного ЖКИ экрана на HD44780 и пару операционников.

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



Сегодня расскажу как обстоят дела с первыми двумя модулями "adc.h" и "voltmeter.h". Встроенный АЦП Atmega328 имеет разрядность 10 бит. Существует програмный способ разогнать АЦП до любого заряда с помощью оверсемплинга. Подробнее об этом написанно здесь. Согласно таблице из документа, оптимальный вариант - 14 бит. 10 железных + 4 програмных. При этом сохраняется баланс между точностью (см. шестую колонку в таблице) и "скростью" (третья колонка). Скрость взята в кавычки не случайно, четыре програмных бита стоят нам лишних 256-и измерений.


Можно пойти еще дальше и аппаратно разногнать частоту измерения. За ее увеличение/уменьшение отвечает делитель называемый prescale. Он показывает во сколько раз тактовая частота АЦП меньше системной частоты. Prescale изменяется двумя битами ADPS2/ADPS2 в регистре ADCSRA. Например у Arduino Nano 5v тактовая частота 16 МГц. Если мы выставим prescale равный 128, то скорость АЦП будет равна 16000кГц / 128 = 125кГц. Именно на такой частоте работает АЦП в Arduino IDE.

У этого метода есть одна неприятная особенность - с ростом частоты снижается эффективая разрешающая способность АЦП. Это хорошо видно на графике.

Atmel не рекомендует увеличивать частоту выше 200кГц. Я заметил искажения результатов только после 250кГц, prescale = 64.

У Atmega328 одно измерение занимает 13 тактов или 250 / 13 = 19 мкс. На 14 бит мы тратим 256 * 19 = 4864мкс = 0.0049сек. Это значит, что максимальная частота измеряемого сигнала не должна превышать ~200Гц.

Второй важный элемент любого АЦП - это источник опорного напряжения. Чем лучше его стабильность тем выше точность наших измерений. Типичная ошибка новичков - использовать в качестве ИОН-а обычный регулятор типа LM7805, LM1117 с точностью 5%. В Atmega328 есть встроенный опорник на 1.1 вольт. Если он активирован, то нельзя подавать на AREF напряжение выше встроеннго ИОН-а.

К сожелнию встроенного опорника мне не хватило. Термистор подключен к 5в по стандартной схеме делителя в качестве R1. Сопротивление R2 выбранно 100кОм. Так как проводимость моего термистра при 25С равна 100кОм, то на выходе будет 2.5в, что за гранью добра. Пока в качестве "опорника" взял встроенный в FTDI стабилизатор на 3.3в. Качество стабилизации овно. Выдает 3.4в и плавает вслед за входным. Для отладки проекта сойдет, потом заменю на правильный - REF02. Выбрал его из-за дешевизны, на ebay просят $2.5 за две штуки.

Входное сопротивление ADC у Atmega328 около 10кОм. Поэтому желательно выбирать R2 в делителе меньше входного у меги.Чтоб не спалить "камень", делитель надо расчитывать так чтоб на при максимальном напряжении на входе, на выходе было не больше Vcc + 0.5в, а при минимальном не ниже -1в. Я выбрал 100кОм / 8.2кОм.


Сравнил 10 и 14 бит. Предел измерений 0..40 вольт. Подал на вход 4.95в. Результат на фотографии. Справа количество отсчетов АЦП. Вывод - если нужен один знак после запятой то 10 бит вполне подойдут, если два то только 14 бит. Третьему знаку после запятой верить не стоит и в финальной версии блока я его уберу. В следующей части раскажу о "thermistor.h".


Пока тестил код словил интересный глюк - сумашедшие значения. Теперь все переменные объявляю не просто int x, а только так int x = 0.

Все важные параметры такие как напряжение ИОН-а "REFERENCE_VOLTAGE", частота АЦП "ADC_PRESCALE" и передискретизация "EXTRA_ADC_RESOLUTION", прописанны в "adc.h" и легко меняются под ваши задачи.

Значение делителя и пин для вольтметра задается в "voltmeter.h" или сразу в теле функции если нужно больше двух.

Код проекта тут.
Tags: #arduino, arduino
Subscribe

  • Контроллер фена на STM32

    Собрал фен на китайском контроллере с STM32 на борту. Корпус выдержан в стиле паяла на STM32. Контроллер брал за $35. Ручка $12. Разъем GX16-8…

  • Зарядное устройство ISDT Q6 Nano

    Поменял свой iMax-B6 на ISDT Q6 Nano. Помещается на ладонь руки. Способен отдавать до 8A/200W. ISDT Q6 Nano Нормально заряжает Ni-Ca и Ni-Mh…

  • Зажим на автомобильный насос

    Поменял на автомобильном насосе зажим. Офигительная штука. Прощай втыкание с 100500 попытки. Всегда с первого раза и без утечек. Брал за $1.8.…

  • Post a new comment

    Error

    Anonymous comments are disabled in this journal

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

  • 3 comments