Импульсная зарядка для автоаккумуляторов (новодел)

Блоки питания, преобразователи напряжения, UPS'ы - это здесь :)
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение melandr »

Добавил в измерение тока и напряжения усреднение методом скользящего среднего. Показания стали меньше бегать. Получается что сейчас показания плавают в пределах +-0,1В или +-0,1А. Я так понимаю есть пульсации на выходе. Вопрос в следующем. Как проверить, что емкости 1000 мкФ хватает на выходе и дроссель, который используется в выходном фильтр (бывший ДГС - 5 В обмотка) правильно намотан. Какая у него должна быть индуктивность. То есть, какие меры необходимо применить, чтобы уменьшить пульсации на выходе? Я так понимаю уже много народу повторило вариант Е и многие прикручивали к зарядке показометр. Какой был результат? Заранее спасибо за подсказки.
Аватара пользователя
Psychotherapeutics
Друг Кота
Сообщения: 6789
Зарегистрирован: Пт июн 24, 2011 17:53:10
Откуда: WCP

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Psychotherapeutics »

Сам для себя попробуй объяснить, для чего тебе для такого зарядного для автоаккумулятора отлавливать пульсации? а что делать с показометром уже три дня назад было:
Psychotherapeutics писал(а): попробуй просто увеличить емкости С4-С6 до 1-10 мкФ.

У меня в похожем там на 10 или 20 мкФ стоят и таких проблем вообще не имею...
«Бремя доказательства лежит на том, кто утверждает, а не на том, кто отрицает.»

И Вас тоже вылечат!
vksam
Прорезались зубы
Сообщения: 214
Зарегистрирован: Вс фев 12, 2012 20:22:53

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение vksam »

melandr писал(а):Добавил в измерение тока и напряжения усреднение методом скользящего среднего. Показания стали меньше бегать....

Какое опорное напряжение? На какой предел вольтметр? Если занизить предел - повысишь точность
Так же проблема в преобразовании и округлении.
Есть один интересный метод пересчета.. совместно со скользящим средним дает не плохой результат.
В протеусе все получается хорошо. Погрешность не большая есть, но никак не дойдут руки попробовать это на железе.

http://we.easyelectronics.ru/antonluba/ ... go-bp.html

Для AVR есть еще один метод... если я ничего не путаю, контроллеры AVR позволяют измерять свое внутреннее опорное напряжение.
http://tim4dev.com/arduino-secret-true-voltmeter/

А вообще покажи кусок кода преобразования
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение melandr »

Вот код, надеюсь админы меня не забанят, что выкладываю оффтоп...
Спойлер

Код: Выделить всё

// Измерение постоянного тока с помощью AVR
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "indicator.h"
#include <avr/wdt.h>

#define R_div_100 40
#define R_div_10  4
#define COUNT_FILTER    100

// Глобальные переменные
volatile uint8_t comma = 2;               //номер разряда секундной точки
volatile uint8_t updDisplay = 0;         //переменная обновления экрана

uint32_t voltage, current, sec;
uint16_t ADC_value[3];         //считываем значение АЦП
uint16_t buf_a[COUNT_FILTER],buf_v10[COUNT_FILTER],buf_v100[COUNT_FILTER];   //буфер значений АЦП
uint32_t filt_a,filt_v10,filt_v100;      //отфильтрованное значение АЦП

unsigned char chanel, adc_counter;

//входы АЦП
#define IN_A    3
#define IN_V10    4
#define IN_V100 5

/*значение для счетного регистра*/
#define T_POLL 225               //Fcpu = 8 МГц, k = 256,
                           //Tt0 = 256/8000000=0.032 мс, n = 1/0.032=31
                           //T_POLL = 256 - 31 = 225

//дефайны задержек времени
#define T_3MSEC         2

typedef union
{
    unsigned int Val;
    struct
    {
        unsigned char Flag:1;        //Флаг заполнения суммы
        unsigned char Index:8;       //Хранение индекса буфера
        unsigned long Filter_sum:23; //Регистр суммы для усреднения
    } Reg;
} FILTER_REG;

unsigned short int  filter_sred(unsigned short int ADC_val,
unsigned short int* buf, FILTER_REG* filter_reg){
    if (filter_reg->Reg.Flag){
        filter_reg->Reg.Filter_sum-=buf[filter_reg->Reg.Index];
        filter_reg->Reg.Filter_sum+=ADC_val;
        buf[filter_reg->Reg.Index]=ADC_val;
        if (filter_reg->Reg.Index>=COUNT_FILTER-1){
            filter_reg->Reg.Index=0;
        }
        else{
            filter_reg->Reg.Index++;
        }
    }
    else{
        filter_reg->Reg.Filter_sum+=ADC_val;
        buf[filter_reg->Reg.Index]=ADC_val;
        if (filter_reg->Reg.Index>=COUNT_FILTER-1){
            filter_reg->Reg.Index=0;
            filter_reg->Reg.Flag=1;
        }
        else{
            filter_reg->Reg.Index++;
        }
    }
    return (filter_reg->Reg.Filter_sum/COUNT_FILTER);
}

FILTER_REG F11,F12,F13;

//массив строк с названиями единиц измерения
char* str[] = {   "v", "A" };

//функция настройки таймера Т0
void Timer_init(void)
{
   TCNT0 = T_POLL;                     //установка начального значения TCNT0
   TIFR |= (1<<TOV0);                  //сброс флагов в регистре TIFR
   TIMSK |= (1<<TOIE0);               //разрешение прерывания по переполнению в TIMSK
   TCCR0 |= (1<<CS02)|(0<<CS01)|(0<<CS00);   //установка предделителя в TCCR0 (делитель 256)
}

// обработчик прерывания по переполнению Т0
ISR(TIMER0_OVF_vect) 
{                       
   static uint8_t cnt3msec = 0;            //счетчик обновления дисплея
   static uint16_t cnt1sec = 0;            //счетчик одной секунды
   /*перезапись счетного регистра*/
   TCNT0 = T_POLL;

   //сбрасываем сторожевой таймер
   wdt_reset();

   //устанавливаем флаг обновления экрана
   if(cnt3msec == T_3MSEC)
   {
      updDisplay = 1;
      cnt3msec = 0;
   }
   cnt3msec++;         //Инкрементируем счетчик обновления дисплея
}

// Обработчик прерывания от АЦП
ISR(ADC_vect)
{
    ADCSRA = 0;    // Выключаем АЦП
   chanel = ADMUX & 0x0F;
   switch(chanel)
   {
      case IN_A:                        // Если был выбран канал ADC3
      {
         ADC_value[0] = (ADCL|ADCH<<8);      // Сохраняем измеренное значение напряжения и помещаем в буфер
         ADMUX = (ADMUX & 0xF0) | IN_V10;    // Выбираем канал ADC4
         break;
      }
      case IN_V10:                     // Если был выбран канал ADC4
      {
           ADC_value[1] = (ADCL|ADCH<<8);      // Сохраняем измеренное значение напряжения и помещаем в буфер
           ADMUX = (ADMUX & 0xF0) | IN_V100;       // Выбираем канал ADC5
         break;
      }
      case IN_V100:                        // Если был выбран канал ADC5
      {
           ADC_value[2] = (ADCL|ADCH<<8);      // Сохраняем измеренное значение тока и помещаем в буфер
           ADMUX = (ADMUX & 0xF0) | IN_A;       // Выбираем канал ADC3
           adc_counter++;                   // Увеличиваем счетчик выборок АЦП на 1
         break;
      }
   }
    // Включаем АЦП
    ADCSRA |= (1 << ADEN)|(1 << ADSC)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0)|(1 << ADIE);
}

int main(void)
{
    _delay_ms(100);
   //включаем сторожевой таймер
   wdt_enable(WDTO_2S);

    IND_Init();               // Инициализация портов светодиодного индикатора
   Timer_init();            // инициализация таймера Т0

   F11.Val=0;
   F12.Val=0;
   F13.Val=0;
   
    //Настройка АЦП
   ADMUX |= (0 << REFS1)|(0 << REFS0); // Внешний ИОН 2,56V

    ADMUX |= (0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1 << MUX0); // Подключаем канал ADC3
   
    ADCSRA |= (1 << ADEN)// разрешение АЦП
            |(1 << ADSC) // запуск преобразования
            |(1 << ADPS2)|(1 << ADPS1)|(0 << ADPS0) // предделитель на 128
            |(1 << ADIE); // разрешение прерывания от АЦП
   
    sei(); // Глобально разрешаем прерывания
   
    while(1)
    {
        // вычисляем среднее значение АЦП
        if (adc_counter >= 1)
        {
            ADCSRA = 0; // Выключаем АЦП

         filt_a = filter_sred(ADC_value[0],buf_a,&F11);
         filt_v10 = filter_sred(ADC_value[1],buf_v10,&F12);
         filt_v100 = filter_sred(ADC_value[2],buf_v100,&F13);

         current = 263*filt_a*1000/(5*5*1023);            // преобразуем данные в реальное значение тока

         if (ADC_value[1] >= 100)                        //если значение >= 10 В
               voltage = (271*filt_v100*R_div_100/1023);         // преобразуем данные в реальное значение напряжения
         else voltage = (307*filt_v10*R_div_10/1023);         
           
         adc_counter = 0;
            // Выводим данные на индикатор
         IND_OutSym(str[0],1);
         if (voltage <= 1000) IND_OutputFormat(voltage,4,2,3);
         else IND_OutputFormat(voltage/10,3,2,3);
         IND_OutSym(str[1],5);
         if (current < 10000)IND_OutputFormat(current/10,8,6,3);
         else IND_OutputFormat(current/100,7,6,3);

            // Включаем АЦП
            ADCSRA |= (1 << ADEN)|(1 << ADSC)|(1 << ADPS2)|(1 << ADPS1)|(1 << ADPS0)|(1 << ADIE);
        }   

      //Обновляем информацию на индикаторе с частотой 300 Гц
      if(updDisplay){
         IND_Update();
         updDisplay = 0;
      }
    }
    return 0;
}

Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Starichok51 »

не забаню, но спрятал под спойлер твою очень длинную "портянку".
а ты сам был ОБЯЗАН ее спрятать...

а там, где ты делишь на 1023, нужно делить на 1024, так как "опора" 5 Вольт равна 1024 дискретам, а АЦП из 1024 в состоянии набирать только максимум 1023.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
vksam
Прорезались зубы
Сообщения: 214
Зарегистрирован: Вс фев 12, 2012 20:22:53

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение vksam »

Делить надо на 1023, так как 1024 - это уже 11bit
Тут по хорошему вообще делить надо на 10/100/1000.
С дробными работать накладно.
На сколько я понимаю - результат целое, а при делении получаем дробное. Из-за этой дроби и получаешь погрешности
От дробей надо избавляться.
Думаю лучше переделать на умножение, деление на 10/100/100 и сложение.
Правда придется заложиться на верхнюю границу измерения.

АЦП - 10bit значит максимальное количество отсчётов 1023.
Максимальное значение напряжения 5В, тогда получаем 5/1023 = 0,0048878 В/Отсчёт. В таком случае, если количество точек АЦП составляет 188, то напряжение на входе 188 * 0.0048878 = 0.918 вольт

С использованием делителя напряжения, максимальное напряжение 30В, тогда 30/1023 = 0,0293255 В/Отсчёт.
И если количество точек АЦП составляет 188, то напряжение на входе делителя 188 * 0,02932 = 5,5 В.

Это умножение можно разложить так
((188*29)+(188*32)/100)/10 = 551

Играясь умножением/делением на 10 можно повысить точность и оставаться в рамках целого. Можно добавить умножение на миллионные доли.
Так работаешь только с целыми, а после всего просто отсечь ненужное.
Кстати, таким же образом лучше считать среднее значение АЦП

И может конденсаторы на входе поднять до 100нан
vksam
Прорезались зубы
Сообщения: 214
Зарегистрирован: Вс фев 12, 2012 20:22:53

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение vksam »

Хотя возможно и 1024, если считать 10bit от 0 до 1023
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Starichok51 »

вот именно! от 0 до 1023 - 1024 значения. и 11 бит там не будет никогда.
к тому же, АЦП просто не в состоянии измерить ровно 5 Вольт, так как именно 11-ый бит он не может получить.
то есть, при "опоре" 5 Вольт АЦП в состоянии измерить всего 5 * 1023 / 1024 = 4,995 Вольта. если подать на вход АЦП "опору", у него будет "авария" измерений.

ты не первый забываешь про значение "ноль". тут в соседней теме (Imax B1, или тестер максимальной емкости батареек 18650) автор тоже делил на 1023.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение melandr »

Хотел спрятать под спойлер, думал что "[code][/code]" прячет, оказалось что ошибался... Теперь по поводу вольтамперметра. Поставил вместо С4-С6 конденсаторы емкостью 10 мкФ керамические. И применил усреднение - скользящее среднее в измерении. Показания тока мне понравились.Мельтешение показаний тока уменьшилось. А вот с напряжением пока еще плохо. Правда смотрю на китайском вольтметре показания тоже плавают, но не так явно и часто. Есть мысль, что в программе нужно обновлять показания 1 раз в секунду, а сейчас они обновляются с частотой динамической индикации 300 Гц. Просто есть мысль на будущее по схеме варианта Е сделать лабораторный блок питания. И для него пульсации на выходе желательно было бы уменьшить. Поэтому и пытаюсь разобраться, как можно улучшить схему для уменьшения пульсаций на выходе. также еще есть мысль, что наводку могут быть на провода, которые идут к резисторам регулирования напряжения и тока. Где-то на форумах видел, что управление делают ШИМ сигналом с контроллера. Уменьшит ли такая доработка пульсации? Спасибо за помощь.
П.С.: У меня опорное напряжение Ареф = 2,50 В. Как в исходной схеме автора вольтамперметра.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Starichok51 »

melandr писал(а): нужно обновлять показания 1 раз в секунду

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

я пишу на ассемблере, поэтому помочь сделать правильно на Си не могу.
на Си для МК я никогда не писал и писать не буду.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Gisteresis
Друг Кота
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Gisteresis »

Может просто RC фильтр поставить, первого порядка, по входу АЦП? Может даже второго. Параметры выбрать такими чтобы он сам усреднял и читать нужно было всего 1 раз.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Starichok51 »

ну, фильтр очень даже желательно иметь, чтобы всякий "мусор" с выхода БП не лез прямо в АЦП.
и по напряжению и по току...

вот вижу, что melandr совершенно не интересуется соседними темами.
а в упомянутой мною теме (Imax B1, или тестер максимальной емкости батареек 18650) я уже писал, что у меня в планах появилось желание сделать на АТМеге8 блок измерений и управления заданиями напряжения и тока с помощью ШИМ.
у меня есть пара комповых БП, переделанные в регулируемые БП, а "ловить" обычными потенциометрами требуемое задание утомительно...
так хотя бы для одного из них (а может, и для обоих) я собираюсь сделать такой измеритель-задатчик.
это будет практически то же самое, что делает (пытается сделать) melandr...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Gisteresis
Друг Кота
Сообщения: 4732
Зарегистрирован: Ср сен 18, 2013 10:08:26
Откуда: Санкт-Петербург

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Gisteresis »

Starichok51 писал(а):ты не первый забываешь про значение "ноль"

Прожженые программеры считают исключительно от 0. :wink:

я собираюсь сделать такой измеритель-задатчик.

Данная разработка где будет выложена? В теме ай макс...? Подписался...
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение melandr »

RC фильтр в исходном варианте вольтамперметра есть. Резистор - 220 Ом, конденсатор - 1 нФ. Частота среза - 700 кГц Я установил уже конденсатор 20 мкФ. Частота среза стала - 36 Гц.
По поводу ШИМ есть тема вот такая
viewtopic.php?f=25&t=35046
и вот такая http://radiokot.ru/circuit/power/supply/19/
Честно говоря, в браузере открыто порядка 20 вкладок со страницами форумов и сайтов по интересующей теме.И в каждой теме форума по 100 страниц. И пытаюсь с каждой страницы вычленить полезную информацию.
Аватара пользователя
Starichok51
Модератор
Сообщения: 19046
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Starichok51 »

Gisteresis писал(а):Прожженые программеры считают исключительно от 0

начинающий программер думает, что в килобайте 1000 байтов.
прожженный программер уверен, что в километре 1024 метра.
Gisteresis писал(а):Данная разработка где будет выложена?

естественно, не про аймакс. она там ни к селу, ни к городу...
а эта более чем подходит, так как здесь нужно и измерять и задавать и напряжение и ток.
если, конешно, уважаемый Фалконист не будет против...
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
melandr
Вымогатель припоя
Сообщения: 580
Зарегистрирован: Пт ноя 08, 2013 01:01:18

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение melandr »

Сделал обновления показаний на светодиодном индикаторе 1 раз в 500 мс. Мельтешение показаний уменьшилось. Но все равно показания по напряжению плавают. Тут меня еще одна мысль посетила: у меня ампервольтметр подключен 4 проводами к основной плате зарядного: питание (земля и плюс), выход по напряжению, выход по току. А может ли такое быть, что идут наводки от основной платы на сигнальный провод напряжения? И поэтому показания плавают. А мультиметр подключен на выход. И у него питание отдельное, и провода находятся дальше, чем вольтамперметр. Также у меня в вольтамперметре земля питания и общий измерения один и тот же провод. Или нужно было землю питания отделить от земли измерения. Щас брошу мою схему, может чего подскажите
Изображение
kava
Прорезались зубы
Сообщения: 248
Зарегистрирован: Вт мар 02, 2010 23:51:05
Откуда: Харьков

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение kava »

Напряжение лучше мерять прям на клемах АКБ отдельным проводком, непосредственно соединенным с делителем ADC или входным операционником. Если REF внутренний между VCC и AVCC дроселек >10mkH и емкостью на GND, ну и на AREF тоже емкостишку. АЦПировать в цикле стоит 64, 128, 256 разиков сложив в 3х байтник, потом при делении учтешь и количество измерений. Первое преобразование занимает 25 циклов и следующие по 13 циклов. при 150kHz более 11500 измерений, т.е около 45 циклов по 256 замеров.
Аватара пользователя
Lukmas
Родился
Сообщения: 9
Зарегистрирован: Вс фев 21, 2016 20:45:45
Откуда: Узбекистан

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Lukmas »

Здравствуйте коты! собрал схему новодел , вариант по печатке Сергеj, с 26 страницы . можно сказать все работает отлично, и напряжение выставил и ток, проверяю на лампе 12 вольт 45 ватт, ничего не греется,не шумит,не свистит только схема запускается когда на тл494 12 вольт подаю с внешнего источника, потом его можно отключить блок работает дальше сам. без внешнего питания при подключении в сеть слышу звуки легкие шелчки, как будто попытка запуска, грубо частота щелчков 100 или 150 герц на слух.
Изображение
Изображение
из несоответствий номиналам
VT3 и VT4 - D13007, C3 - 1n, R6 - 22k,R20 и R22 - 200k, подскажите где копать если блок работает отлично только запускается от внешнего БП, я так понимаю почему то не работает автогенерация. .
схема запускается и работает дальше если на выходные клемы один раз коснусь внешним 12 вольт, то есть аккумулятора думаю будет работать, интересно разобраться почему не работает ? стоит ли проверить коэф усиления силовых транзисторов и сколько он должен быть в этой схеме минимум ? заранее спасибо
Fuser
Мудрый кот
Сообщения: 1705
Зарегистрирован: Сб дек 14, 2013 16:11:55

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Fuser »

для автозапуска у VT1-2 должны стоять притягивающие резисторы 1,5к база-земля. иначе как только начинается генерация, они открываются и сразу шунтируют трансформатор раскачки, глуша силовые транзисторы.
сам когда-то на эту же фигню наткнулся, в АТХ блоках как правило эти резисторы не стоят, т.к. запитка и соотв. раскачка идет от дежурки, а не от автогенерации. тоже осциллом тыкал, искал где и почему генерация глушится :)
Аватара пользователя
Lukmas
Родился
Сообщения: 9
Зарегистрирован: Вс фев 21, 2016 20:45:45
Откуда: Узбекистан

Re: Импульсная зарядка для автоаккумуляторов (новодел)

Сообщение Lukmas »

на схеме нету на печатке есть и я соответсвенно их ставил, где еще можно посмотреть ?
Ответить

Вернуться в «Питание»