Всем доброго вечера. Подобных тем уже и так много поэтому ф флудилку. Задача в следующем, запитать дуню и все что к ней пристыковано от элементов 18650. но таким образом, что бы не было никаких помех (от слова вообще) желательно по крайней мере. Я нарисовал схему как бы это выглядело идеальным образом. питание с 2х последовательно соединенных элементов подается на GND RAW пины, ардуино про мини. от ее выходов +5 и землю уже через ams1117 на 3.3. вольта запитывается экранчик. но в схеме есть трасформатор для накачки на датчик 400 вольт так он сцуко при старте потребляет 250-270 ма (как выедет на режим 35-70 ма, но эти пару секунд боюсь спалят стабилизатор дуни). а в даташите на промини написано при питании с raw пина общее потребление не должно превышать 200 ма. напрямую от 18650 трансформатор не желательно запитывать. так как по мере разряда аккумуляторов , все настройки будут уплывать. поэтому желательно его тоже запитывать от чего нибудь стабильного. вторая мысля от 18650 через пару ams1117 3.3. и 5 в запитать все что нужно. Но увы я не в курсе нет ли искажений сигнала на выходе с этих элементов. Причина в таком высоком требовании к чистоте питания. чувствительный датчик который вместо того что мне надо, начнет считать эл. помехи. (трансформатор будет заэкранирован и все проводка выполнена экранированным проводом, поэтому наводок с него недолжно быть). Резюмируя все выше написанное в 2 словах. посоветуйте пожалуйста как получить идеально чистое без всяких "пил" питание на Дуню 3.3в и 5в в от аккумуляторов с напряжением 5-8.4 вольт.
По моему рациональнее запитать повышающий трансформатор от 18650 и организовать обратную связь по высокому напряжению.
согласен абсолютно. но сложновато блин получится. там скважностью сильно не порегулируешь. надо частоту как то менять в зависимости от напряжения. попробую сегодня покурить эту тему
а могли бы вы подсказать как можно это реализовать? хотябы примерно? погуглил и нашел пару примеров с генератором импульсов на шим выходе и управление частотой шим. но все это не то( с печали стал PWM с обратной связью изобретать. Код (C++): /*кот написан для примера, в реальности будет записан на уровне прямого программирования портов)*/ void setup() { pinMode(5,OUTPUT) } void loop() { int V =((analogRead(A0)*K) // считываем напряжение преобразоваваем в нужные данне long D =10; // промежуток между импульсами micros() этот параметр настраивать в ручную int I =; // количесво импульсов в пачке этим параметром и регулировать напряжение накачки unsigned long T = micros(); // сохранение времени начала цикла //написать чтото вроде калибровочной таблицы if ( 400 - V >50) I=50; // если напряжение меньше нужного на 50 вольт то подаем 50 импулсов накачки if ( 400 - V >25) I=25; // если напряжение меньше нужного на 25 вольт то подаем 25 импулсов накачки if ( 400 - V >10) I=10; // если напряжение меньше нужного на 10 вольт то подаем 10 импулсов накачки if ( 400 - V >2) I=5; // если напряжение меньше нужного на 50 вольт то подаем 5 импулсов накачки if (V<400) // если напряжение меньше 40 вольт подаем импульсы { if (micros()-T >=D) //задаем интарвал между импульсами for (int i=0, i<I, i++) // подаем количество импульсов в зависимости от разницы напряжения { digitalWrite(5,1); //подаем HIGH на пин5 digitalWrite(5,0); // выключаем пин 5 LOW } } if(V>400) // если пошло превышение напряжения { //увеличиваем промежуток между импульсами // думаю через 2 -3 повышения должен определиться баланс между промежутками пачек импульсов //и убавлять промежуток не придется D++; } //предполагаемая частота импульсов до 2000 кгц } товарисчи профи программисты. если кто случайно глянет подскажите, такой кот имеет право на жизнь? или придется все таки делать схему на ams1117 и сглаживать вызможные шумы напряжения . на полноценную обратную связь с изменением частоты шима у меня боюсь опыта не хватает.
кстати кто то писал что на Ардуино.ру , к нубам нехорошо относятся. Ничего подобного, сегодня обратился со своим вопросом. Все разжевали, дали направление куда копать( а мне большего и не надо было). Так что все отлично. Зря боитесь)
Не, ты не прав: я сам там регулярно мочу ленивых жоп Видимо ты грамотно сформулировал вопрос, и выказал желание и готовность разбираться, а не получить готовый результат в картинках
Тебе честно или как получится? Если первое - то код нуждается в оптимизации, например, совершенно непонятно, зачем подряд Код (C++): if ( 400 - V >50) I=50; // если напряжение меньше нужного на 50 вольт то подаем 50 импулсов накачки if ( 400 - V >25) I=25; // если напряжение меньше нужного на 25 вольт то подаем 25 импулсов накачки if ( 400 - V >10) I=10; // если напряжение меньше нужного на 10 вольт то подаем 10 импулсов накачки if ( 400 - V >2) I=5; если достаточно ОДИН раз вычислить разницу в отдельную переменную и потом уже сравнивать с ней Потом - в этом блоке кода надо не набор if, а else if после первого if - чтобы не было ненужных сравнений после первого совпадения условия. Ну и напоследок - код можно переписать гораздо короче без потери читабельности. В общем, ничего страшного, но куда стремиться - есть
Всех с победой Российских хоккеистов!!!!!!!!! решил я свой ребус (или думаю что решил, по крайней мере в симуляторе работает выше всяческих похвал) Код (C++): #define PULSE_interval 50 // интервал между пакетами импулсов #define DATA_interval 1000 // раз в секунду обрабатываем полученные данные и выводим на экран bool F=0;//флаг окончания первой накачки int V =0; //переменная для данных сделителя после трансформатора int Im=0; // переменная для цикла импулсос //int number of pulses =0; int Number_pulses =10; //количество импульсов в пакете void setup() { attachInterrupt(0, Particle_counting_1, FALLING); //прерывание по спаду фронта attachInterrupt(1, Particle_counting_2, FALLING); //прерыванеие по спаду фронта pinMode(5,OUTPUT); // задаем скорость работы ком-порта Serial.begin(9600); } void loop() { PULSE_GENERATIONS( PULSE_interval) ; //генерим пачки импульсов 20 раз в секунду //если не влезу в этот промежуток - увеличу время вызова функции DATA_PROCESSING( DATA_interval); // обрабатываем и выводим данные } void PULSE_GENERATIONS(unsigned long interval ) { static unsigned long prevTime = 0; // if(millis() - prevTime > interval) { prevTime = millis(); // Serial.println("NNNN"); Serial.println(Number_pulses); V = analogRead(A0); //изсеряем напряжение на делителе //пишу просто без преобразований, чтобы не загромождать кот if (V < 360 && F==1) F=0; //если напряжение упало и это не первая накачка то снимаем флаг запрета генерации else if(V < 400 && F==0) //если напряжение меньше и это первый проход генерим импульсы { for( Im=0;Im < Number_pulses; Im++ ) { digitalWrite(5,1); //подаем HIGH на пин5 digitalWrite(5,0); // выключаем пин 5 LOW } } int VA = analogRead(A0);//еще раз проверяем напряжение после генерации импульсов if(VA < 400 && F==0) //если таки напряжение еще не повысилось до нормы, добаваляем импульсов в пакете { Number_pulses++; // если напряжение на конденсаторе будет в норме то импульсы прибвлятья не будут } else if (VA >= 400 && F==0) //если все таки напряжение дошло до нужного или превысило его { Number_pulses--; //уменьшаем количество импульсов в пакете для следущего старта F=1; //ставим флаг что пока не нужно генерить импульсы } } } // просто для проверки void DATA_PROCESSING(unsigned long interval){ static unsigned long prevTime=0; if(millis()-prevTime>interval){ prevTime=millis(); Serial.print("Current time:"); Serial.println(Im); Serial.println(millis()); } } } } Кот получился огромный(((, но работает как мне нужно. Однако есть много вопросов. Кто заглянет сюда, можете не вникать в код. вопрос в следующем. у меня 2 внешних прерывания, и они супер важны для моего проекта. можно ли + к ним добавить еще прерывание по таймеру 1, для выполниния функции генерации импульсов, 20 раз в секунду. (что это можно сделать я в курсе, но вот будет ли корректно это работать) То что внешние прерывания имеют приоритет перед остальными это я прочитал. но что будет если во время одной операции по прерыванию по таймеру (генерации импульсов). наступит куча событий на внешних прерываниях? Что зависнит и не отработает свой цикл? потеряются данные с внешних прерываний? зависнит цикл генерации? вопрос довольно специфический, однако не могу сам разобраться. можно добавитьеще прерывание по таймеру или нет?((((( Подскажите кто в курсе, что происходит если прерывания прерывают прерывания)