Лабораторный блок питания

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

TheGupic пишет:

Начеркал схему...

 

Piccy.info - Free Image Hosting

Я бы R1 и R2 увеличил в 10 раз. Да и по выходу не вижу электролитов... Думаю пульсации на выходе будут нормальные.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

А ОУ обязательно чтобы был LM358AM? Или же можно LM358N?

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Автор, загляньте сюда.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

Я надеюсь английский язык не есть проблемой?

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

ОУ у меня и стоит LM358N. Просто когда схему черкал не обратил внимания. Уже видео просмотрел там видно...

Английский без проблем. :)

Я уже нашел решение (так думаю)... Очень простой и думаю ефективный выход в плане точности. Минимум работы. В основном в прошивке. Сделаю отпишусь.

HWman
HWman аватар
Offline
Зарегистрирован: 26.02.2013

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Все гениальное просто! В схему будет добавлен только один резистор (здесь это R1) который имеет сопротивление в 50...100 раз больше основного (R2). Таким образом PWM1 остается тот что есть. А PWM2 будет выдавать шим для точной подстройки.

Как это будет реализовано в програмной части:

Изначально на PWM2 будет подаватся такой же сигнал как и на PWM1. Это ни на что не повлияет. Но как только выходное напряжение будет в пределах +/- 0,05 В от заданного, PWM1 остается неизменным, а PWM2 будет исполнять "точную подстройку" увеличивая или уменьшая свое значение.

Например: нужно на выходе иметь 5в. Есть только 4. Постепенно повышаем PWM на обоих выходах. Как только напряжение будет в пределах между 4,95...5,05 в - PWM1 останавливается к примеру на значении 80, а последующая подстройка будет производится менее влиятельным PWM2 в большую или меньшую сторону от значения 80 (в зависимости от ситуации).

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

Я бы не поставил здесь шим. Простой RC-цепочкой всю переменную составляющую не погасить.  Наверняка она пролезает до выхода БП, и рано или поздно вы это заметите.  Сейчас DAC микрух пруд пруди, на любой вкус, и любой разрядности. Все же закупают в ибеях ардуины, шилды, что бы не взять и DAC микросхему?? Взять хотя бы простецкий tlc5615. 10 бит, 3 провода в дуню, + питание и аналоговый выход,  не нужно никакой обвязки. Не ужели жалко 2$ за эту маленькую и удобную вещь? 

a5021
Offline
Зарегистрирован: 07.07.2013

Не придумывайте. Оба. Смотрите, как все легко и просто делается с помощью 16-битного таймера. Предположим, есть желание получать произвольное напряжение посредством ШИМа от 0 до 5 вольт с точностью 1 милливольт. Условимся, что точное значение логической единицы равно ровно пяти вольтам. Пять вольт это 5000 милливольт. Ровно до стольки должен считать счетчик таймера, чтобы изменение коэффициента заполениния ШИМ на единицу приводило к изменению напряжения на выходе интегрирующей цепочки на 1 милливольт. Если счетчик будет считать до 5000, а потом сбрасываться на ноль, то частота ШИМа будет 16Мгц/5000 = 3200 герц.

Эксперимент. Допустим, нужно получить на выходе интегрирующей цепочки ровно 886 милливольт. Строим SPICE-модель в программе моделирования. У меня это Micro-Cap 9.

V2 это примитив цифрового генератора, который изображает ардуину в модели. Для рисунка выше он выдает сигнал амплитудой 5 вольт, частотой 3200 гц и длительностью импульса (коэфф. заполнения) 55.375 микросекунд. Это точная модель сигнала, которую бы выдавал ардуина при записи числа 886 в регистр таймера, определяющий коэффициент заполнения.

Виртуальный осциллограф дает следующую картину:

 

Синий график это цифра с генератора (сильно растянут по временной шкале), красный -- напряжение после первой интегрирующей цепочки (R2C1), зеленый -- после второй (R3C2).

Вот код, который последовательно (через 1с) выдаст три разных напряжения (10мв, 886мв и 4.096в) на инегрирующей цепочке, если она будет подключена к  9-у выходу (для ардуино уно) или PORT B bit 1 atmega328p.

void setup() {

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 16000,000 kHz
// Mode: Fast PWM top=ICR1
// OC1A output: Non-Inverted PWM
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 0,0625 us
// Output Pulse(s):
// OC1A Period: 0,0625 us
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(1<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (1<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (1<<WGM13) | (1<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);

//   hex 1388 = dec 5000   
ICR1H=0x13;   // high byte of 1388
ICR1L=0x88;   // low byte of 1388        

// configure PORT B bit 1 as output  (TIMER 1 ch. A) 
DDRB=(0<<DDB7) | (0<<DDB6) | (0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (0<<DDB0);

}

void loop() {
  // set 10 mV
  OCR1AH=0x00;
  OCR1AL=0x0A;
  delay(1000);
  // set 886 mV
  OCR1AH=0x03;
  OCR1AL=0x76;
  delay(1000);
  // set 4.096 V
  OCR1AH=0x10;
  OCR1AL=0x00;
  delay(1000);
}

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

a5021, собрал точно по вашей схеме и скетчу, (зафиксировал 4,096 вольта) и вот что показывает реальный осциллограф  -127 милливольт помех по переменке,  что будет творится на выходе такого БП -неизвестно..  А выход дешевого ЦАП даёт порядка 25 мв шума, т.е.  примерно как на картинке, но без пиков-выбросов. По-моему выбор очевиден...

a5021
Offline
Зарегистрирован: 07.07.2013

А это не электролиты ли некачественные такие иглы дают? Нет возможность на керамике проверить?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

a5021, на электролиты не похоже, проверил их на  rlc-метре -ёмкость и esr в пределах нормы, ещё есть танталки без ног,  но лень было паять.  Электролиты с бОльшей ёмкостью картинки не меняют. С керамикой тоже попробывал, у меня были на 0,1 и  плёночные 1 мкф, но с любым сопротивлением выбросы были ещё больше. (Возможно нужно очень высокоомные, не пробывал). И заметил любопытную вещь - если к выходу фильтров первоначальной схемы подключить ещё один резистор на 1к, то выбросы чудесным образом уполовиниваются. Т.е. пульсации становятся порядка 50мв. Причём нагрузкой служит щуп осцилла с импендансом 10Мом/13pf. Видимо с ёмкостью щупа в этом случае образуется третий фильтр. Попробывал подключить электролит паралельно щупу -ипульсы вырастают :)  В общем тёмное это дело.. возможно активным фильтром можно добиться приемлимых пульсаций, но стоит ли оно того..

 

a5021
Offline
Зарегистрирован: 07.07.2013

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

UPD.  Распаял на макетке элементами 1206 два резистора по килоому последовательно. От средней точки два керамических кондера по 10мкф (параллельно) на землю. На выходе еще одна такая же десятка на землю. Если хотя бы чуть-чуть были пульсации, обязательно приложил бы снимок, но тут снимать оказалось совсем нечего. Заленился даже фотоаппарат доставать.

Измерил напряжения. Выдает вместо 4.096в, три вольта с какими-то восьмерками (не запомнил точное значение). Ардуина (мега256) подключена по USB. Посмотрел, что по питанию приходит. Оказалось 4.7 вольта. Подключил через внешний блок. Стало 4.95. На выходе интегратора -- 4.09 (точнее китайский мультиметр не показывает).

Решил проверить нижнюю часть диапазона. Выбрал значение 195 милливольт. Мультиметр показывает 197.2  но и вместо ноля показывает 2 милливольта. Это уже, скорее всего, наводки на проводах мультиметра дают о себе знать.

Мой древний осциллограф имеет нижний предел 10мв/дел. (большая клетка). В принципе, импульсы 1мв, если приглядеться, на нем можно увидеть. На таком разрешении я не увидел каких-то помех или выбросов.

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

"Интегратор" в профиль и анфас:

Для уменьшения наводок соединительные провода были сделаны из экранированного аудиокабеля от сидюка, разрезаного напополам (третий провод, белый, в эксперименте не использовался):

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

UPD2. Еще подумалось, что можно завернуть напряжение с интегратора на аналоговый вход и измерить.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

a5021, как то вы очень оптимистичны с выводом в последней фразе :) Что касается вашей проверки сглаживания -всё таки осмелюсь предположить, что ваш осцилл не в состоянии захватить такие мелкие уровни хаотичного сигнала и пики выбросов. Вы не пробывали без RC-фильтра подать на закрытый вход осцилла очень острый шим, скажем OCR1A=10; или OCR1A=4990;  и завести через делитель на 50. Это частично с эмулирует мой сигнал. У меня острый шим довольно чётко видно, а что-бы увидеть ту картинку, что я запостил ранее пришлось смотреть фрагмент из памяти осциллографа, иначе  в реальном времени  практически не синхронизировалось. Если вы правы и наводка у меня, значит виноватым может быть только фильтр, у меня он был на беспаячной макетке, это конечно плохая основа для работы с милливольтами. На днях найду время, сделаю точно такую плату как ваша, постараюсь сделать идентичной, у меня даже есть такая-же макетка. Проведу замер, и тогда  будет окончательно ясно.  А заодно может сразу попробую собрать активный фильтр на опере, на него пока есть надежда.

a5021
Offline
Зарегистрирован: 07.07.2013

dimax пишет:

a5021, как то вы очень оптимистичны с выводом в последней фразе :)

А может у меня есть к этому повод. :)

Цитата:

Что касается вашей проверки сглаживания -всё таки осмелюсь предположить, что ваш осцилл не в состоянии захватить такие мелкие уровни хаотичного сигнала и пики выбросов. Вы не пробывали без RC-фильтра подать на закрытый вход осцилла очень острый шим, скажем OCR1A=10; или OCR1A=4990;  и завести через делитель на 50. Это частично с эмулирует мой сигнал.

Осциллограф мой конечно не блещет, но частоты мегагерц до 20-30 на нем разглядеть все еще можно. Я допаял к интегратору еще и делитель, образованный из сопротивлений номиналом 47к и 1к. Расчетное напряжение на нем должно составить 104мв при пяти вольтах входных. Т.к. входное у меня чуть ниже, то и величина на делители получилась поменьше. Ну и значение OCR1A я уменьшил от предложенного вами на половину, чтобы уж совсем вопросов не остававлось. Получилось вот это:

В одной клетке 0.02 вольта и 0.2 микросекунды. Попутно для себя выяснил/вспомнил, что значение в OCR1A означает к.заполнения+1. При записи туда нуля на выходе наблюдается импульс длительностью 62.5 наносекунды. Именно из за осциллографа я и узнал/вспомнил, что ноль это не совсем ноль. :)

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

В формуле наличествует основание натурального логарифма "e", что позволяет заключить, что функция является логарифмической. Логарифмическая функция выглядит так:

Для наших условий, ось X будет отображать время, ось Y -- напряжение. Область отрицательных значений Y для нас интереса не представляет, т.к. отрицательных напряжений в нашей цепи не просматривается.

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

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

Цитата:
У меня острый шим довольно чётко видно, а что-бы увидеть ту картинку, что я запостил ранее пришлось смотреть фрагмент из памяти осциллографа, иначе  в реальном времени  практически не синхронизировалось.

Так и есть. Бывает, чтоб отловить шальную помеху, сто потов сойдет. :)

Цитата:
Если вы правы и наводка у меня, значит виноватым может быть только фильтр, у меня он был на беспаячной макетке, это конечно плохая основа для работы с милливольтами.

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

Цитата:
А заодно может сразу попробую собрать активный фильтр на опере, на него пока есть надежда

Есть у меня подозрение, что это совершенно пустое занятие. :)

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

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

Вот что получилось:

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

Видно как единица "болтается"  счастотой 16 мгц и размахом 18мв. 

С выводами пока не определился, хотя уже однозначно такое шим-управление не хуже дешевого цап для многих применений )

a5021
Offline
Зарегистрирован: 07.07.2013

Я конечно же ни в чем не уверен, но не может у вас быть проблемы со щупами? Обе картинки оставляют какое-то ощущение нереальности. А шина питания, как выглядит? А просто напряжение на аккуме с подключенным ардуиной?

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

a5021, у меня два варианта щупов, один с переключаемым коэффициентом деления, второй родной от осцилла с фиксированным,  с ними одинаковый результат. А что там должно быть на выходе фильтра шима, не прямая же линия? Любое цифровое устройство шумит, шум лезет через воздух, через паразитные индуктивности, итп.   В принципе измерять напряжения меньше 10мв сложно, т.к. щуп начинает работать антенной. Я бы переключил осциллограф на 50 Ом, и эффект антенны бы пропал, но  тогда выход с фильтра по-постоянке капитально просядет, и данные и по пост. и по перем. будут не действительны. Если сделать активный фильтр на ОУ, то можно будет измерить на 50 омах, и получить более точный результат :)

На шине питания (выход +5 с ардуино) рисунок примерно как последний, и размах 14мв. Если запитать от БП, то и размах больше и хаоса больше.  Если просто подсоединить щуп к аккуму, отключив ардуино, то шум примерно 3мв, (шумит на всех частотах) шум с закороченным входом осцилла 800мкв. В принципе большинство импульсных бп дают примерно 30..50мв шума, логично что и все выходные уровни могут трястись с этой амплитудой, да ещё и в такт процессору. Попробую завтра собрать фильтр на оу, и на этом закончу эксперементы)

art100
Offline
Зарегистрирован: 09.03.2014

А по моему все елементарно Шерлоки Холмсы. У кого-то просто свежий осцилограф и щуп, по сравнению с высохшим 67-ым. У меня самого С1-93. Я помню как студентом лабы на нем сдавал и то что он сейчас не чувствует. А с чего вас так шумы напрягли? Какая практическая проблема? Ну трясет микропроцессор переферию. И шо? Проблема? Индуктивность(дроссель) вас расслабит. RС цепочки RС цепочки ...Самое главное L-Хвост. Тфу-ты. Индуктивность. ;) Надо и мне фоточку поэкзотичней вставить :) C1-93 никого не удивишь. Такими осцилографами кто-нибудь блоки питания делал? Развлекался?

 

a5021
Offline
Зарегистрирован: 07.07.2013

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

На клеммах исправного и никуда не подключенного аккумулятора никакого шума быть не может в принципе. Это нонсенс. Японцы вон dc-dc модули продают с выходным шумом 20мкв, а у вас на аккумуляторе светопредставление случилось.

Я не знаю какой антенной может быть щуп, но я за своим каких-либо особых радиоприемных свойств не наблюдал. Щуп, кстати, не высохший c1-67, а вполне себе приличный китаец с полосой в 60мгц, зацепом и золочеными контактами. Так что, art100, глупостей не говорите там.

Насчет собственных шумов в 800мкв это вообще нечто удивительное. Например, советский осциллограф конца 80-годов прошлого столетия c1-117 имеет чувствительность 100мкв/дел. и при замнутых щупах на экране наблюдается ровная линия. Это говорит о том, что если там и есть шумы, то они много меньше 10мкв.

Про пульсации на интеграторе. После первой цепочки пульсации составляют 18мв, после второй -- 65мкв. Это расчетные значения полученные в SPICE-модели.

Синий график -- напряжение после первой интегрирующей цепочки, красный -- после второй.

А вот это пульсации после первой цепочки реального интегратора:

В одной клетке 10 милливольт, это видно по ручке "усиление". Кабель, кстати, слева от ручки. Прочие установки видны на картинке.

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

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

dimax, все-таки у вас что-то либо с организацией измерений, либо с осциллографом.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

a5021, конечно на аккуме скорее всего измеряется шум, наведённый на щуп. Кстати если я замыкаю щуп не руками, а переключателем на щупе -то шум всего 200мкв, ещё большую роль играет ограничение диапазона, если установить до 20мГц (меньше к сожалению нет опции) то шум уже заметно снижается. У вас вроде осцилл до 10 мгц, т.е. шум от тактовой 16мгц он уже покажет с огромным ослаблением а скорее не покажет вообще, если этот шум изначально с уровнем в 20 мв.  так что логично что у вас на осцилле  прямая линия на лог 1, и на питании. Правда это не объясняет почему я вижу пики от шима 3кгц, а вы нет.

minamonra
Offline
Зарегистрирован: 18.06.2014

Что-то я не понял работа по лабу прекратлась? Может продолжим?

По поводу регулировки тока вот такой вариант оптимален.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

minamonra, вы имеете ввиду регулировку цифровым потенциометром, которую обсуждают на той странице? У него очень маленькая разрядность, и что с шумом не ясно. Схема того лабораторного БП похоже довольно хорошая и малошумящая, и поставить туда цифровой элемент = ухудшить параметры.  Можно конечно топорно крутить переменник сервой, но возится с механикой занятие на любителя.. )) А если хорошие параметры не нужны, то проще сделать классический шим-БП, управляемый контроллером. Его и придумывать не нужно, готовых схем полным, лучше просто передалать комповый.  Но я лично пользуюсь самопальным линейным  БП ,без микроконтроллерного управления, даже без ограничения тока. Индикация сделана на классическом icl7107, модернизировать его конечно хотелось-бы.. ))

minamonra
Offline
Зарегистрирован: 18.06.2014

dimax, я ссылку вроде дал на пост человека (jes), который начал ту тему на вертепе, это его модфкаця БП Шелестова, http://vrtp.ru/index.php?showtopic=16392&st=810&#entry470180

Тут опять возник вопрос насчет – “подвязать” микроконтроллер к управлению данным БП.

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

Связываем землю питания БП и землю микроконтроллера, и подаем сформированное напряжение на левый вывод R11, конечно, исключив R7…R9, и все (нумерация деталей – по последнему варианту). 

То, что надо будет откалибровать напряжение ЦАПа и прочее – это подразумевается.



В основном, вопрос ставится, каким образом это сделать для управления выходным током.

Мельком я упомянул в одном из постов, что для этого надо привязать токовый управляющий сигнал к земле питания БП. 

Ну, а дальше – как и в случае регулировки выходного напряжения.

В одном из писем, меня попросили ради интереса привести один из вариантов такой “привязки”.

Самое первое, что приходит в голову – это применить еще один ОУ в инвертирующем включении.

Во вложении – вариант этой реализации.



Краткие пояснения к схеме.

DA1.2, – это ОУ, отвечающий за ограничение выходного тока.

DA2, - ОУ в инвертирующем включении с Кус, равным отношению резисторов R3 и R5.

Усиление необходимо для подгонки нашего токового сигнала к параметрам примененного ЦАПа.



Например, у нас есть ЦАП с нормированным выходным напряжением 0…2.56 Вольт.

Для того, чтобы использовать его шкалу по возможности полнее, надо 1 Вольт (падение на токовом резисторе 0.33 Ом при МАХ выходном токе), привести к 2.56 Вольт. Усиливаем сигнал в 2.5 раза (как раз такое соотношение дают резисторы 30k и 12k), и получаем именно то, что нам нужно. 

Если в распоряжении есть ЦАП с выходным диапазоном 0…5.12 Вольт, делаем подбором резисторов наш Кус = 5, и т.д. 

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



Минусы применения дополнительного ОУ вполне очевидны, это - увеличение числа деталей, для его питания потребуется двухполярное напряжение, возможны проблемы с устойчивостью в режиме ограничения тока (из-за увеличения каскадов усиления). 



P.S.

У кого уже собран данный БП, можете спаять данную схему на небольшой плате, и проверить саму идею.

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

Еще совет.

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

Такая подвязка МК н чуть не ухудшает его работу.

ы. Тот блок питания я собрал.

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

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

minamonra
Offline
Зарегистрирован: 18.06.2014

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

А вот обсуждаемая тут схема имеет серъезный недостаток, обратнай связъю рулит МК, со всеми вытекающими.

Можно и импульсный сделать. Вот например аналоговая часть отсюда.

 

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

minamonra, ну как же, любая цифровая схема -источник помех. А в БП есть чувствительные элементы, которые эту помеху могут усилить и передать на выход.  Или нагрузка такого БП может быть чувствительной. Вот например мне недавно нужно было основательно поработать с RLC-метром, и решил его запитать от БП, что б крону не сажать, тем более разъём для внешнего питания был. БП взял обычный, импульсный. Так показания сразу стали плавать, я сначала подумал прибор накрылся. Но запитал от 12-вольтового аккума, и всё пошло нормально. А блочок вполне приличный был, не больше 30мв шума на выходе...

А я бы сделал вот такой БП может конечно не конкретно этот, мне нравится сама идеология. Просто, доступно, готовый корпус и источник напряжения.

minamonra
Offline
Зарегистрирован: 18.06.2014

Уж простите, но терпеть не могу ATX переделки, только если уж совсем прижмёт. 3525/3846 мне больше по нраву.

Про цифровые шуму я не спорю, но ещё раз повторю, нам от цифры нужен только сигнал с ЦАП, который уже отфильтрован... экранирование и отделение всего цифрового управления никто не отменял, а показометры БП все-равно уже цифра.

Хотя как угодно спорить не люблю.

i-render
Offline
Зарегистрирован: 11.11.2012

TheGupic пишет:

Все гениальное просто! В схему будет добавлен только один резистор (здесь это R1) который имеет сопротивление в 50...100 раз больше основного (R2). Таким образом PWM1 остается тот что есть. А PWM2 будет выдавать шим для точной подстройки.

Как это будет реализовано в програмной части:

Изначально на PWM2 будет подаватся такой же сигнал как и на PWM1. Это ни на что не повлияет. Но как только выходное напряжение будет в пределах +/- 0,05 В от заданного, PWM1 остается неизменным, а PWM2 будет исполнять "точную подстройку" увеличивая или уменьшая свое значение.

Например: нужно на выходе иметь 5в. Есть только 4. Постепенно повышаем PWM на обоих выходах. Как только напряжение будет в пределах между 4,95...5,05 в - PWM1 останавливается к примеру на значении 80, а последующая подстройка будет производится менее влиятельным PWM2 в большую или меньшую сторону от значения 80 (в зависимости от ситуации).

 

 

Добрый день. Очень понравился ваш ЛБП. Уже начал собирать, собрал по последней схеме что есть в этой теме и залил последний скетч. Но показания напряжения ведутсебя странно, все время прыгают на несколько вольт вверх-вниз, хотя реальные показания на мультиметре более стабильные, но тоже постоянно скачат в пределах 0,6-0,8 вольт. Можете выложить последний рабочий скетч который у вас есть? Как там в целом обстоят дела с доработкой? Благодарю заранее.

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

 

Вот похожий проект, но он не на ардуино, хотя на меге 8.  Там исходники программы и части схемы, может это чем-то поможет.

 

http://www.tuxgraphics.org/electronics/200707/bench-power-supply-unit.shtml

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Привет всем. Последний скеч пока ищу... Может найду...

Чтобы напряжение на выходе не колбасило в прошивке нужно подправить две строчки

 

if((Uout-0.05)>counter){
099   float raz = Uout - counter;
100   level = level - raz;
101 }
102 if((Uout+0.05)<counter){
103   float raz = counter - Uout;
104   level = level + raz;
105 }

Как-то так. Суть в том чтобы не менять PWM если реальное значение находится в пределах +/- 0,05В от заданного. 

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Нашел скеч ))))

#include <LiquidCrystal.h>;
#include <EEPROM.h>
#include <PWM.h>
//void upp();
LiquidCrystal lcd(11, 9, 5, 4, 3, 2); //rs, e, d4, d5, d6, d7

 // задаем константы
const int down = 10;    //выход валкодера 1/2
const int up =  8;    //выход валкодера 2/2
const int pwm = 6;  //выход ШИМ 
const int power = 7; //управление релюхой
long previousMillis = 0;        // храним время последнего обновления дисплея
long maxpwm = 0; //
long interval = 500;           // интервал
long myinterval = 2;           // интервал
int mig = 0; //0 стоим 1 плюс 2 минус (чтобы знать в какую сторону крутим валкодер)
float level = 10; //"уровень" ШИМ сигнала
int mode = 0;//режим (0 обычный, спабилизация тока, защита по току)
float Ioutmax = 1.0; //заданный ток
int set = 0; //(настройки: 0 напряжение, 1 режим, 2 ток, 3 по умолчанию)
int knopka_a = 0;
int knopka_b = 0;
int knopka_ab = 0;
float counter = 5; // переменная хранит заданное напряжение
int disp = 0; //режим отображения 0 ничего, 1 мощьность, 2 режим, 3 установленный ток, 4 шим уровень

float Uout ;






void EEPROM_float_write(int addr, float val) // запись в ЕЕПРОМ
{  
  byte *x = (byte *)&val;
  for(byte i = 0; i < 4; i++) EEPROM.write(i+addr, x[i]);
}

float EEPROM_float_read(int addr) // чтение из ЕЕПРОМ
{    
  byte x[4];
  for(byte i = 0; i < 4; i++) x[i] = EEPROM.read(i+addr);
  float *y = (float *)&x;
  return y[0];
}




void setup() { 
  

  

InitTimersSafe(); 

   pinMode(pwm, OUTPUT);
  SetPinFrequency(pwm, 100);
  
  pinMode(down, INPUT);  
  pinMode(up, INPUT);  
  pinMode(12, INPUT); 
  pinMode(13, INPUT); 
  pinMode(power, OUTPUT);
 
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);
 // analogWrite(pwm, 0); //пока на выход не подаем напряжение
  digitalWrite(up, 1); // поддерживаем еденицу на входах от валкодера
  digitalWrite(down, 1);
   digitalWrite(12, 1);
    digitalWrite(13, 1);
  lcd.begin(16, 2); 
  
  
  lcd.print("Loading...");
   
  

counter = EEPROM_float_read(0);
Ioutmax = EEPROM_float_read(4);
mode = EEPROM_float_read(9);
disp = EEPROM_float_read(10);
digitalWrite(power, 1); //включаем реле
}




void uup(){ //валкодер +
  if(set==0){
     if(counter<16.0) { 
      counter = counter+0.1;//добавляем
     }
  }
  if(set==1){
   mode = mode+1;
   if(mode>2) mode=2;
   
}
  if(set==2){
   Ioutmax = Ioutmax+0.05;
   if(Ioutmax>4) Ioutmax=4;
   
}

if(set==3){
 lcd.clear();
   lcd.setCursor (0, 0);
 lcd.print(" S A V E  -  OK ");

 EEPROM_float_write(0, counter);
 EEPROM_float_write(4, Ioutmax);
 EEPROM_float_write(9, mode);
 EEPROM_float_write(10, disp);
 digitalWrite(A4, 1);  
digitalWrite(A5, 1);  
 delay(900);
  digitalWrite(A4, 0); 
 digitalWrite(A5, 0);   
 set = 0;
}
}

void udn(){ //валкодер -
if(set==0){
   if(counter>0.2)counter = counter-0.1; //убавляем
  // if(counter==0.0) counter = 0.1;
}
if(set==1){
   mode = mode-1;
   if(mode<0) mode=0;
   
}  
if(set==2){
   Ioutmax = Ioutmax-0.05;
   if(Ioutmax<0.05) Ioutmax=0.05;
   
}
}

void loop() {
  
  float Ucorr = -0.08; //коррекция напряжения
float Uout = analogRead(A1) * ((5.0 + Ucorr) / 1023.0) * 5.0; //узнаем напряжение на выходе
  
  float Iout = analogRead(A0) * (5.0 / 1023.0); // узнаем ток в нагрузке
  if ((Iout>4.8 | maxpwm>250) & set!=4 & millis()>100 ) // условия защиты
  /*
  (Вырубаем если ток превышает заданный,
  или ШИМ по каким либо причинам зашкалил)
  */
 {
  
   digitalWrite(power, 0); //вырубаем реле
   //выводим инфу
   lcd.clear();
   lcd.print("[ > OVERLOAD < ]");
   lcd.setCursor (0, 1);
   if(Iout>4.8) lcd.print("(Iout>4.8A)");
   if(Uout<0.1) lcd.print("(Uout<0.05v)");
   if(maxpwm>250) lcd.print("(max PWM)");
   
   //зажигаем красный светодиод
   digitalWrite(A4, 1);   
   level = 0; //убираем ШИМ сигнал
   delay(5000); //ждем некоторое время
   digitalWrite(power, 1); //включаем реле
   digitalWrite(A4, 0); //гасим светодиод
   lcd.clear();//очищаем дисплей
   set=0;
   
    maxpwm = 0;
 }
 
  
//Зашита от длительного максимального шим
if (level==255){
  
  if(set<4){ maxpwm++;
  digitalWrite(A4, 1);
  }  
}else{
  maxpwm--;
  if(maxpwm<0){maxpwm = 0; digitalWrite(A4, 0); }
}
  
  // считываем значения с входа валкодера
  boolean regup = digitalRead(up);
  boolean regdown = digitalRead(down);
  
  if(regup<regdown) mig = 1; // крутится в сторону увеличения
  if(regup>regdown) mig = 2; // крутится в сторону уменшения
  if(!regup & !regdown){ //момент для переключения
  
    if (mig==1) uup();//+
    if(mig==2) udn(); //-
    
    mig = 0; //сбрасываем указатель направления
    
  }


/*
Сравниваем напряжение на выходе с установленным,
и принимаем меры..
Тоесть увиличиваем или уменшаем переменную для ШИМ
сигнала на значение отклонения...
например, при разнице в 0.5 вольта
изменяем переменную level на 0.5
Знаю, что выход ШИМ воспринимает только целые значения от 0 до 255
но такой подход позволяет более четко стабилизировать выходное напряжение
Тоесть не реагировать на незначительные погрешности, и 
Реско изменять ШИМ при большой разници заданого и реального напряжения
*/

if(mode==0 | mode==1){

if(Uout>counter){
  float raz = Uout - counter;
  if(raz>0.05){
  level = level - (raz*1);
  }
}
if(Uout<counter){
  float raz = counter - Uout;
  if(raz>0.05){
  level = level + (raz*1);
  }
}



if(mode==1&&Iout>Ioutmax){
   digitalWrite(power, 0); //вырубаем реле
   //выводим инфу

   //зажигаем красный светодиод
   digitalWrite(A4, 1);   
   level = 0; //убираем ШИМ сигнал
   set=4;
   //lcd.clear();//очищаем дисплей
}


}else{ //режим стабилизации тока

if(Iout>Ioutmax){
  float raz = (Iout - Ioutmax);
     level = level - raz;
  if(level<1) level=1;
  if(Uout<1){
    digitalWrite(power, 0); //вырубаем реле
     //зажигаем красный светодиод
   digitalWrite(A4, 1);   
   level = 0; //убираем ШИМ сигнал
   maxpwm = 0;
   set=5;
  }
   //зажигаем синий светодиод
   digitalWrite(A5, 1); 
}else{
digitalWrite(A5, 0);
  if(Uout>counter){
  float raz = Uout - counter;
  level = level - raz;
}
if(Uout<counter){
  float raz = counter - Uout;
  if(raz>0.05){ level = level + raz; }
  //if(level>254) level=254;
}
}
}

if(level<0) level = 0;
if(level>255) level = 255;



analogWrite(pwm, round(level)); //подаем нужный сигнал на ШИМ выход



if (digitalRead(13)==0 && digitalRead(12)==0 && knopka_ab==0 ) { // нажата ли кнопка a и б вместе
knopka_ab = 1;
lcd.clear();
   lcd.setCursor (0, 0);
 lcd.print("Yuriy Voituk");
lcd.setCursor (0, 1);
lcd.print("Made in Kovel.");
 digitalWrite(A4, 1);  
digitalWrite(A5, 1);  
 delay(5000);
  digitalWrite(A4, 0); 
 digitalWrite(A5, 0);  
  knopka_ab = 0;
}

if (digitalRead(13)==0 && knopka_a==0) { // нажата ли кнопка б
knopka_a = 1;
disp = disp + 1;
if(disp==5) disp = 0;


}

if (digitalRead(12)==0 && knopka_b==0) { // нажата ли кнопка б
knopka_b = 1;
set = set+1; if(set>3) {//вырубаем защиту
//level = 0;
digitalWrite(power, 1); //врубаем реле
digitalWrite(A4, 0);  


  set = 0;
  
}

lcd.clear();
}
if(digitalRead(12)==1&&knopka_b==1) knopka_b = 0;
if(digitalRead(13)==1&&knopka_a==1) knopka_a = 0;
if(set==0){
  lcd.setCursor (0, 1);
  lcd.print("U>");
 
 if(counter<10) lcd.print(" "); //добавляем пробел, если нужно, чтобы не портить картинку
  lcd.print (counter,1); //выводим установленное значение напряжения
  lcd.print ("V "); 

 
 
  
  unsigned long currentMillis = millis();
  
  /*проверяем не прошел ли нужный интервал, если прошел то
  выводим реальные значения на дисплей*/
  
  
 
  


  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего обновления
    previousMillis = currentMillis;  
   lcd.setCursor (0, 0);
 lcd.print("U=");
 if(Uout<9.99) lcd.print(" ");
  lcd.print(Uout,2);
  lcd.print("V I=");
  lcd.print(Iout, 2);
  lcd.print("A ");
  
  if(disp==0){  
  lcd.setCursor (8, 1);
  
  lcd.print("         ");
  }  
  
  if(disp==1){  
  lcd.setCursor (8, 1);
  lcd.print(" ");
  lcd.print (counter * Iout,2); 
  lcd.print("W   ");
  }
  
    if(disp==2){  
  lcd.setCursor (8, 1);
  if(mode==0)lcd.print   ("standart"); 
   if(mode==1)lcd.print  ("    down"); 
    if(mode==2)lcd.print ("    drop");
  }
  
  
      if(disp==3){  
  lcd.setCursor (8, 1);
   lcd.print (" I>"); 
   lcd.print (Ioutmax, 2); 
    lcd.print ("A ");
  }
  
        if(disp==4){  
  lcd.setCursor (8, 1);
   lcd.print (" pwm:"); 
   lcd.print (ceil(level), 0); 
   lcd.print ("  ");
    
  }
  
  


  
  }
  /*
  if(set==1){//выбор режима
    lcd.setCursor (0, 1);
    lcd.print("U/set:");
  }
  */
}
    if(set==1){//выбор режима
     lcd.setCursor (0, 0);
 lcd.print("> MENU 1/3    ");
   lcd.setCursor (0, 1);
 lcd.print("mode: ");
  if(mode==0)  lcd.print("normal          ");//режим (0 обычный, спабилизация тока, защита по току)
 if(mode==1)  lcd.print("shutdown  ");
 if(mode==2)  lcd.print("drop      ");
  }
      if(set==2){//настройка тока
     lcd.setCursor (0, 0);
 lcd.print("> MENU 2/3   ");
   lcd.setCursor (0, 1);
 lcd.print("I out max: ");
 lcd.print(Ioutmax);
 lcd.print("A");
  }
  
  if(set==3){//настройка тока
     lcd.setCursor (0, 0);
 lcd.print("> MENU 3/3      ");
   lcd.setCursor (0, 1);
 lcd.print("Save options? ->");
 
  }
  
  if(set==4){//защита. вывод инфы
     lcd.setCursor (0, 0);
 lcd.print("ShutDown!        ");
   lcd.setCursor (0, 1);
 lcd.print("Iout");
  lcd.print(">Imax(");
 lcd.print(Ioutmax);
 lcd.print("A)");
 
  }
    if(set==5){//защита. вывод инфы критическое падение напряжения
     lcd.setCursor (0, 0);
 lcd.print("ShutDown!        ");
   lcd.setCursor (0, 1);
 lcd.print("Uout < 1.0V      ");

  }
}

 

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Получил сообщение о неработоспособности скеча. Думаю проблема в настройках по умолчанию, которые сохраняются в энергонезависимой памяти. А они попросту не прописаны. Что сделать:

Заменить строки

081 counter = EEPROM_float_read(0);
082 Ioutmax = EEPROM_float_read(4);

На 

081 counter = EEPROM_float_read(0); if(counter==0) counter = 1;
082 Ioutmax = EEPROM_float_read(4); if(Ioutmax==0) Ioutmax = 1;

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

Отпишите помогло ли это.

i-render
Offline
Зарегистрирован: 11.11.2012

Спасибо за совет. Если заливать этот скетч в первый раз, то он начинает искать охраненные значения из EEPROM и поэтому показывает нулевые значения напряжения( которые нельзя изменить). Я сделал так: закоментил эти строки, загрузил скетч, сделал сохранение настроек в меню, затем залил скетч с раскоментироваными строками и все заработало  :)

counter = EEPROM_float_read(0);
Ioutmax = EEPROM_float_read(4);
mode = EEPROM_float_read(9);
disp = EEPROM_float_read(10);
TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Можно и так :)

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

Очень рад что кто-то решил повторить мое детище ))))

i-render
Offline
Зарегистрирован: 11.11.2012

Подправил код из 32-го поста для использования 10-битного шима, не штатными средствами, конечно-же. Переназначены 6 и 9 порт(поменяны местами, это ВАЖНО). Плюс, добавил отображение PWM чтобы видеть что 10бит реально работают.

#include <LiquidCrystal.h>;
//void upp();
LiquidCrystal lcd(11, 6, 5, 4, 3, 2); //rs, e, d4, d5, d6, d7

 // задаем константы
const int down = 10;    //выход валкодера 1/2
const int up =  8;    //выход валкодера 2/2
const int pwm = 9;  //выход ШИМ 
const int power = 7; //управление релюхой
long previousMillis = 0;        // храним время последнего обновления дисплея
long interval = 500;           // интервал
int mig = 0; //0 стоим 1 плюс 2 минус (чтобы знать в какую сторону крутим валкодер)
float level = 10; //"уровень" ШИМ сигнала
int mode = 0;//режим (0 обычный, спабилизация тока, защита по току)
float Ioutmax = 4.0; //заданный ток
int set = 0; //(настройки: 0 напряжение, 1 режим, 2 ток)
int knopka_a = 0;
int knopka_b = 0;
float counter = 1; // переменная хранит заданное напряжение
void setup() { 
 /**********************************************************************************/
// Set pwm clock divider
/**********************************************************************************/ 
        
  TCCR1B &= ~(1 << CS12);
  TCCR1B  |=   (1 << CS11);
  TCCR1B &= ~(1 << CS10);  

/**********************************************************************************/
// Set pwm resolution  to mode 7 (10 bit)
/**********************************************************************************/ 

  TCCR1B &= ~(1 << WGM13);    // Timer B clear bit 4
  TCCR1B |=  (1 << WGM12);    // set bit 3
  TCCR1A |= (1 << WGM11);    //  Timer A set bit 1
  TCCR1A |= (1 << WGM10);    //  set bit 0      
  
  pinMode(down, INPUT);  
  pinMode(up, INPUT);  
  pinMode(12, INPUT); 
  pinMode(13, INPUT); 
  pinMode(power, OUTPUT);
  pinMode(pwm, OUTPUT);
  pinMode(A4, OUTPUT);
  pinMode(A5, OUTPUT);
  analogWrite(pwm, 0); //пока на выход не подаем напряжение
  digitalWrite(up, 1); // поддерживаем еденицу на входах от валкодера
  digitalWrite(down, 1);
   digitalWrite(12, 1);
    digitalWrite(13, 1);
  lcd.begin(16, 2); 

digitalWrite(power, 0); //включаем реле
}


void uup(){ //валкодер +
  if(set==0){
     if(counter<15.0) { 
      counter = counter+0.1;//добавляем
     }
  }
  if(set==1){
   mode = mode+1;
   if(mode>2) mode=2;
   
}
  if(set==2){
   Ioutmax = Ioutmax+0.05;
   if(Ioutmax>4) Ioutmax=4;
   
}
}

void udn(){ //валкодер -
if(set==0){
   if(counter>0.1)counter = counter-0.1; //убавляем
   if(counter<0.1) counter = 0.1;
}
if(set==1){
   mode = mode-1;
   if(mode<0) mode=0;
   
}  
if(set==2){
   Ioutmax = Ioutmax-0.05;
   if(Ioutmax<0.05) Ioutmax=0.05;
   
}
}

void loop() {
  float Iout = analogRead(A0) * (5.0 / 1023.0); // узнаем ток в нагрузке
  if ((Iout>4.8 | level == 1023) & set!=3) // условия защиты
  /*
  (Вырубаем если ток превышает заданный,
  или ШИМ по каким либо причинам зашкалил)
  */
 {
   digitalWrite(power, 1); //вырубаем реле
   //выводим инфу
   lcd.clear();
   lcd.print("[ >> ERROR! << ]");
   lcd.setCursor (0, 1);
   lcd.print("    overload");
   
   //зажигаем красный светодиод
   digitalWrite(A4, 1);   
   level = 0; //убираем ШИМ сигнал
   delay(2500); //ждем некоторое время
   digitalWrite(power, 0); //включаем реле
   digitalWrite(A4, 0); //гасим светодиод
   lcd.clear();//очищаем дисплей
   set=0;
 }
  
  // считываем значения с входа валкодера
  boolean regup = digitalRead(up);
  boolean regdown = digitalRead(down);
  
  if(regup<regdown) mig = 1; // крутится в сторону увеличения
  if(regup>regdown) mig = 2; // крутится в сторону уменшения
  if(!regup & !regdown){ //момент для переключения
  
    if (mig==1) uup();//+
    if(mig==2) udn(); //-
    
    mig = 0; //сбрасываем указатель направления
    
  }

float Ucorr = -0.0835; //коррекция напряжения
float Uout = analogRead(A1) * ((5.0 + Ucorr) / 1023.0) * 5.0; //узнаем напряжение на выходе
/*
Сравниваем напряжение на выходе с установленным,
и принимаем меры..
Тоесть увиличиваем или уменшаем переменную для ШИМ
сигнала на значение отклонения...
например, при разнице в 0.5 вольта
изменяем переменную level на 0.5
Знаю, что выход ШИМ воспринимает только целые значения от 0 до 1023
но такой подход позволяет более четко стабилизировать выходное напряжение
Тоесть не реагировать на незначительные погрешности, и 
Реско изменять ШИМ при большой разници заданого и реального напряжения
*/

if(mode==0 | mode==1){

if(Uout>counter){
  float raz = Uout - counter;
  level = level - raz;
}
if(Uout<counter){
  float raz = counter - Uout;
  level = level + raz;
}

if(mode==1&&Iout>Ioutmax){
   digitalWrite(power, 1); //вырубаем реле
   //выводим инфу
   /*lcd.clear();
   lcd.print("[ >> ERROR! << ]");
   lcd.setCursor (0, 1);
   lcd.print("    overload");
   */
   //зажигаем красный светодиод
   digitalWrite(A4, 1);   
   level = 0; //убираем ШИМ сигнал
   set=3;
   //lcd.clear();//очищаем дисплей
}
}else{ //режим стабилизации тока

if(Iout>Ioutmax){
  float raz = (Iout - Ioutmax)*10;
  level = level - raz;
  if(level<1) level=1;
  if(Uout<1){
    digitalWrite(power, 1); //вырубаем реле
     //зажигаем красный светодиод
   digitalWrite(A4, 1);   
   level = 0; //убираем ШИМ сигнал
   set=4;
  }
   //зажигаем синий светодиод
   digitalWrite(A5, 1); 
}else{
digitalWrite(A5, 0);
  if(Uout>counter){
  float raz = Uout - counter;
  level = level - raz;
}
if(Uout<counter){
  float raz = counter - Uout;
  level = level + (raz / 10);
  //if(level>254) level=254;
}
}
}

if(level<0) level = 0;
if(level>1023) level = 1023;



analogWrite(pwm, ceil(level)); //подаем нужный сигнал на ШИМ выход


if (digitalRead(12)==0 && knopka_b==0) { // нажата ли кнопка б
knopka_b = 1;
set = set+1; if(set>2) {//вырубаем защиту
level = 0;
digitalWrite(power, 0); //врубаем реле
digitalWrite(A4, 0);  


  set = 0;
  
}

lcd.clear();
}
if(digitalRead(12)==1&&knopka_b==1) knopka_b = 0;

if(set==0){
  lcd.setCursor (0, 1);
  lcd.print("U=");
 
 if(counter<10) lcd.print(" "); //добавляем пробел, если нужно, чтобы не портить картинку
  lcd.print (counter,1); //выводим установленное значение напряжения
  lcd.print ("V ");

  
  unsigned long currentMillis = millis();
  
  /*проверяем не прошел ли нужный интервал, если прошел то
  выводим реальные значения на дисплей*/
  if(currentMillis - previousMillis > interval) {
    // сохраняем время последнего обновления
    previousMillis = currentMillis;  
   lcd.setCursor (0, 0);
 lcd.print("U=");
 if(Uout<9.99) lcd.print(" ");
  lcd.print(Uout,2);
  lcd.print("V I=");
  lcd.print(Iout, 2);
  lcd.print("A ");
  lcd.setCursor (7, 1);
   lcd.print (" pwm:"); 
   lcd.print (level, 0);
  
  }
  if(set==1){//выбор режима
    lcd.setCursor (0, 1);
    lcd.print("U/set:");
  }
}
    if(set==1){//выбор режима
     lcd.setCursor (0, 0);
 lcd.print("MENU");
   lcd.setCursor (0, 1);
 lcd.print("mode: ");
  if(mode==0)  lcd.print("normal          ");//режим (0 обычный, спабилизация тока, защита по току)
 if(mode==1)  lcd.print("shutdown  ");
 if(mode==2)  lcd.print("drop      ");
  }
      if(set==2){//настройка тока
     lcd.setCursor (0, 0);
 lcd.print("MENU");
   lcd.setCursor (0, 1);
 lcd.print("I out max: ");
 lcd.print(Ioutmax);
 lcd.print("A");
  }
  if(set==3){//защита. вывод инфы
     lcd.setCursor (0, 0);
 lcd.print("Shutdown!        ");
   lcd.setCursor (0, 1);
 lcd.print("Iout");
  lcd.print(">Imax(");
 lcd.print(Ioutmax);
 lcd.print("A)");
  }
    if(set==4){//защита. вывод инфы критическое падение напряжения
     lcd.setCursor (0, 0);
 lcd.print("Shutdown!        ");
   lcd.setCursor (0, 1);
 lcd.print("Uout < 1.0V   ");

  }
}

 

art100
Offline
Зарегистрирован: 09.03.2014

кинул последний код в компилятор

  float Uout = analogRead(PINA1) * <code class="plain">((5.0 + Ucorr) / 1023.0)</code> * 5.0; //узнаем напряжение на выходе

sketch_jan25b:119: error: expected primary-expression before '<' token

прикольные тегм :) мне понравилось 

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

ну да... Теги прикольные, но не из этой стихии...

Кстати уже удалось сдеалать 10 ЦАП на ШИМ благодаря i-render. 

Выложил в нет последнюю схему и написал описание по апаратной части. http://start.net.ua/blog/lab_power_arduino/11.html

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

ну да... Теги прикольные, но не из этой стихии...

Кстати уже удалось сдеалать 10 ЦАП на ШИМ благодаря i-render. 

Выложил в нет последнюю схему и написал описание по апаратной части. http://start.net.ua/blog/lab_power_arduino/11.html

dimax
dimax аватар
Онлайн
Зарегистрирован: 25.12.2013

TheGupic, вы так серьёзно все взялись описывать, а где- ж главное, -характеристики?  Диапазон регулировки напряжения/тока, шаг регулировки,  точность установки напряжения/тока,  уровень пульсаций p-p.  Любопытно-ж :-)

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Все будет! Ведь параметры зависят не только от апаратной части, но и от прошивки. Вот доделаю окончательно прошивку, выложу и все так же опишу. Если бы еще осцилограф был... Но думаю, что у кого-то найду в своем городке, чтобы была уже полная картина.

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

i-render пишет:

Подправил код из 32-го поста для использования 10-битного шима, не штатными средствами, конечно-же. Переназначены 6 и 9 порт(поменяны местами, это ВАЖНО). Плюс, добавил отображение PWM чтобы видеть что 10бит реально работают.

Возникла проблема, при прохождении отметки 225 (или около того, по шкале 0-1023) Ардуино выдает максимум (импульс), потом конечно же сбавляет, согласно заложенной программе и т. д. В результате, БП колбасит при напряжении около 4,5 вольт. 

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Временно, а может и не временно решил таким путем

if(round(level)!=255) analogWrite(pwm, round(level)); //подаем нужный сигнал на ШИМ выход

 

i-render
Offline
Зарегистрирован: 11.11.2012

Наконец-то, почти доделал. Использовал AT блок питания. Плату разводил сам под корпус от паяльной станции lukey. Использовал Arduino nano, вывел длянеё mini-USB на правой стенке корпуса. Так-же добавил USB разъем для зарядки различных устройств. На него будет выделена отдельная 7805. Точность довольно хорошая. Все эти дни убил на изготовление девайса, активно ещё не тестил. Осталось закрепить силовой транзистор на более серьёзный радиатор, и можно нагружать по-полной. 

a5021
Offline
Зарегистрирован: 07.07.2013

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

i-render
Offline
Зарегистрирован: 11.11.2012

Размер платы делался по размером той платы которая стояла изначально в паяльной станции. она не пустая, там внизу SMD LM358, резисторы, транзисторы. Просто всё это не попало в кадр. Помех от импульсника пока не наблюдаю, если буду их набблюдать, то придется экранировать плату управления

topsik432
Offline
Зарегистрирован: 05.04.2015

Добрый день!

Вопрос по ARDUINO UNO Индикации информации!!!

Собрал блок питания на ARDUINO UNO + LCD 16x2 с подсветкой. + LM358.

Всё норм вышло, работает на ура. Добился точности показания индикации напряжения и тока.

Но есть одна проблема - через некоторое время работы БП выскакиваю иероглифы (кракозябры) на экране.

Но в тоже время фунционал не пропадает (типа всё работает).

Выключаю БП и снова включаю всё норм.

У кого такая типа была проблема , или кто поможет разобраться ?

Делал по схеме Лабораторный БП на Arduino_1.1.

Фото http://prntscr.com/6vnp23

 

TheGupic
TheGupic аватар
Offline
Зарегистрирован: 17.02.2013

Пропадает контакт от ардуино к дисплею. После чено нужно перезагружать БП.

topsik432
Offline
Зарегистрирован: 05.04.2015

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

Вопрос тогда . Интересно тогда какой контакт или название вывода так влияет на такие ошибки?

topsik432
Offline
Зарегистрирован: 05.04.2015

Паял все контакты на разьёмах(панельках).

http://prntscr.com/6vpr1q

topsik432
Offline
Зарегистрирован: 05.04.2015

Привет TheGupic !!

Есть к тебе предложение!

Хочу прикрутить к Лабораторный БП на Arduino_1.1 (добавить) часы + таймер +датчик температуры + барометр.

Возможно ли так реализовать этот проэкт с этими компонентами?

Для этого заказал :LCD 20x4 с подсветкой . В наличии уже есть Барометр (датчик атмосферного давления) BMP180 , Датчик влажности и температуры DHT11, Датчик температуры DS18B20 , Real Time Clock Модуль с батарейкой (DS1307).

Помоги с этим вопросом!

спс