ЗУ с четырёхпроводнным выходом на АКБ.
ЗУ с четырёхпроводнным выходом на АКБ.
Суть такая ! Есть ЗУ в нём атмега8 считывает силу тока, напряжение , и управляет ключами . Есть желание развязать силовые линии на акб и линии замера напряжения. С плюсом проблем нет , а с минусом как быть ? У МК ведь цифровая земля соединена с АЦП-шной .... ИЛИ нет ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Реклама
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Трехпроводного уже недостаточно?
Астролябия-сама меряет, было бы что мерять!!!
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Там же "сила" будет идти по минусовому, и потери по напруге . И следственно напряжение измерения в схеме не будет соответствовать напряжению на акб.
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Starichok51
- Модератор
- Сообщения: 19054
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
применить внешний АЦП, например, ads1115 с дифференциальным включением входов.
этот АЦП позволяет измерять небольшое отрицательное напряжение, которое будет падать на минусовой цепи.
но если к этому ЗУ невозможно сделать новую прошивку, то придется смириться с трехпроводной схемой.
этот АЦП позволяет измерять небольшое отрицательное напряжение, которое будет падать на минусовой цепи.
но если к этому ЗУ невозможно сделать новую прошивку, то придется смириться с трехпроводной схемой.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
[uquote="Alex_641",url="/forum/viewtopic.php?p=4355671#p4355671"]Там же "сила" будет идти по минусовому, и потери по напруге . И следственно напряжение измерения в схеме не будет соответствовать напряжению на акб.[/uquote]
Измеряйте напряжения на обоих клеммах аккумулятора относительно общего провода и путем нехитрых математических операций получите нужные величины. Два "третьих" провода от двух каналов АЦП, один на одну клемму, другой на другую. И с шунтом можно так же.
Измеряйте напряжения на обоих клеммах аккумулятора относительно общего провода и путем нехитрых математических операций получите нужные величины. Два "третьих" провода от двух каналов АЦП, один на одну клемму, другой на другую. И с шунтом можно так же.
Астролябия-сама меряет, было бы что мерять!!!
- Реклама
Re: ЗУ с четырёхпроводнным выходом на АКБ.
А можно АЦПировать выход по плюсу , и напругу по плюсу на акб, таким образом вычислить падение напряжения , и запежеить его програмно для минуса ... ДА ?
Не спрашивай по ком звонит колокол, он звонит по тебе !
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Ну а я про что?
Измеряете падение напряжения на проводе от акумулятора и вычитаете его из общего напряжения на аккумуляторе + общий провод от аккумулятора.
Если же взять медные провода хотя бы в палец толщиной, можно и вовсе пренебречь падением напряжения на них в случае с зарядкой свинцово-кислотных аккумуляторов. Токи не настолько велики чтобы падение напряжения были заметные на нормальных проводах, а одна-две десятых вольта там роли не играют.
Измеряете падение напряжения на проводе от акумулятора и вычитаете его из общего напряжения на аккумуляторе + общий провод от аккумулятора.
Если же взять медные провода хотя бы в палец толщиной, можно и вовсе пренебречь падением напряжения на них в случае с зарядкой свинцово-кислотных аккумуляторов. Токи не настолько велики чтобы падение напряжения были заметные на нормальных проводах, а одна-две десятых вольта там роли не играют.
Астролябия-сама меряет, было бы что мерять!!!
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Это неприемлемо, так как микросхему придётся покупать , и проект станет не бесплатным )Starichok51 писал(а):применить внешний АЦП, например, ads1115
Добавлено after 2 minutes 48 seconds:
Не с палец конечно , но такие себе нехилые ! При токе 7 ампер падение на обоих 0,4 вольта.Asmodey писал(а):Если же взять медные провода хотя бы в палец толщиной
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Starichok51
- Модератор
- Сообщения: 19054
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Alex_641, если ты покажешь схему своего ЗУ, я посмотрю, возможно ли сделать такую коммутацию, чтобы было 4 провода.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
схема
- Вложения
-
- 7-min.jpg
- (194.86 КБ) 99 скачиваний
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Starichok51
- Модератор
- Сообщения: 19054
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
сначала разберемся со схемой.
по схеме при переходе с разряда на заряд полярность на шунте изменяется.
схема усилителей на двух ОУ лм358 какая-то мутная" и мне умозрительно не получается определить, что получается на выходе ОУ.2 при разных полярностях на шунте.
что такое "баланс нуля", какое напряжение при этом "нуле" на выходе ОУ.2?
не знаю, как там выполнен монтаж. если это возможно, нужно сделать так:
один "толстый" провод от "-АКБ" должен идти к шунту, другой "тонкий" провод должен идти от "-АКБ" на "общую точку" измерительной схемы.
на плате соединения между шунтом и "общей точки" соединения быть не должно.
по плюсу сделать два провода - силовой и измерительный- проблем быть не должно.
силовой провод на предохранитель, а измерительный на цепь переменного резистора.
по схеме при переходе с разряда на заряд полярность на шунте изменяется.
схема усилителей на двух ОУ лм358 какая-то мутная" и мне умозрительно не получается определить, что получается на выходе ОУ.2 при разных полярностях на шунте.
что такое "баланс нуля", какое напряжение при этом "нуле" на выходе ОУ.2?
не знаю, как там выполнен монтаж. если это возможно, нужно сделать так:
один "толстый" провод от "-АКБ" должен идти к шунту, другой "тонкий" провод должен идти от "-АКБ" на "общую точку" измерительной схемы.
на плате соединения между шунтом и "общей точки" соединения быть не должно.
по плюсу сделать два провода - силовой и измерительный- проблем быть не должно.
силовой провод на предохранитель, а измерительный на цепь переменного резистора.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
При балансе нуля на выходе второй 358-й 2,5 вольта.
Програмно ацп настроен на напряжения питания.
Схема возможно мутная , но она работает.
И неплохо , как я считаю.
При больших токах разница в показаниях не увеличивается.
Програмно ацп настроен на напряжения питания.
Схема возможно мутная , но она работает.
И неплохо , как я считаю.
При больших токах разница в показаниях не увеличивается.
- Вложения
-
- PHOTO_20230117_184839.jpg
- (230.73 КБ) 64 скачивания
-
- PHOTO_20230117_183159.jpg
- (154.69 КБ) 59 скачиваний
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Муркиз
- Друг Кота
- Сообщения: 26014
- Зарегистрирован: Пн фев 09, 2009 22:19:49
- Откуда: Когда-то был прекрасный город для людей
Re: ЗУ с четырёхпроводнным выходом на АКБ.
А оно все это реально нужно ? Лишнее место поломки только , обрыв измерительных проводов и убитый аккумулятор ?
- Starichok51
- Модератор
- Сообщения: 19054
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
как сделано безграмотно. должно быть Ач (с опущенным знаком умножения), а не А/ч, со знаком деления.
емкость - это ток, умноженный на время.
вообще-то, я так и подумал, что там устанавливается 2,5 Вольта. но по схеме я это высчитать не смог.
емкость - это ток, умноженный на время.
вообще-то, я так и подумал, что там устанавливается 2,5 Вольта. но по схеме я это высчитать не смог.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Старичёк ты прав ! Я это и сам понял не сегодня ! Сейчас разворошу прошивку , и исправлю !Starichok51 писал(а):как сделано безграмотно. должно быть Ач
Не спрашивай по ком звонит колокол, он звонит по тебе !
- Starichok51
- Модератор
- Сообщения: 19054
- Зарегистрирован: Сб авг 14, 2010 15:05:51
- Откуда: г. Озерск, Челябинская обл.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
так у тебя есть исходник на него?
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Конечно есть ! Я же его придумал )))
Добавлено after 11 minutes 10 seconds:
Добавлено 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: ЗУ с четырёхпроводнным выходом на АКБ.
необязательно было давать такую длинную "портянку" я бы и так поверил.
тем более, что пишу для МК только на ассемблере. Си меня не интересует вообще. даже читать этот исходник не хочу.
Добавлено after 3 minutes 27 seconds:
спрятал твой длинный текст под спойлер, чтобы не мешал людям читать тему.
тем более, что пишу для МК только на ассемблере. Си меня не интересует вообще. даже читать этот исходник не хочу.
Добавлено after 3 minutes 27 seconds:
спрятал твой длинный текст под спойлер, чтобы не мешал людям читать тему.
Мудрость приходит вместе с импотенцией...
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Два года работет это устройство . Но это была 4-я версия , теперь я думаю сделать пятую . Это как бы чё бы МК управлял праметрами .
Добавлено after 4 minutes 20 seconds:
Это же возможно ? Управлять током с МК ?
Добавлено after 34 minutes 48 seconds:
Теперь в течении часа , выход замкнут ! Ток 7 ампер напряжение 0,32 В ничего не взорвалось !!
Добавлено after 31 minute 58 seconds:
Это устроийство работает !
Добавлено after 4 minutes 20 seconds:
Это же возможно ? Управлять током с МК ?
Добавлено after 34 minutes 48 seconds:
Теперь в течении часа , выход замкнут ! Ток 7 ампер напряжение 0,32 В ничего не взорвалось !!
Добавлено after 31 minute 58 seconds:
Это устроийство работает !
Не спрашивай по ком звонит колокол, он звонит по тебе !
Re: ЗУ с четырёхпроводнным выходом на АКБ.
Если провода одинаковые то можно использовать 3х проводную схему, плюс ОУ для компенсации.Alex_641 писал(а):Есть желание развязать силовые линии на акб и линии замера напряжения. С плюсом проблем нет , а с минусом как быть
V1 это зарядка, R1, R2 ваши провода, V2 батарейка. Схема на ОУ выдает напряжение на батарейке делённое на 2, независимо от падения напряжения на проводах.
Последний раз редактировалось Телекот Ср янв 18, 2023 06:48:41, всего редактировалось 1 раз.
Тем кого не устаревает наличия ошибок в моем тексте, оставляю права не пользоваться моими советами или просто не читать мои сообщения.


