ЗУ с четырёхпроводнным выходом на АКБ.

Блоки питания, преобразователи напряжения, UPS'ы - это здесь :)
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

Суть такая ! Есть ЗУ в нём атмега8 считывает силу тока, напряжение , и управляет ключами . Есть желание развязать силовые линии на акб и линии замера напряжения. С плюсом проблем нет , а с минусом как быть ? У МК ведь цифровая земля соединена с АЦП-шной .... ИЛИ нет ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6402
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Asmodey »

Трехпроводного уже недостаточно?
Астролябия-сама меряет, было бы что мерять!!!
Реклама
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

Там же "сила" будет идти по минусовому, и потери по напруге . И следственно напряжение измерения в схеме не будет соответствовать напряжению на акб.
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Starichok51 »

применить внешний АЦП, например, ads1115 с дифференциальным включением входов.
этот АЦП позволяет измерять небольшое отрицательное напряжение, которое будет падать на минусовой цепи.
но если к этому ЗУ невозможно сделать новую прошивку, то придется смириться с трехпроводной схемой.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6402
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Asmodey »

[uquote="Alex_641",url="/forum/viewtopic.php?p=4355671#p4355671"]Там же "сила" будет идти по минусовому, и потери по напруге . И следственно напряжение измерения в схеме не будет соответствовать напряжению на акб.[/uquote]
Измеряйте напряжения на обоих клеммах аккумулятора относительно общего провода и путем нехитрых математических операций получите нужные величины. Два "третьих" провода от двух каналов АЦП, один на одну клемму, другой на другую. И с шунтом можно так же.
Астролябия-сама меряет, было бы что мерять!!!
Реклама
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

А можно АЦПировать выход по плюсу , и напругу по плюсу на акб, таким образом вычислить падение напряжения , и запежеить его програмно для минуса ... ДА ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Реклама
Аватара пользователя
Asmodey
Друг Кота
Сообщения: 6402
Зарегистрирован: Сб янв 28, 2006 22:47:24

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Asmodey »

Ну а я про что?

Измеряете падение напряжения на проводе от акумулятора и вычитаете его из общего напряжения на аккумуляторе + общий провод от аккумулятора.

Если же взять медные провода хотя бы в палец толщиной, можно и вовсе пренебречь падением напряжения на них в случае с зарядкой свинцово-кислотных аккумуляторов. Токи не настолько велики чтобы падение напряжения были заметные на нормальных проводах, а одна-две десятых вольта там роли не играют.
Астролябия-сама меряет, было бы что мерять!!!
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

Starichok51 писал(а):применить внешний АЦП, например, ads1115
Это неприемлемо, так как микросхему придётся покупать , и проект станет не бесплатным )

Добавлено after 2 minutes 48 seconds:
Asmodey писал(а):Если же взять медные провода хотя бы в палец толщиной
Не с палец конечно , но такие себе нехилые ! При токе 7 ампер падение на обоих 0,4 вольта.
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Starichok51 »

Alex_641, если ты покажешь схему своего ЗУ, я посмотрю, возможно ли сделать такую коммутацию, чтобы было 4 провода.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

схема
Вложения
7-min.jpg
(194.86 КБ) 99 скачиваний
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Starichok51 »

сначала разберемся со схемой.
по схеме при переходе с разряда на заряд полярность на шунте изменяется.
схема усилителей на двух ОУ лм358 какая-то мутная" и мне умозрительно не получается определить, что получается на выходе ОУ.2 при разных полярностях на шунте.
что такое "баланс нуля", какое напряжение при этом "нуле" на выходе ОУ.2?

не знаю, как там выполнен монтаж. если это возможно, нужно сделать так:
один "толстый" провод от "-АКБ" должен идти к шунту, другой "тонкий" провод должен идти от "-АКБ" на "общую точку" измерительной схемы.
на плате соединения между шунтом и "общей точки" соединения быть не должно.
по плюсу сделать два провода - силовой и измерительный- проблем быть не должно.
силовой провод на предохранитель, а измерительный на цепь переменного резистора.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

При балансе нуля на выходе второй 358-й 2,5 вольта.
Програмно ацп настроен на напряжения питания.
Схема возможно мутная , но она работает.
И неплохо , как я считаю.
При больших токах разница в показаниях не увеличивается.
Вложения
PHOTO_20230117_184839.jpg
(230.73 КБ) 64 скачивания
PHOTO_20230117_183159.jpg
(154.69 КБ) 59 скачиваний
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Муркиз
Друг Кота
Сообщения: 26004
Зарегистрирован: Пн фев 09, 2009 22:19:49
Откуда: Когда-то был прекрасный город для людей

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Муркиз »

А оно все это реально нужно ? Лишнее место поломки только , обрыв измерительных проводов и убитый аккумулятор ?
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Starichok51 »

как сделано безграмотно. должно быть Ач (с опущенным знаком умножения), а не А/ч, со знаком деления.
емкость - это ток, умноженный на время.
вообще-то, я так и подумал, что там устанавливается 2,5 Вольта. но по схеме я это высчитать не смог.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

Starichok51 писал(а):как сделано безграмотно. должно быть Ач
Старичёк ты прав ! Я это и сам понял не сегодня ! Сейчас разворошу прошивку , и исправлю !
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Starichok51 »

так у тебя есть исходник на него?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

Конечно есть ! Я же его придумал )))

Добавлено after 11 minutes 10 seconds:
Спойлер

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

// атмега8 8Мгц

#include <io.h>
#include <delay.h>
#include <alcd.h>
int t=0,t1=0,cur=0,vol;unsigned char tims=0,timm=0,timh=0,brk=0,err=0;unsigned long int cah=0; 
#define zar PORTC.2     /// выход на ключ включения заряда
#define raz PORTC.3     /// выход на ключ включения разряда
#define led PORTC.4     /// выход на светодиод внимание
#define cul PORTB.5     /// вентиллятор

// Timer1 input capture interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
       {  
       TCNT1=8181;                // установка таймера
        t1++;                      // переменная для задержки
          t++;                      // это для расчёта ассиметричного заряда и всё блядь-не проверяй 
           if (t1>=140) 
                        {                          
                          tims++;      // секунды плюс
                           t1=0;
                           if (PIND.3==0) brk++; else brk=0;
                           if (tims==60)     // это точно минута 
                                         { 
                                          tims=0;
                                           timm++;                                      
                                            cah=cah+cur*2;  //расчёт емкости с=с+ток*120, раз в минуту
                                          }   
                                           if (timm==60)
                                                       {
                                                        timm=0; 
                                                         timh++;
                                                       }
         
                        }
         
         
          }
// Voltage Reference: AVCC pin
#define ADC_VREF_TYPE ((0<<REFS1) | (1<<REFS0) | (0<<ADLAR))

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | ADC_VREF_TYPE;
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=(1<<ADSC);
// Wait for the AD conversion to complete
while ((ADCSRA & (1<<ADIF))==0);
ADCSRA|=(1<<ADIF);
return ADCW;
}

      unsigned char key (unsigned char i1)     //++++++++++функция возврата кода нажатой кнопки++++
     {  i1=0;                                  //|++++++++ с ожиданием нажатия+++
        while (i1==0)
         {
           if (PIND.2==0) i1=1;         //левая кнопка "-"  
            if (PIND.3==0) i1=2;          // средняя "выбор"
             if (PIND.4==0) i1=3;          // правая кнопка "+"
         } 
       delay_ms(200);               //пауза
       return (i1);                 //возврат с передачей кода
     }

      lcdv (int x1, unsigned char v)    //+++++++++функц. вывода 4-х значного числа на ЛСД с гашением первого нуля
          {                             // или выводом последних 2-х цифр в завис. от вх данных(v=4 или 2)
              int x2=-1;
                 while (x1>=0) 
                              { 
                                x2=x2+1;
                                x1=x1-1000; 
                               }
                                 x2=x2+48;
                                  if (x2>48) if (v==4) lcd_putchar(x2);
                                   x1=x1+1000;
                                    x2=-1;        
              while (x1>=0) 
                 {
                   x2=x2+1;x1=x1-100;
                 }
                    x2=x2+48;
                     if (v==4) lcd_putchar(x2); 
                      x1=x1+100;
                       x2=-1;
                        if (v==4) lcd_putchar(44);        
              while (x1>=0) 
                        {
                         x2=x2+1;x1=x1-10;}; 
                          x2=x2+48;
                           lcd_putchar(x2); 
                            x1=x1+10;
                             x2=-1;
                               while (x1>=0) 
                                            {
                                              x2=x2+1;
                                               x1=x1-1;
                                            }
                                              x2=x2+48;
                                               lcd_putchar(x2);
          }
         
         lcdtime()       //++++++++функция вывода времени  на лсд в левый  угол 3-й строки
                               {                                
                                        lcd_gotoxy(0,2);
                                   //      lcd_putsf("      "); //стираем старое значение
                                          lcd_gotoxy(0,2);
                                           lcdv (timh,2);   //выводим значение часов
                                            lcd_putsf(":");
                                             lcdv (timm,2);  //выводим значение минут
                                              lcd_putsf(":");
                                               lcdv (tims,2);  //выводим значение секунд
                                } 
                                
                                
        lcdzrzr () // ++++++++++функция вывода на лсд "c=,U=,I=" для резимов : заряд, разряд, разряд-заряд
            { lcd_gotoxy(9,2);
             lcd_putsf("C=");
             lcd_gotoxy(2,3);
              lcd_putsf("U=");
             lcd_gotoxy(11,3);                                 
             lcd_putsf("I="); }  
             
 unsigned char vibrej  (unsigned char z2)  //++++функция (выбор режима)возврата кода выбранного режима заряда++++            
       {                                   // 
            unsigned char i2=0;
              lcd_clear();
               lcd_putsf("Vibor rejima zarjada");
                z2=1;
         while (i2!=2) 
         {
            lcd_gotoxy(0,1);lcd_putsf("                  ");
            lcd_gotoxy(0,1);
             if (z2==1) lcd_putsf("Postojannii");
              if (z2==2) lcd_putsf("Assimetrichnyi 1/9");
               if (z2==3) lcd_putsf("Assimetrichnyi 2/8");
                if (z2==4) lcd_putsf("Assimetrichnyi 3/7");
                 if (z2==5) lcd_putsf("Assimetrichnyi 4/6");
                 i2=key(i2);  
                   if (i2==1) if (z2>1) z2=z2-1; 
                    if (i2==3) if (z2<5) z2=z2+1;
         }
           lcd_clear();
           return (z2);
         } 
         
         int zardo (int uotkl1)  //++++функция выбора U при котором отключится заряд АКБ+++
                  {   
                    unsigned char i3=0;    //вспомогательная переменная для получ. кодов клавиатуры
                     lcd_clear();          //чистим дисплей
                   lcd_putsf("Zarjad do "); // вывод надписи "заряд до"
               while (i3!=2)                //цикл до нажатия кнопки "ОК"
                             {
                              lcd_gotoxy(11,0);lcd_putsf("     ");
                               lcd_gotoxy(11,0);
                                lcdv (uotkl1,4);     // вывод напряжеения отключения на лсд
                                 lcd_putsf("V");
                                 i3=key(i3);         //вызов прцедуры получ. нажатой клавиши 
                                  if (i3==1) if (uotkl1>300) uotkl1=uotkl1-10; //убавл на 0,1 В
                                   if (i3==3) if (uotkl1<2000) uotkl1=uotkl1+10; //прибавл на 0,1 В
                             }
              return uotkl1;         //возвращаем выбранное значение при нажатии кнопки "ОК"
        }
        
        lcdUI()        //+++функция (ток и напряжение на лсд)ацп напряжения , тока и вывод их на дисплей в нижней строке
                {
                 ADMUX = (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(0<<MUX0); //канал АЦП U
                           ADCSR |= 0x40;      // запуск АЦП
                           delay_ms(50);       // пауза 
                                           // while ( ADCSR |== 0x40){};
                          vol=ADCW;
                           vol=vol+vol;
                       //  lcd_gotoxy(4,3);
                       //    lcd_putsf("     ");  //затираем старое значение U на 
                           lcd_gotoxy(4,3);
                           lcdv (vol,4);        // выводим реальное напряжение на акб 
                           lcd_putsf("V ");
                          ADMUX = (0<<REFS1)|(1<<REFS0)|(0<<ADLAR)|(0<<MUX3)|(0<<MUX2)|(0<<MUX1)|(1<<MUX0); //канал АЦП I
                           lcd_gotoxy(13,3);
                           ADCSR |= 0x40;   //считываем значение тока
                           delay_ms(50);
                           cur=ADCW;      //помещаем его в переменную cur
                           cur=cur+cur;
                  //         lcdv (cur,4);
                           if (cur<=1000) cur=1000-cur;
                           if (cur>=1000) 
                                        {
                                          lcd_putsf("-");
                                          cur=cur-1000;
                           
                   
                                      }
                           if (cur<=4)  cur=0;
                                                 
                           lcdv (cur,4);
                           lcd_putsf("A ");
                          
                  }
                  
       peregr()     //+++ функция (перегрузка) отключения зу или нагрузки при перегрузке по току
                {
                 zar=0;  //выключаем зарядное
                 raz=0;   //выключаем нагрузку
                 cul=0;
                 led=1;   //включаем светодиод "неисправность"
                 lcd_gotoxy(0,1);
                  lcd_putsf("                    ");     
                   lcd_gotoxy(0,2);
                    lcd_putsf("                    ");
                     lcd_gotoxy(0,3);
                      lcd_putsf("                    ");
                        lcd_gotoxy(0,1);
                         lcd_putsf("Peregruzka po toku");
                          lcd_gotoxy(0,2);
                           lcd_putsf("Imax=7,5A I=");
                            lcdv (cur,4);
                             lcd_putsf("A");
                              lcd_gotoxy(0,3);
                               lcd_putsf("Ustranite neispravn.");
                                key(1);
                                 err=1;
                              
                  }  
                  
        int zarjd (int uotkl2,unsigned char z4,unsigned char v1) //+++фукц.заряда АКБ до заранее выбр напряжения+++
        {      
                        unsigned char i;            
                        vol=uotkl2-10;
                        zar=1;          // включаем зарядное
                      //  PORTD.1=1;          // включаем светодиод "зарядное вкл."
                       lcdzrzr(); // вывод с,i,U в две нижние строки
                        t=0;t1=0;tims=0,timm=0,timh=0;cah=0;  //обнуляем таймеры и часы реальн. времени
                                    lcd_gotoxy(0,1);
             if (v1==1) lcd_putsf("Postojan");
              if (v1==2) lcd_putsf("Assim 1/9");
               if (v1==3) lcd_putsf("Assim 2/8");
                if (v1==4) lcd_putsf("Assim 3/7");
                 if (v1==5) lcd_putsf("Assim 4/6");
                                 
         while(vol<uotkl2)                         //пока напр на АКБ не достигло выбранного-заряжать..
          {               
                      
                            if (brk>2) break;       //если нажата средняя кнопка более 2 сек выход из цикла заряда
            if (tims==5) if (cur<10)     // если отсутствует зарядный ток то
                                         {
                                           lcd_gotoxy(0,2);
                                            lcd_putsf("                    ");
                                             lcd_gotoxy(0,3);
                                              lcd_putsf("                    ");
                                               lcd_gotoxy(0,2);                                                             
                                                lcd_putsf("NEISPRAVNOST I=0,00A");
                                                 lcd_gotoxy(0,3);
                                                  lcd_putsf("Proverte podkluhenie");
                                                   zar=0; // отключаем заряд
                                                  //  PORTC.3=0; //отключаем зарядное
                                                     led=1;   //включаем светодиод "неисправность"
                                                      #asm("cli")   //запрещаем прерывания (останавливаем время)
                                                       key(i);      // ждём нажатия любой клавиши
                                                        #asm("sei") //разрешаем прерывания (запускаем время)
                                              lcd_gotoxy(0,2);
                                               lcd_putsf("                    ");
                                                lcd_gotoxy(0,3);
                                                 lcd_putsf("                    ");                                                         PORTC.5=1;   //выключаем светодиод "неисправность"
                                                   lcdzrzr(); // вывод с,i,U в две нижние строки
                                                   zar=1;          // включаем заряд               
                                                   led=0;   //выключаем светодиод "неисправность"
                                          }
                                  
                             lcdtime();                         //Выводим время на лсд
                               lcd_gotoxy(11,2);          // координаты
                                 lcdv (cah/120,4);        //вывода ёмкости, и её вывод
                                   lcd_putsf("A*h ");
                                        
                              
            lcdUI() ;                 // выводим на лсд значение тока и напряжения
            if (cur>180) cul=1; else cul=0; // если ток заряда превышает 1.8А включить вентиллятор иначе выключить
                                     if (cur>750)  peregr();   // если ток разряда более 7,5А процедура перегрузки
                                      if (err==1) break;            
          if (v1>1)           //если режим заряда не постоянный z>1 включаем алгоритм ассиметр заряда
             {
                       if (t<(10-(v1-1))*150)zar=1,raz=0; else raz=1,zar=0;
                       if (t>=1500) t=0;     
              }
              }

          zar=0;  //выключаем зарядное
          cul=0;  // выключаем охлаждение

        }
int razrdo (int uvkl1)       //+++функция выбора U откл. разряда (порог отключения)+++
     {         
                unsigned char i3=0;
                 lcd_clear(); 
                lcd_gotoxy(0,1);
                lcd_putsf("Razrjd do ");
                 while (i3!=2)
                  {
                 lcd_gotoxy(11,1);lcd_putsf("     ");
                    lcd_gotoxy(11,1);
                  lcdv (uvkl1,4);     // вывод напряжеения отключения на лсд 
                   i3=key(i3);
                  if (i3==1) if (uvkl1>200) uvkl1=uvkl1-10;
                   if (i3==3) if (uvkl1<1600) uvkl1=uvkl1+10;
        }          
                    lcd_gotoxy(0,1);
                    lcd_putsf("                ");
                   return (uvkl1);
         }
  int razrjd (int uvkl2,unsigned char z4)   //+++функция разряд+++++
  {             
    
       lcdzrzr();               //печать U,I,C= в свои места
     //   lcdUI ();                // вывод напруги и тока в стандартные места
         vol=uvkl2+10;
          raz=1;            //включаем нагрузку
            t=0;t1=0;tims=0,timm=0,timh=0,cah=0;    // обнуляем время и ёмкость акб
            delay_ms(120);                    
      
                                                       
    while (vol>uvkl2)                     // пока Uакб больше заданного выполнять цикл  
      {  
                              if (brk>2) break;        //если нажата средняя кнопка более 2 сек выход из цикла 
                                lcdtime();                  //вывод времени 
                                 lcd_gotoxy(11,2);          // координаты
                                   lcdv (cah/120,4);        //вывода ёмкости, и её вывод
                                    lcd_putsf("A*h");
                                    lcdUI ();                // вывод напруги и тока в стандартные места
                                     if (cur>750)  peregr();   // если ток разряда более 7,5А процедура перегрузки
                                      if (err==1) break;
                                     
                
      }
                      raz=0;   //выключаем нагрузку
             }
                       
void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Function: Bit7=In Bit6=In Bit5=Out Bit4=Out Bit3=Out Bit2=Out Bit1=Out Bit0=Out 
DDRB=(0<<DDB7) | (0<<DDB6) | (1<<DDB5) | (1<<DDB4) | (1<<DDB3) | (1<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit7=T Bit6=T Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0 
PORTB=(0<<PORTB7) | (0<<PORTB6) | (0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0);

// Port C initialization
// Function: Bit6=Out Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=In 
DDRC=(1<<DDC6) | (0<<DDC5) | (1<<DDC4) | (1<<DDC3) | (1<<DDC2) | (0<<DDC1) | (0<<DDC0);
// State: Bit6=0 Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T 
PORTC=(0<<PORTC6) | (0<<PORTC5) | (0<<PORTC4) | (0<<PORTC3) | (0<<PORTC2) | (0<<PORTC1) | (0<<PORTC0);

// Port D initialization
// Function: Bit7=Out Bit6=Out Bit5=Out Bit4=In Bit3=In Bit2=In Bit1=Out Bit0=Out 
DDRD=(1<<DDD7) | (1<<DDD6) | (1<<DDD5) | (0<<DDD4) | (0<<DDD3) | (0<<DDD2) | (1<<DDD1) | (1<<DDD0);
// State: Bit7=0 Bit6=0 Bit5=0 Bit4=0 Bit3=0 Bit2=0 Bit1=0 Bit0=0 
PORTD=(0<<PORTD7) | (0<<PORTD6) | (0<<PORTD5) | (0<<PORTD4) | (0<<PORTD3) | (0<<PORTD2) | (0<<PORTD1) | (0<<PORTD0);

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=(0<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 8000,000 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Disconnected
// OC1B output: Disconnected
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer Period: 8,192 ms
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: On
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=(0<<COM1A1) | (0<<COM1A0) | (0<<COM1B1) | (0<<COM1B0) | (0<<WGM11) | (0<<WGM10);
TCCR1B=(0<<ICNC1) | (0<<ICES1) | (0<<WGM13) | (0<<WGM12) | (0<<CS12) | (0<<CS11) | (1<<CS10);
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=(0<<OCIE2) | (0<<TOIE2) | (0<<TICIE1) | (0<<OCIE1A) | (0<<OCIE1B) | (1<<TOIE1) | (0<<TOIE0);

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=(0<<ISC11) | (0<<ISC10) | (0<<ISC01) | (0<<ISC00);

// USART initialization
// USART disabled
UCSRB=(0<<RXCIE) | (0<<TXCIE) | (0<<UDRIE) | (0<<RXEN) | (0<<TXEN) | (0<<UCSZ2) | (0<<RXB8) | (0<<TXB8);

// Analog Comparator initialization
// Analog Comparator: Off
// The Analog Comparator's positive input is
// connected to the AIN0 pin
// The Analog Comparator's negative input is
// connected to the AIN1 pin
ACSR=(1<<ACD) | (0<<ACBG) | (0<<ACO) | (0<<ACI) | (0<<ACIE) | (0<<ACIC) | (0<<ACIS1) | (0<<ACIS0);

// ADC initialization
// ADC Clock frequency: 125,000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADFR) | (0<<ADIF) | (0<<ADIE) | (1<<ADPS2) | (1<<ADPS1) | (0<<ADPS0);
SFIOR=(0<<ACME);

// SPI initialization
// SPI disabled
SPCR=(0<<SPIE) | (0<<SPE) | (0<<DORD) | (0<<MSTR) | (0<<CPOL) | (0<<CPHA) | (0<<SPR1) | (0<<SPR0);

// TWI initialization
// TWI disabled
TWCR=(0<<TWEA) | (0<<TWSTA) | (0<<TWSTO) | (0<<TWEN) | (0<<TWIE);

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTD Bit 5
// RD - PORTC Bit 6
// EN - PORTD Bit 6
// D4 - PORTD Bit 7
// D5 - PORTB Bit 0
// D6 - PORTB Bit 1
// D7 - PORTB Bit 2
// Characters/line: 16


lcd_init(20);

// Globally enable interrupts
#asm("sei")
while (1)
      {   

          int uotkl=1380,uvkli=1080;                     //первоначальные значения откл. заряда 14,8В и разр 10,8В
          unsigned char z=1,ci=1,i,v;                   //вспом.переменные 
          cul=0;  // выключаем охлаждение            
          zar=0;  //отключаем заряд
          raz=0;   //отключаем разряд
          led=0;   //выключаем светодиод "внимание"
          err=0; //переменная перегрузки по току 1-отключает заряд и разряд
            lcd_clear();           
            lcd_gotoxy(0,0);                   //приветствуем чуваков
            lcd_putsf("KONTROLLER ZARJDNOGO");       //
            lcd_gotoxy(0,1);                   //
            lcd_putsf("Dlj AUTO battary");        //          OT  Dlj AUTO battary
            lcd_gotoxy(0,2);
             lcd_putsf("I(zar,razr)max=3 A ");        //    I(zar,razr)max=7.5A
             lcd_gotoxy(0,3);
              lcd_putsf("ALEX_641 VER4.2 2020");      //ALEX_641 VER4.2 2020
            delay_ms(3000);                     //  ждём 3 сек
            lcd_clear();//   стираем приветствие 
             i=0; // обнуляем i для корректной работы выбора режима, при новом цикле( после отработавшего режима)
            lcd_gotoxy(3,3);                      
             lcd_putsf("U(AKB)=");
                lcd_gotoxy(0,0); 
                 lcd_putsf("Vibor rejima:");    //++выбор режима заряд,разряд,тренировка++
            while (z<6)
        {
               lcd_gotoxy(0,1);
                lcd_putsf("                    ");
                 lcd_gotoxy(0,1);
                  if (z==1) lcd_putsf("Zarjad auto");        //выбираем
                   if (z==2) lcd_putsf("Zarjad ruchnoi");        //выбираем
                   if (z==3) lcd_putsf("Razrjad");       //режим
                    if (z==4) lcd_putsf("Trenirovka");    //работы
                     if (z==5) lcd_putsf("Zarjad-Razrjad izm C");    //работы
        while (i==0)
         {
                 if (PIND.2==0) i=1;         //левая кнопка "-"  
                  if (PIND.3==0) i=2;          // средняя "выбор"
                   if (PIND.4==0) i=3;          // правая кнопка "+"
              
                    lcd_gotoxy(10,3);
                     vol=read_adc(0)*2;
                      lcdv (vol,4);   
                       lcd_putsf(" ");
             
         }             
                       delay_ms(300);  
                       if (i==1) if (z>1) z=z-1;             // и если нажата клавиша "выбор"
                        if (i==2) z=z+5;                      //выходим из цикла выбора увеличив z на 5
                         if (i==3) if (z<5) z=z+1;
                         i=0;
         }
                            // ++++алгоритм заряда++++++
       if (z==6)
        {
          
                       v=vibrej(v);         //выбор режима заряда в переменную v                      
                        uotkl=zardo (uotkl) ; //выбор Uоткл заряда в переменную uotkl
                         zarjd (uotkl,z,v);     // заряд до uotkl с режимом v
                          lcd_gotoxy(11,3);
                           lcd_putsf("vypolneno");
                           led=1;   //включаем светодиод "внимание"
                            i=key(i); //ожидание нажатия любой кнопки
                           
              
      } 
      
       if (z==7)     // ручной заряд
        {
          lcd_gotoxy(0,0);
           lcd_putsf("                    "); //стираем старые надписи
             zar=1;          // включаем зарядное
              lcd_gotoxy(0,2);
               lcd_putsf("                    ");
                lcd_gotoxy(0,3);
                 lcd_putsf("                    ");                                                        
                   lcdzrzr(); // вывод с,i,U в две нижние строки
                    t=0;t1=0;tims=0,timm=0,timh=0;cah=0;  //обнуляем таймеры и часы реальн. времени

                                 
         while(1)                         
          {               
             if (brk>2) break;       //если нажата средняя кнопка более 2 сек выход из цикла заряда
              lcdtime();                         //Выводим время на лсд
               lcd_gotoxy(11,2);          // координаты
                lcdv (cah/120,4);        //вывода ёмкости, и её вывод
                 lcd_putsf("A*h ");
                  lcdUI() ;                 // выводим на лсд значение тока и напряжения
                   if (cur>180)cul=1; else cul=0; // если ток заряда превышает 1.8А включить вентиллятор иначе выключить
                    if (cur>750)peregr();   // если ток разряда более 7,5А процедура перегрузки
                     if (err==1) 
                     {
          lcd_gotoxy(0,1);
           lcd_putsf("                    "); //стираем старые надписи
           lcd_gotoxy(0,1); 
            lcd_putsf("Zarjad ruchnoi");        //выбираем           
             zar=1;          // включаем зарядное
              lcd_gotoxy(0,2);
               lcd_putsf("                    ");
                lcd_gotoxy(0,3);
                 lcd_putsf("                    ");                                                        
                   lcdzrzr(); // вывод с,i,U в две нижние строки 
                   err=0;
                cul=0;  // выключаем охлаждение
                led=0;       
                     }            
           } 

          zar=0;  //выключаем заряд
          cul=0;  // выключаем охлаждение

                  
          
            }  
        
      
      
         if (z==8)       // ++++алгоритм разряда++++++
        {                   
             uvkli=razrdo (uvkli);   //выбор напряжения отключения заряда в uvkli
              lcd_gotoxy(2,0);
               lcd_putsf("Razrjd do ");
                lcdv (uvkli,4);   
                 razrjd (uvkli,z);   //разряд до uvkli
                  lcd_gotoxy(11,3);
                   lcd_putsf("vypolneno");
                   led=1;   //включаем светодиод "ВНИМАНИЕ"
                    i=key(i);
        }
        
           if (z==9)     // ++++алгоритм тренировки++++++
        {
                i=0;      //вспомогательная переменная
                while (i!=2)   //пока не нажата клавиша "выбор" устанавливаем кол-во циклов
                       {
                         lcd_clear();
                          lcd_putsf("Kolih siklov-");
                          lcd_gotoxy(13,0);
                           lcdv (ci,2);     // вывод количества циклов
                            i=key(i);        // получаем код нажатой клавиши
                             if (i==1) if (ci>1) ci=ci-1;    //если "-" убавляем до 1 с шагом 1 
                              if (i==3) if (ci<99) ci=ci+1;  //если "+" прибавляем с шагом 1 до 99
                       }
                       
               
                       
         lcd_clear();
           i=0;
            uvkli=razrdo (uvkli);   //выбор напряжения отключения заряда в uvkli
             uotkl=zardo (uotkl) ; //выбор Uоткл заряда в переменную uotkl
              v=vibrej(v);         //выбор режима заряда в переменную v     
               lcdv (uvkli,4);   //вывод на экран Uоткл разр
                lcd_gotoxy(11,0);
                 lcdv (uotkl,4);  //вывод на экран Uоткл зар
                  lcd_gotoxy(18,0);
                    lcdv (ci,2);  // 
                     lcd_gotoxy(10,1);lcd_putsf("C0=0,00");
            while (ci!=0)     //пока кол-во циклов >0 продолжаем
                      {
                        lcd_gotoxy(9,0);lcd_putsf(" ");
                         lcd_gotoxy(6,0);lcd_putsf("<");lcdv ( ci,2);
                          razrjd (uvkli,z);   //разряд до uvkli
                          lcd_gotoxy(13,1); lcdv (cah/120,4);   // вывод ёмкости прошлого законченного цикла
                          lcd_putsf(" ");
                           lcd_gotoxy(6,0);lcd_putsf(" ");
                            lcd_gotoxy(9,0);lcd_putsf(">");
                             zarjd (uotkl,z,v);
                              lcd_gotoxy(13,1); lcdv (cah/120,4);   //вывод ёмкости прошлого законченного цикла
                              ci=ci-1; 
                      }
  
              lcd_gotoxy(11,3);
               lcd_putsf("vypolneno");
               led=1;;   //включаем светодиод "неисправность"
                  i=key(i);
       } 
               if (z==10)     // ++++алгоритм заряд-разряд подсчёт ёмкости++++++
                    { 
                     lcd_clear();
                      i=0;
                         
                         uvkli=razrdo (uvkli);   //выбор напряжения отключения заряда в uvkli
                          uotkl=zardo (uotkl) ; //выбор Uоткл заряда в переменную uotkl
                           v=vibrej(v);         //выбор режима заряда в переменную v     
                           lcd_putsf("C-metr");
                           lcd_gotoxy(7,0);
                            lcdv (uvkli,4);   //вывод на экран Uоткл разр
                             lcd_gotoxy(15,0);
                              lcdv (uotkl,4);  //вывод на экран Uоткл зар
                                lcd_gotoxy(13,0);
                              lcd_putsf(">");
                               lcd_gotoxy(10,1);lcd_putsf("C0=0,00");
                               zarjd (uotkl,z,v);
                                lcd_gotoxy(13,1); lcdv (cah/120,4);
                                lcd_gotoxy(13,0);
                              lcd_putsf("<");
                                razrjd (uvkli,z);   //разряд до uvkli 
  
              lcd_gotoxy(11,3);
               lcd_putsf("vypolneno");
               led=1;   //включаем светодиод "внимание"
                  i=key(i); // ждём нажатия любой кнопки и выход в меню выбора режимов                  
                    }
     }
}
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Starichok51
Модератор
Сообщения: 19054
Зарегистрирован: Сб авг 14, 2010 15:05:51
Откуда: г. Озерск, Челябинская обл.

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Starichok51 »

необязательно было давать такую длинную "портянку" я бы и так поверил.
тем более, что пишу для МК только на ассемблере. Си меня не интересует вообще. даже читать этот исходник не хочу.

Добавлено after 3 minutes 27 seconds:
спрятал твой длинный текст под спойлер, чтобы не мешал людям читать тему.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Аватара пользователя
Alex_641
Поставщик валерьянки для Кота
Сообщения: 2314
Зарегистрирован: Вт янв 26, 2021 22:33:21

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Alex_641 »

Два года работет это устройство . Но это была 4-я версия , теперь я думаю сделать пятую . Это как бы чё бы МК управлял праметрами .

Добавлено after 4 minutes 20 seconds:
Это же возможно ? Управлять током с МК ?

Добавлено after 34 minutes 48 seconds:
Теперь в течении часа , выход замкнут ! Ток 7 ампер напряжение 0,32 В ничего не взорвалось !!

Добавлено after 31 minute 58 seconds:
Это устроийство работает !
Не спрашивай по ком звонит колокол, он звонит по тебе !
Аватара пользователя
Телекот
Друг Кота
Сообщения: 36290
Зарегистрирован: Чт июн 04, 2009 21:06:49
Откуда: г.Мариинск

Re: ЗУ с четырёхпроводнным выходом на АКБ.

Сообщение Телекот »

Alex_641 писал(а):Есть желание развязать силовые линии на акб и линии замера напряжения. С плюсом проблем нет , а с минусом как быть
Если провода одинаковые то можно использовать 3х проводную схему, плюс ОУ для компенсации.
Изображение
V1 это зарядка, R1, R2 ваши провода, V2 батарейка. Схема на ОУ выдает напряжение на батарейке делённое на 2, независимо от падения напряжения на проводах.
Последний раз редактировалось Телекот Ср янв 18, 2023 06:48:41, всего редактировалось 1 раз.
Тем кого не устаревает наличия ошибок в моем тексте, оставляю права не пользоваться моими советами или просто не читать мои сообщения.
Ответить

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