Но речь не про него. На работе тоже нужен компрессор и чем дальше, тем всё чаще. Дома я научился обходится "привозным" ресивером из гаража, а вот на работу не навозишься... Поэтому решил сделать ещё один экземпляр с некоторыми мелкими изменениями.
Техническое задание:
0) Заводские платы (на макетке сильно долго собирать))))
1) 4 канала управления: 3 канала 220В (2 канала на компрессор + 1 канал на клапан сброса давления) + 1 канал 12 В (на 12ти вольтовый клапан)
2) Аналоговый датчик давления (0-5 Вольт), рабочее давление 0 - 16 бар.
3) Датчик температуры двигателя (DS18B20)
4) LED индикатор (3-4 символа)
5) 3 кнопки управления.
6) Совместимость с Arduino, соответственно МК ATmega8 или ATMega328
7) разъём программирования ISP или USB (если влезет)
8) Питание 12В
Выбор датчика давления.
С момента создания первого компрессора я перманентно искал недорогой, универсальный датчик на давление до 10 (16) бар... Но до сих пор ничего не нашел. Поэтому в этот раз решил вернуться к поискам датчиков от автомобилей. И поиск увенчался успехом на первой же разборке. Я купил два комплекта трубок от Hyundai Genesis и Coupe по 21р (около $8 USD на момент приобретения) с датчиками в обеих комплектах, да ещё и с разъёмами.... Вобщем, пока есть такое на разборках - не вижу смысла искать другой датчик. Схема:
Схема во многом похожа на первую версию, но я решил не применять Arduino nano целиком, а решил контроллер разместить на основной плате. Поэтому схема стала несколько "больше". Устройство логически разделено на две части - силовую и плату индикации.
На силовой части разместились:
1) блок питания в виде модуля (MEAN WELL MPM-20-12 или IRM-20-12 - 12V 1,8A)
2) 3 канала симисторных коммутаторов 220В
3) 1 канал 12В 0,8А для управления клапаном, который подключается вместо (или вместе) с 3м каналом 220В.
На плате индикации разместилось всё остальное))): стабилизатор 5В, ИОН 2,61В, МК, индикатор, кнопки, ISP, разъёмы подключения датчиков, 4й канал 12В 1А (независимый от первых трёх), 4 светодиода индикации состояния каждого выходного канала LED4-LED7, но они нужны скорее для отладки. В качестве контроллера можно использовать ATmega8, ATmega88, ATmega168, ATMega328. Схема не меняется - совпадение по разводке 100%. Изменения в коде программы минимальные, но они выполняются автоматически, ничего руками менять не нужно. Но об этом позже.
Немного про источник опорного напряжения 2,61В.
На датчик давления 42CP8-12 есть скромное описание с указанием формулы пересчёта давления (PSI) в напряжение. Впечатляет, правда? А если сюда добавить ещё формулу пересчёта из BAR в PSI (1 bar = psi / 0,0689475729317831), получится совсем красиво. В итоге я долго игрался с формулами и "доигрался". При опорном напряжении АЦП равном 2,61 В получается следующее:
Давление 0 bar - напряжение на входе 0,5В - значение АЦП (0): 196.
Давление 10,0 bar - напряжение на входе 1,775В - значение АЦП (10): 696.
Давление 16,0 bar - напряжение на входе 2,539В - значение АЦП (16): 995.
Т.е. с таким опорным напряжением теоретический рабочий диапазон данного контроллера с датчиком давления 42CP8-12 составляет 0-16 бар.
Если из АЦП (10) вычесть АЦП (0), то получим 500 значений на диапазон давлений от 0 до 10 бар, или цена деления 0,02 бара. Вроде ничего, и считать в программе очень легко, никаких сложных вычислений: (АЦП - 196) * 2 = значение давления, только точку осталось поставить после первой цифры слева и готово!
Если значение АЦП ниже 196 - обрыв на линии (датчик не подключен), если выше 995 - замыкание на +5В или превышение рабочего давления выше 16 бар.
Печатная плата.
Плату рисовал исходя из размера заготовки 100*100мм и особо не стеснялся с пустым местом - цена вопроса очень низкая. Поэтому получилась вот такая плата. Подключение силовых входов-выходов рассчитано под разъёмы PWL/PHU с шагом 3,96мм, переходной разъём между платами CWF-5 / CHU-5 с шагом 2,5мм. Разъёмы датчиков CWF-3 / CHU-3, разъём ISP - стандартный BH-10... К сожалению, разъём microUSB и обвязка CH340 не влезла на плату (читай "лень одолела"), поэтому программировать МК придётся через ISP разъём.
Ещё про одну особенность платы силовой части забыл описать: если не используется 3й канал 220В, то его можно взять и отрезать, для уменьшения габаритных размеров платы. При этом вся остальная плата не пострадает и даже предусмотрены полноценные крепления "обрезанной" платы. А вместо отрезанного 3го канала 200В, может быть распаян 12-ти вольтовый канал. Хотя они могут работать и параллельно - кому как надо... Вобщем, такая себе унификация. Точно уже не вспомню, но вроде делал "урезанную плату" под какой-то корпус, но маркировки не помню.
В этот раз решил поэкспериментировать с цветом платы. Всегда были дороже в несколько раз, если цвет отличный от зелёного. А в этот раз все по одной цене! Получилось вот так: Собираем силовую часть (2 канала 220В + 12В на клапан), отрезав "лишний" 3й канал 220В. Ну и несколько фото собранных плат индикации в разных вариантах (ATmega8/328, индикатор 3х и 4х разрядные). Не обошлось и без косяков (я же не могу без них). Забыл развести резисторы подтяжки входов кнопок (R41-R43), поэтому лепил их как попало (на фото видно).
Ну и в сборе пара фото. Скачать в формате "Sprint-Layout 6.0": pcb_compressor_v2.3_12.05.2021.rar В архиве исправленная плата.
Платы получились конечно красивые - контрастная шелкография на чёрном фоне смотрится красиво. Но вот флюс отмыть от этой матовой красоты оказалось не просто. Даже банальные отпечатки пальцев сложно стереть. На фото вся эта "красота" видна - я специально не сильно старался оттереть все следы.
Программатор.
К сожалению я поленился разводить USB-TTL преобразователь на CH340 на плате. Да и места осталось не очень много. Поэтому решил, что, при использовании чистых камней всё равно нужно будет заливать bootloader через ISP программатор... А раз есть ISP и через него залили бут, то уже и прошивку можно через него залить. Вобщем решил отказаться от USB порта. Ну а USBasp за пару долларов я думаю каждый может себе позволить. Поэтому шить будем вот таким чудом - USBasp с aliexpress. Выбор среды разработки.
Меня долго упрекали в том, что я использую среду разработки CodeVisionAVR. Она платная и проекты, созданные в одной версии, не всегда компилируются в другой версии. Поэтому решил попробовать сделать проект в Arduino IDE, хоть она и немного непонятна для меня. Зато бесплатная, куча библиотек, поддерживает разные программаторы, ну и т.д. Не скажу, что без труда, но я её "осилил". Для меня так и осталось диким указание выводов не в явном виде типа "PINB.2 / PORTB.5", а просто номером "13"... И из-за этого у меня часто возникала путаница. Зато выросла повторяемость устройства.
Устанавливаем и настраиваем Arduino.
1) Качаем среду разработки Arduino IDE с офсайта. Устанавливаем.
2) Устанавливаем пакет MiniCore c GitHub, выглядит это приблизительно так:
3) Устанавливаем библиотеку OneWire.• Открыть Arduino IDE.
• Открыть Меню - Файл > Настройки.
• Скопировать следующую ссылку в поле "Дополнительные ссылки для Менеджера плат":• Открыть Меню - Инструменты > Плата > Менеджер плат...Code: Select all
https://mcudude.github.io/MiniCore/package_MCUdude_MiniCore_index.json
• Дождаться загрузки и индексирования списка плат..
• Найти в списке (либо поиском) "MiniCore" .
• Нажать "Установка". • После окончания установки закрыть Менеджер плат.
4) Открываем наш проект, выбираем плату MiniCore > ATmega328 (или ATmega8, вобщем выбираем тот процессор, который будем использовать). 5) Делаем настройки платы, основные, которые я менял:• Меню - Скетч > Подключить библиотеку > Управлять библиотеками...
• Ищем библиотеку с названием "OneWire", как показано на картинке. Другие нам не нужны.
• Нажимаем установить, после установки закрываем Менеджер библиотек.
6) Записываем Загрузчик (на скрине выше последний пункт). Бутлоадера у нас нет, но фьюзы установятся правильные.• Clock: "External 16 MHz"
• BOD: "BOD 4.3V"
• Bootloader: "No bootloader"
• Программатор > USBasp slow (MiniCore) - медленный режим нужен один раз для установки фьюзов, потом выбираем USBasp (MiniCore) иначе будет долго шиться.
7) Выбираем Программатор > USBasp (MiniCore) иначе будет долго шиться.
8) Делаем настройки в программе под наше железо (индикатор, датчик температуры, и т.д.) - чуть ниже опишу что к чему.
9) Записываем Скетч (Скетч > Загрузить через программатор Ctrl+Shit+U) Готово!
Прошивка.
Всю прошивку описывать не буду - не вижу смысла, т.к. там прокомментирована почти каждая строчка, отдельно опишу только те настройки, которые придётся менять для адаптации к конкретной сборке. Нас будут интересовать первые 30 строчек кода:
Code: Select all
/*-------------- Hardware defines ------------*/
//#define led_OA //для индикатора с общим анодом, для ОК - закомментировать.
#define hw_4digits //для 3х разрядного индикатора - закомментировать define
#define out_StartPin 19 //PC5 (Arduino pin 19) выход управления запусковой обмоткой (S) CH1
#define out_WorkPin 18 //PC4 (Arduino pin 18) выход управления рабочей обмоткой (R) CH2
#define out_ValvePin 17 //PC3 (Arduino pin 17) выход управления клапаном сброса на силовой плате CH3
#define out_CH4 0 //PD0 (Arduino pin 0) выход управления клапаном сброса на плате индикатора CH4
#define analogPin 7 //ADC7 вход датчика давления
#define hw_ds18b20 16 //PC2(Arduino pin 16) если будет использоваться датчик температуры ds18b20
//если выставить в настройка температуру "0", то температура и наличие датчика игнорируется
//если закомментировать, то в настройках не будет отображаться настройка температуры совсем...
/*-------------- Software defines ------------*/
#define P_max 1600 //16,00 bar Максимальное значение, которое можно установить в настройках.
// Рекомендую ставить максимальное рабочее давление конкретного устройства,
// чтобы пользователь не смог установить больше этого значения.
#define P_min 100 //1,00 bar Минимальное давление, которое можно будет установить в настройках. При этом давлении компрессор будет включаться.
// Для устройств, которые не могут стартовать при большом давлении и не имеют клапана сброса
#define dP 50 //0,50 bar Минимальная разница между P_max и P_min.
#define T_min 300 //300 = 30,0°C минимальная температура для установки защиты от перегрева.
#define ADC_0_bar 196 //значение АЦП при давлении 0 бар, если ниже - ошибка. !!! не трогаем, это привязано к нашим формулам.
#define ADC_16_bar 1006 //значение АЦП при давлении 16 бар, если выше - ошибка. !!! не трогаем, это привязано к нашим формулам.
#define mode_timeout_delay 5000 //задержка выхода из режима настройки параметров (ms)
#define p_min_delay 1000 //задержка старта при давлении ниже установленного (и остановки при давлении выше установленного) (для исключения "дребезга").
#define before_start_delay 1000 //время после открытия клапана и запуском компрессора (мс).
#define start_delay 1000 //время работы обмотки запуска в компрессоре (мс).
#define valve_open_delay 3000 //длительность открытия клапана продувки (мс).
#define ds_refresh_delay 1000 //задержка между опросами датчика температуры DS18B20 (мс). Меньше 750мс не ставить.
#define led_OA - конструкция допускает использование любых семисегментных индикаторов (с общим катодом и с общим анодом). Поэтому для индикаторов с ОК строчку комментируем, для ОА оставляем раскомментированной. Больше ничего менять не нужно в программе. Единственная оговорка, с ОК я проверил, а вот ОА индикаторов у меня нет.
#define hw_4digits - при использовании 4-х разрядного индикатора. Если индикатор 3х разрядный - строчку закомментировать. И опять оговорка, мне удалось приобрести 4х разрядный индикатор только GNQ-2841AS-21. Его особенность - двоеточие посередине для отображения времени, но точка в крайнем левом разряде не используется. Подробней - смотреть даташит. Поэтому была оптимизация под такой индикатор. Если индикатор будет "обычный" (без «:» времени), то придётся немного подкорректировать код.
#define out_StartPin, #define out_WorkPin, #define out_ValvePin, #define out_CH4, #define analogPin, #define hw_ds18b20 - описание куда подключены какие выходы. Как я уже писал выше, нумерация вводит некоторое заблуждение…
Далее идут программные описания.
#define ADC_0_bar, #define ADC_16_bar - не трогаем, это привязано к нашим формулам. )))
Если возникнут непонятки - описание дополню, но вроде подробней уже некуда...
Осталась ещё одна переменная, которая может нас интересовать. Она находится в 139й строке:
Code: Select all
bool ONOFF = false; //переменная которая хранит разрешение работы (включено-выключено). Если TRUE, то разрешена работа компрессора.
//если тут поставить FALSE, то при включении питания компрессор не включится, а контроллер будет отображать
//текущее давление. Если поставить TRUE - сразу после включения питания запустится компрессор, если текущее давление
//ниже установленного.
Чуть не забыл. Исходники (скетч) во вложении. Надеюсь что повторить данное устройство не составит большого труда.