Пять вопросов новичка. Проблема с общей землей БП и arduino
- Войдите на сайт для отправки комментариев
Доброго времени суток.
Не так давно заинтересовался темой С++ и программированием МК (остановился на arduino mega). Покурив мануалы и потыркавшись самостоятельно вроде как сделал готовый проект (полив растений с рядом датчиком и исполняемых устройств - если будет интересно кому - выложу отдельно).
Однако, как и у любого новичка, у меня появилось несколько вопросов, на которые, к сожалению, я не смог найти адекватного ответа. So, прошу помощи:
1. Программирование. Что за тип данных "char"? (используется для получения времени из rtc с библиотекой iarduino_RTC). Почему обязательно надо зведочку и const, чтобы взять символ по индексу? Не знаю насколько это костыли, но мне удалось добиться работы следующего кода:
iarduino_RTC rtc(RTC_DS3231); int chas; // переменная часов int minu; // переменная минут const char *nvm = (rtc.gettime("H-i")); chas = (nvm[0] - '0') * 10 + (nvm[1] - '0'); minu = (nvm[3] - '0') * 10 + (nvm[4] - '0');
Время нужно в int для определения день\ночь. Прошу оценки насколько это эффективно, замудрено или же наоборот глупо :D
2. Схемотехника. Правильно ли объединять землю с МК и землю с БП постоянного тока (всегда да, или всегда нет, или есть ньюансы), правильно ли я понимаю что это единственный способ заставить работать mosfet с управлением от arduino? Можно ли объединять земли с переменного тока (БП и(или) розетка 220) и землю с МК?
3. Схемотехника. Имеем led драйвер (45в max\0,8А), лампу к нему светодиодную(9 * 3в\0,8 А), транзистор mosfet IRF3205. Соотвественно - хочется управлять нагрузкой. При объединении земли с драйвера и МК датчик температуры tmp36 начинает выдавать просто невероятную ахинею, значения скачут от -15 до +90 градусов. Без подключения драйвера значения стабильны +16 градусов, никаких скачков. В чем причина и как от этого уйти? Поможет ли установка диода между землями в направлении МК -> БП (БП -> МК)?
4. Программирование. Скорее всего нет, но я обязан спросить. Есть ли способ заставить МК ожидать, например, нажатия кнопки (логическую единицу на digital) в любом месте кода, вне зависимости от текущей позиции в программе? Или же обязательно выполнение программы должно дойти до строчки, где проверяется наличие логической единицы на определенном пине, а дальше уже if и так далее?
5. Схемотехника. Когда используется транзистор (mosfet) для управления, а когда реле? По сути их действие одинаковое. Чем черевато использовать mosfet для управления переменным током? Если да, то получается что мне нужно объединить землю с МК и ноль с розетки, или нет? Можно ли использовать для отпирания транзистора переменный ток?
Я прошу прощения за, вероятно, глупые вопросы, но самостоятельно в них разобраться так и не смог. Заранее спасибо за любую помощь.
4. Программирование. Скорее всего нет, но я обязан спросить. Есть ли способ заставить МК ожидать, например, нажатия кнопки (логическую единицу на digital) в любом месте кода, вне зависимости от текущей позиции в программе? Или же обязательно выполнение программы должно дойти до строчки, где проверяется наличие логической единицы на определенном пине, а дальше уже if и так далее?
С этим справляются прерывания(почти в любом учстаке кода может "возникнуть" прерывание(внешнее или внутренее) которое надо обработать).Но есть ньюансы - как правило : Interrupt Service Routine должен как можно быстрее завершиться (например в теле ISR выставить flag что кнопа х была нажата ,т.е. никаких printf внутри обработчика) а потом в основном цикле (loop) проверять состояние флага и обрабатывать - предпринимать какие то действия.
4. Программирование. Скорее всего нет, но я обязан спросить. Есть ли способ заставить МК ожидать, например, нажатия кнопки (логическую единицу на digital) в любом месте кода, вне зависимости от текущей позиции в программе? Или же обязательно выполнение программы должно дойти до строчки, где проверяется наличие логической единицы на определенном пине, а дальше уже if и так далее?
дополню предыдущий ответ. Кроме прерываний есть и другие решения. Конечно, "в любом месте кода" ожидать нажатия кнопки программа не может, нужно дойти до строчки, где считывается кнопка.
Однако не слишком сложно написать практически любкю программу так, чтобы строчка проверки кнопки вызывалась. скажем. 30-50 раз в секунду, что обеспечит реакцию программы на кнопки без заметных для человека задержек.
Отвечу, что смогу:
1. Для данного МК char это то же самое, что и byte. В представленном Вами огрызке идет указатель (прочитайте немного про си) на массив, содержащий символьное представление времени.
2. С блоком питания вопрос не понятен - БП чего и что Вы имеете в виду под словом "земля". Далее - с 220В шутки плохи - но если Вы здесь имеете в виду именно "землю", а не нейтраль, то это иногда применяется для защиты от помех. Но поскольку у нас в основном везде "глухозаземленная" нейтраль, выдающая себя за землю, лучше этого не делать. Если Вы имели в виду нейтраль, то делать этого нельзя категорически!
3. Ну тут понятно - помехи от ШИМа. Диод скорее всего не поможет, а вот дроссель с конденсатором - вполне.
Я хочу в копилку это собрать. Редкость, как алмаз неограненный!
1. Что за тип данных "char"?... Почему обязательно надо зведочку и const ...?
2. Правильно ли объединять землю с МК и землю с БП постоянного тока ...? Можно ли объединять земли с переменного тока (БП и(или) розетка 220) и землю с МК?
4. Есть ли способ заставить МК ожидать, например, нажатия кнопки (логическую единицу на digital) в любом месте кода, вне зависимости от текущей позиции в программе? Или же обязательно выполнение программы должно дойти до строчки, где проверяется наличие логической единицы на определенном пине, а дальше уже if и так далее?
5. Чем черевато использовать mosfet для управления переменным током? Можно ли использовать для отпирания транзистора переменный ток?
Я выкинул незначительную часть. Но п4 и п5 - это же просто волшебство! Нельзя портить такой материал ответами! Это же законченное произведение искусства, я бы сказал "арт-объект"!
Вот кто может дать ответ на вопрос "чем черевато (орфография автора)...?" так, что бы эмоциональная реакция на ответ была столь же красочной и многослойной, как сам вопрос?
mixail844, b707, благодарю, попробуем)
2. С блоком питания вопрос не понятен - БП чего и что Вы имеете в виду под словом "земля". Далее - с 220В шутки плохи - но если Вы здесь имеете в виду именно "землю", а не нейтраль, то это иногда применяется для защиты от помех. Но поскольку у нас в основном везде "глухозаземленная" нейтраль, выдающая себя за землю, лучше этого не делать. Если Вы имели в виду нейтраль, то делать этого нельзя категорически!
3. Ну тут понятно - помехи от ШИМа. Диод скорее всего не поможет, а вот дроссель с конденсатором - вполне.
БП - любой понижающий постоянного тока. Допустим БП 12в постоянка для питания насоса. Я немного уточню свой вопрос. Нужно ли соединять Grd МК и минус БП постоянного\переменного тока?
Имел в виду именно нейтраль, прочитал ответ и сам понял глупость вопроса.
Конденсатор с дроселем - куда впаивать? Кондер, я так понимаю, между плюсом и минусом (допустим 55в\1к мкФ), а дросель?
Загляните все-таки в головную тему. В первых двух постах сложил литературы туеву хучу. Почитайте что-нибудь начального уровня, а до этого к два двадцать и близко не подходите. ИМХО.
БП - любой понижающий постоянного тока. Допустим БП 12в постоянка для питания насоса. Я немного уточню свой вопрос. Нужно ли соединять Grd МК и минус БП постоянного\переменного тока?
Имел в виду именно нейтраль, прочитал ответ и сам понял глупость вопроса.
Конденсатор с дроселем - куда впаивать? Кондер, я так понимаю, между плюсом и минусом (допустим 55в\1к мкФ), а дросель?
БП, если есть возможность, то лучше не соединять. Особенно если на нем электромотор или соленоид. Соединяют, обычно из экономии, чтобы питать сразу и МК. А вот тут мы и попадаем в раздел помех. Дроссель - последовательно, конденсатор парралельно, а вместе они настроены на частоту помехи. Почитайте про борьбу с помехами в электронике - детектив!
akkima,
5. Когда надо часто (по меркам реле) переключать. Реле на частотах выше 100 Гц быстро выходит из строя, и от него вы не добьётесь ШИМ регулировки (оно тупо не будет успевать за фреймрейтом, который видит глаз, соответственно даже если у вас будет модуляция - то заметная на глаз, что люто раздражает).
Управление транзистором от переменного тока не чревато ничем. Кроме переполюсовки. Которая будет случаться на половине частоты тока, то есть воткнёте в розетку - и 25 раз в сек будет переполюсовка. Нормальные люди делают MOSFET, который замыкает плечи + и - диодного моста, а плечи ~ втыкаются последовательно с нагрузкой, как и с симистором. Это очень древняя советская схема, сейчас применяется в индукционнных плитках.
Объединять исток MOSFET с минусом питания (gnd) нельзя. Не потому что если вы лапнитесь пальцем за gnd пальцем, то вас токнет ёбом, а потому что этим способом невозможно включать более одного транзистора. Захотите два - и в первом будет происходить КЗ при включении второго, во втором при вкл. первого. Лечится изолированным источником питания, на каждый транзистор свой источник. Гугланите "изолированный преобразователь", если так хочется регулировать транзистором, алсо есть маленькие китайские блоки, у них габариты примерно как большое реле, как раз с выводами для установки в плату.
4. if(flag) doShit(); - сделать если true, не делать если false и топать дальше.
while(!flag){}; doShit(); - ждать пока не будет true, потом сделать и дальше.
3. Не надо развязывать земли диодами. Вот не надо и всё. Забудьте что у вас провод между силовой землёй и gnd Arduino. Нету его. Не. Ту. Если подключен - откусите кусачками. А потом купите такую четырёхногую микруху с надписью PC817, или что-то там 817, она дешёвая. Называется она "оптопара". Не должно быть связи по земле, это дурная привычка. Долго объяснять.
Помехи по питанию, если они остаются, лечатся встречно-параллельным диодом, фильтром низких частот (индуктивный, всмысле массивный дроссель), ёмким (всмысле сотни микрофарад) конденсатором - это глушит низкочастотные помехи, маленьким керамическим конденсатором (0.1 мкФ) - это глушит наносекундные помехи. Помехи по провалу питания лечатся ёмким конденсатором, который уже как по вашей задумке, отрезается от остальной схемы диодом Шоттки (чтобы остальная схема не жрала конденсатор). Алсо косвенно ответ на 2.
2. Объединять 220 и общий (gnd, истоки транзисторов) - как написано в 5, по ПОСТОЯННОМУ току, всмысле плюс 220, минус 220, через диодный мост, с ИЗОЛИРОВАННЫМ преобразователем, от которого это чудо питается. Управление оптопарой. Просто соединять Gnd и один из проводов розетки нельзя, будет переполюсовка f/2 раз в сек, будет КЗ при включении любых соседних не изолированных гальванически каналов.
1. char это подписанный (имеющий знак) byte, размер byte в восьмибитках - 8 бит, т. е. 2^8. Итого 256, соответсвенно byte - от 0 до 255, char от -128 до +127, ноль это положительное (не имеющее минуса) число.
* - оператор указания. То есть присваивание в *var=x; - то же самое что сказать "новый адрес var - x". Ежжи, x не должно вылезать за адресное пространство, иначе будет ошибка доступа к памяти.
& - оператор разыменования. То есть присваивание в &var=x; - то же самое что сказать "то что находится по адресу var, будет иметь значение x". Ясен барабан что var не должно указывать в стек и кучу, не должно быть совместного доступа к находящемуся в var адресе, иначе будет порча информации в памяти.
Программазм &, * - это красноглазинье, секта и более глубинно - меринье пиписьками "посмотрите я умный, я в кде пропатчил линух". Есть мастодонты. Но общаться с ними не советую, лютое ЧСВ. Есть вменяемые люди, типа wdrakula, ЕвгенийП - но если вы допустите оплошность, сказав что-нибудь тупое, поднимут на смех. Мне эта сакральная магия недоступна, я и не суюсь. Не, всмысле я пользуюсь ссылками и указателями в меру своего понимания, но чисто на уровне домохозяйки. Я знаю что с * - адрес, & - вытащить из адреса (разыменование), мне достаточно.
To akkima:
В нормальном случае ваше устройство должно быть гальванически равзязано с электрической сетью переменного тока, т.е. нигде и никаким проводом не должно быть с ней соединено. Это требование безопасности. Правда, наши великие друзья-китайцы постоянно кладут на это правило и выпускают кучу бытовой техники (те же ёлочные гирлянды), в которых никакой развязки от сети ~220В нет и в помине, но это плохой пример. Так не надо делать. Тут я присоединюсь к высказавшимся выше ораторам и посоветую почитать соответствующую литературу, т.к. за два слова это все не объяснишь: развязка при помощи трансформатора, реле, оптопары и т.д., и т.п.
Могу еще посоветовать посмотреть на ютюбе "Заметки ардуинщика" от AlexGyver. Плодовитый товарищЪ и не лишен некой образовательной жилки. Его курс уроков по Ардуино вполне себе дает нормальное начальное представление и по железу, и по программированию. А видео про использование мосфета как раз дает ответы на заданные здесь Вами вопросы. И да, даже если Вы просмотрите всего AlexGyver-а, читать специализированную литературу все равно будет нужно.
mykaida, хорошее чтиво я люблю, обязательно почитаю!) Сделал ход конем - вообще отдельно запитал проблемный бп и остальную систему. Помехи на датчики остались. Пока поменяю БП на фиксированный на 36в (а не led driver 25-45в), а с этим на отдельной площадке буду воевать
Voodoo Doll, огромное спасибо, максимально развернутый ответ! Не могу сказать, что мне прям все стало понятно на этом свете, но прогресс явно присутствует, будем изучать дальше.
b_calavasov, заметки ардуинщика зашли на ура, понятным языком объясняются не совсем понятные вещи, то что нужно новичку.
ps - ушел качать литературу с головной темы, надеюсь хоть немного поможет сократить число глупых вопросов на форуме
pps - еще раз всем спасибо за помощь ^^^