питание ПроМини и периферии от 18650

Тема в разделе "Флудилка", создана пользователем CYITEP_BAC9I, 22 фев 2018.

  1. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Всем доброго вечера. Подобных тем уже и так много поэтому ф флудилку.
    Задача в следующем, запитать дуню и все что к ней пристыковано от элементов 18650. но таким образом, что бы не было никаких помех (от слова вообще) желательно по крайней мере. Я нарисовал схему как бы это выглядело идеальным образом. питание с 2х последовательно соединенных элементов подается на GND RAW пины, ардуино про мини. от ее выходов +5 и землю уже через ams1117 на 3.3. вольта запитывается экранчик.

    [​IMG]

    но в схеме есть трасформатор для накачки на датчик 400 вольт так он сцуко при старте потребляет 250-270 ма (как выедет на режим 35-70 ма, но эти пару секунд боюсь спалят стабилизатор дуни). а в даташите на промини написано при питании с raw пина общее потребление не должно превышать 200 ма. напрямую от 18650 трансформатор не желательно запитывать. так как по мере разряда аккумуляторов , все настройки будут уплывать. поэтому желательно его тоже запитывать от чего нибудь стабильного.
    вторая мысля
    от 18650 через пару ams1117 3.3. и 5 в запитать все что нужно. Но увы я не в курсе нет ли искажений сигнала на выходе с этих элементов. Причина в таком высоком требовании к чистоте питания. чувствительный датчик который вместо того что мне надо, начнет считать эл. помехи. (трансформатор будет заэкранирован и все проводка выполнена экранированным проводом, поэтому наводок с него недолжно быть).
    Резюмируя все выше написанное в 2 словах. посоветуйте пожалуйста как получить идеально чистое без всяких "пил" питание на Дуню 3.3в и 5в в от аккумуляторов с напряжением 5-8.4 вольт.
     
  2. ZAZ-965

    ZAZ-965 Гуру

    По моему рациональнее запитать повышающий трансформатор от 18650 и организовать обратную связь по высокому напряжению.
     
    CYITEP_BAC9I и Сусемьбек нравится это.
  3. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    согласен абсолютно. но сложновато блин получится. там скважностью сильно не порегулируешь. надо частоту как то менять в зависимости от напряжения. попробую сегодня покурить эту тему
     
    Последнее редактирование: 23 фев 2018
  4. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    а могли бы вы подсказать как можно это реализовать? хотябы примерно? погуглил и нашел пару примеров с генератором импульсов на шим выходе и управление частотой шим. но все это не то(
    с печали стал 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 и сглаживать вызможные шумы напряжения .
    на полноценную обратную связь с изменением частоты шима у меня боюсь опыта не хватает.
     
    Последнее редактирование: 23 фев 2018
  5. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    кстати кто то писал что на Ардуино.ру , к нубам нехорошо относятся. Ничего подобного, сегодня обратился со своим вопросом. Все разжевали, дали направление куда копать( а мне большего и не надо было). Так что все отлично. Зря боитесь)
     
  6. DIYMan

    DIYMan Guest

    Не, ты не прав: я сам там регулярно мочу ленивых жоп :) Видимо ты грамотно сформулировал вопрос, и выказал желание и готовность разбираться, а не получить готовый результат в картинках :)
     
    CYITEP_BAC9I нравится это.
  7. DIYMan

    DIYMan Guest

    Тебе честно или как получится? Если первое - то код нуждается в оптимизации, например, совершенно непонятно, зачем подряд
    Код (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 - чтобы не было ненужных сравнений после первого совпадения условия. Ну и напоследок - код можно переписать гораздо короче без потери читабельности.

    В общем, ничего страшного, но куда стремиться - есть ;)
     
    CYITEP_BAC9I нравится это.
  8. CYITEP_BAC9I

    CYITEP_BAC9I Гик

    Всех с победой Российских хоккеистов!!!!!!!!!

    решил я свой ребус (или думаю что решил, по крайней мере в симуляторе работает выше всяческих похвал:))
    Код (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 раз в секунду. (что это можно сделать я в курсе, но вот будет ли корректно это работать)
    То что внешние прерывания имеют приоритет перед остальными это я прочитал. но что будет если во время одной операции по прерыванию по таймеру (генерации импульсов). наступит куча событий на внешних прерываниях? Что зависнит и не отработает свой цикл? потеряются данные с внешних прерываний? зависнит цикл генерации?
    вопрос довольно специфический, однако не могу сам разобраться. можно добавитьеще прерывание по таймеру или нет?(((((
    Подскажите кто в курсе, что происходит если прерывания прерывают прерывания)