Показать сообщение отдельно
Старый 30.01.2016, 00:14   #187
oleg707
Гуру
 
Аватар для oleg707
 
Регистрация: 16.04.2014
Возраст: 40
Город: Gdynia
Регион: другой - для добавления сообщить ab
Сообщений: 2,548
oleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond reputeoleg707 has a reputation beyond repute
По умолчанию

итак, делюсь прототипом БП4 поколения, собирать его только гикам и знающим, готового решения тут нет+ вылавливаю баги ( их мало и вылазят редко, потому это надолго. Софт сырой, хотя уже больше нра, чем 3 версия. И железо нормально функционирует.)

скетч
/*
логика работы 4 версии БП. (30,12,1234)

ВКЛЮЧИЛИ ЗАЖИГАНИЕ
включаем питание на батарею планшета
через 0,5 секунды после включения зажигания включаем питание на батарею планшета, даём минус на Y-OTG

через 1.2 сек после включения зажигания включаем плюс +5V на POGO или USB(нужно для распознавания планшетом признака зарядки) и включаем питание на

видеорегистратор.

через 2с после включения ACC включаем экран, Включаем хаб, и выход REM(rem если больше 12в)

ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ
выключаем выход REM.
через 4с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)

ситуация, когда норм акб и выключено зажигание (ACC)
если прошло 5 часов, как выключили ACC вЫключаем питание на батарею планшета
если прошло 2 суток, как выключили ACC вЫключаем питание на на видеорегистратор, после этого вырубаем самозапитку и блок питания перестаёт потреблять

энергию ВООБЩЕ (0,000 А)

ЕСЛИ СЕВШИЙ АККУМУЛЯТОР (либо сел в процессе работы или простоя автомобиля)
//через 15с вЫключаем питание на батарею планшета и вырубаем сам БП.


если севший аккумулятор и включено зажигание, то процессор БП будет активен и делать ЭТО пока не станет нормальная батарея.
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
delay (3000); // задержка для аппаратного выключения





когда БП полностью выключен на датчик холла надо подавать массу, чтобы экран не включался(при оставленной батарее планшета), используется питание

батареи планшета для открытия транзастора, дающего массу. При этом ток потребления от батареи планшета составляет (3,74В 0,004А) (4,2В 0,005А) (0,01А

при 4,8В)


СОБСТВЕННОЕ ПОТРЕБЛЕНИЕ блока питания
все нагрузки выключены 11В, 0.025A (активен только процессор и канал самозапитки BTS716G
все нагрузки включены 14,65в 0,12А
*/


/*
Учитывая, что значение хранится в unsigned long, что соотвествует 4 байтам и следовательно может хранить значения от 0 до 4294967295.
Т.о счетчик переполнится и обнулится приблизительно через 1193 часов или же 50 дней (49.7).
*/










/*ноги ардуины*/
int SAMOZAPITKApin = 9; //управление самозапиткой блока питания IN4
//1 = есть самозапитка; 0 = нет самозапитки

int PlanshBATpin = 6; // включить 1 канал KIW ..... управление питания БАТАРЕИ планшета через управляющую ногу IN2-5pin
//0 = нет питания; 1 = есть питание ( БАТАРЕИ планшета)

int II_KIW_pin_POGOpin = 2; // включить 2 канал KIW управление SS2 выходом питания +5V (2 канал kiw3312s) на пого пин(или USB), чтоб планшет думал, что идет зарядка
//0 = нет 5V на POGO; 1 = есть 5V на POGO

int OTGpin = 12; //управление транзюком OTG Q1
//1 = есть масса на OTG; 0 = нет массы на OTG

int SLEEPpin = 10; //управление транзюком сна VT4 (на датчик холла))
//1 = потух экран(есть масса на пине сна); 0 = штатная работа планшета (нет массы на пине сна)

int HUBpin = 11; //управление транзюком питания хаба
// 0-есть питание, 1 - нет питания

int REMpin = 7; // выход сигнала REM (+12v) (IN3), на плате распаяно.
//0 = нет 12В на выходе REM; 1 = есть 12В на выходе REM

int REGISTRATORpin = 4; //выход 12В для работы видеорегистратора (D4 -IN1)

//пины состояния ITS
int STATEpinI = 5; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(питание KIW3312s-out2 и регистратор-out1) 0 = норма
int STATEpinII =8; //логический вход для отслеживания аварийной ситуации ITS716G(724G)(выход REM-out3 и самозапитка БП-out4 )1 = авар. сит.


/*логические переменные, используемые в коде*/
int flagACC = 0; //признак включенного зажигания
int flagAKB = 0; // признак заряженной батареи
int flagHALL = 0; //флаг отработки морга экрана при холодном старте( flagHALL = 1 экран можно включать и выключать, датчик холла на планшете инициализировался)
/*счётчики времени*/
unsigned long eventTime = 0;
unsigned long pauseTimeACC = 0;
unsigned long pauseTimeAKB = 0;
unsigned long pauseTimeHALL = 130000; // время паузы перед морганием экрана (для датчика холла)(равен времени загрузки планшета плюс секунд 10-20)= 2мин

void setup()
{
// put your setup code here, to run once:
pinMode(STATEpinI, INPUT);
pinMode(STATEpinII, INPUT);
pinMode(PlanshBATpin, OUTPUT);
pinMode(SAMOZAPITKApin, OUTPUT);
pinMode(OTGpin, OUTPUT);
pinMode(SLEEPpin, OUTPUT);
pinMode(II_KIW_pin_POGOpin, OUTPUT);
pinMode(HUBpin, OUTPUT);
pinMode(13, OUTPUT); //светодиодик на плате ардуины
pinMode(REMpin, OUTPUT);
pinMode(REGISTRATORpin, OUTPUT);
//Serial.begin(1200);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
pauseTimeACC = millis();
pauseTimeAKB = millis(); // сброс времени для отсчета отключения самозапитки
}


void loop()
{
/*
//отслеживания аварийной ситуации ITS716G канал 1 (питание KIW3312s-out2 и регистратор-out1) 0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "1"
//отслеживания аварийной ситуации ITS716G канал 2 (выход REM-out3 и самозапитка БП-out4 )0 = норма 1 = авар. сит. //тогда моргаем 13 ногой код "2"
if(SAMOZAPITKApin==1 || PlanshBATpin==1 ||REMpin==1 || REGISTRATORpin ==1) // если проц включал любой канал ITS
{
if(STATEpinI == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 300; i++) { //тогда моргаем 13 ногой код "1" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
//delay (600000);
}
} ;
if(STATEpinII == 0) { // и если пин защиты показал аварию
for (int i=0; i <= 150; i++) { //тогда моргаем 13 ногой ногой код "2" 10 минут, если они прошли и асс ВКЛ, тогда еще раз и еще по кругу, пока неисправность не уйдёт
digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(493); digitalWrite(13, 1); delay(500); digitalWrite(13, 0); delay(1493);
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
//delay (600000);
}
} ;
}




*/


int Uacc = analogRead (A1); //Читаем напругу с делителя ACC R4-R5
int Uakb = analogRead (A0); //Читаем напругу с делителя R2-R3
float U_acc_real = 0.2+Uacc * (5 / 1023.0*3.1189); //Вычисляем реальное напряжение +ACC на входе делителя (A0) 3.1189=поправка делителя.(коэф деления) 0.2-падение на диоде
float U_akb_real = Uakb * (5 / 1023.0*3.1189); //Вычисляем реальное напряжение +30 на входе делителя (A1)
//Serial.print("U_akb_real = ");//Serial.print(U_akb_real); //Serial.print(" Uakb = "); //Serial.println(Uakb);
//Serial.print("U_acc_real = ");//Serial.print(U_acc_real); //Serial.print(" Uacc = ");//Serial.println(Uacc);
//Serial.println("--------------------------------------------------------------------------------------------");
// кусок кода ниже нужен для того, чтобы при включении и сразу выключении ACC при полностью выключенном планшете(холодный старт) экран мог тухнуть по сигналу датчика холла.
if (millis()>pauseTimeHALL && flagHALL == 0) //проверка отсчета при холодном старте
{flagHALL = 1;}






//Serial.println(" ----====86=-------// block ACC ");

// блок ACC
if (U_acc_real>= 11 && flagACC == 0 && flagAKB == 1) //проверка напруги АСС и АКБ при флаге ACC = 0
{
flagACC = 1; //ВКлючили зажигание (>11V)
//Serial.println(" ----====93=------- (U_acc_real>= 11 && flagACC == 0 && flagAKB == 1)");
pauseTimeACC = millis();
//через 0,5 секунды после включения зажигания даём минус на Y-OTG и плюс +5V на POGO или USB.
}




if (millis()-pauseTimeACC>=500 && flagACC == 1)// пауза 0,5c после включения ACC и потом делать следующ(пока включено ACC):
{
digitalWrite(PlanshBATpin, 1); //включаем питание на батарею планшета (in2)
//Serial.println(" ----====103=-------(millis()-pauseTimeACC>=20000 && flagACC == 1) "); //delay(100); //для стабилизации, иначе идет мгновенная просадка напряжения при включении модуля KIW. Кондёр на делитель +30 спасёт мир
digitalWrite(OTGpin, 1); //включаем минус на Y-OTG (включается хаб? и звуковая карта)
digitalWrite(HUBpin, 0);
}



if (millis()-pauseTimeACC>=800 && flagACC == 1) // пауза 0.8c после включения ACC и потом делать следующ(пока включено ACC):

//через 1.2с после включения ACC включаем экран, Включаем хаб, включаем питание на видеорегистратор, и выход REM(rem если больше 12в)
{
//Serial.println(" ----====122=------- (millis()-pauseTimeACC>=50000 && flagACC == 1)");
digitalWrite(II_KIW_pin_POGOpin, 1); //включаем +5V (POGO(USB) нужно для распознавания планшетом признака зарядки. ( можно подавать на +5В USB кабеля (для тимуровской прошивки или если не используется датчик холла)
digitalWrite(REGISTRATORpin, 1); // включаем питание на видеорегистратор
}
//через 1с после включения ACC включаем экран (вЫключаем минус на упр SLEEP), Включаем хаб (подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб)
if (millis()-pauseTimeACC>=1000 && flagACC == 1)
{
digitalWrite(SLEEPpin, 0); //включаем экран = вЫключаем минус на упр SLEEP
digitalWrite(HUBpin, 0); //Включаем хаб = подаем минус на управляющий транзюк хаба, тот открывается и пускает +5В с KIW (2вых)на хаб
//если напруга батареи больше 12В, то включаем еще и усилитель (выход REM)
if (U_akb_real>=12 && flagACC == 1) {digitalWrite(REMpin, 1);} // включаем выход REM
}

//ВЫКЛЮЧИЛИ ЗАЖИГАНИЕ
if (U_acc_real< 11 && flagACC == 1)
{//Serial.println(" ----====133=------- (U_acc_real< 11 && flagACC == 1)");
flagACC = 0; //Выключили зажигание
pauseTimeACC = millis();
pauseTimeAKB = millis(); // сброс времени для отсчета отключения самозапитки
digitalWrite(REMpin, 0); // выключаем выход REM
}

if (millis()-pauseTimeACC>=5000 && flagACC == 0) //пауза 4c после вЫключения ACC и потом делать следующ:
//через 4с после выключения зажигания вЫключаем минус на Y-OTG, ВЫключаем хаб, вЫключаем +5V (POGO(USB)), тушим экран (если прошло 2мин со старта БП)
{

digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(HUBpin, 1); // ВЫключаем хаб = подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
pauseTimeACC = 0;
if (flagHALL==1){digitalWrite(SLEEPpin, 1);} else {digitalWrite(SLEEPpin, 0);} //включаем минус на SLEEP (7 pin PW1)при этом тухнет экран (если прошло 2 минуты с момента включения ардуины)
}

// .. блок АКБ



if (U_akb_real<11.6 && flagAKB == 1) // ситуация, когда сел при работе ардуины аккумулятор (либо сел в процессе работы или простоя автомобиля)
{
flagAKB = 0;//спустили флаг батареи
flagACC = 0;

}


if (U_akb_real>=11.6 && flagAKB == 0) //проверка +30 и флага акб
{
digitalWrite(SAMOZAPITKApin, 1); // включаем самозапитку
flagAKB = 1; //подняли флаг батареи
}



if (millis()-pauseTimeAKB>=15000 && flagAKB == 0) // если севший аакумулятор
{ // пауза 15c
//через 15с вЫключаем питание на батарею планшета и вырубаем сам БП.
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
digitalWrite(OTGpin, 0); //вЫключаем минус на Y-OTG (8 pin PW1)
digitalWrite(II_KIW_pin_POGOpin, 0); //вЫключаем +5V (POGO(USB))
digitalWrite(HUBpin, 1); // подаем + на управляющий транзюк хаба, тот закрывается и не пускает +5В с KIW (2вых)на хаб = ВЫключаем хаб
digitalWrite(REMpin, 0); // // выключаем выход REM
digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом пропадает управление на IN4, система ПОЛНОСТЬЮ обесточивается
delay (3000); // задержка для аппаратного выключения
}
//*

if (flagAKB == 1 && flagACC == 0) //ситуация, когда норм акб и выключено зажигание (ACC)
{
//(батарея планшета))
if (millis()-pauseTimeAKB>=1800000 && flagAKB == 1) // если прошло 5 часов, как выключили ACC
{ // пауза (3600000 - 60мин) (60000 - 1 мин)(10800000=3ч) (1800000=5ч)
digitalWrite(PlanshBATpin, 0); //вЫключаем питание на батарею планшета (in2)
//delay (3000); // задержка для аппаратного выключения
}
//(самозапитка для регистратора)
if (millis()-pauseTimeAKB>=172800000 && flagAKB == 1) // если давно выключили ACC ) (2суток))
{digitalWrite(REGISTRATORpin, 0); // выключаем питание на видеорегистратор
digitalWrite(SAMOZAPITKApin, 0); //выключаем SAMOZAPITKApin, при этом система ПОЛНОСТЬЮ обесточивается
}

}



//*/


////Serial.print(" flagACC == ");//Serial.println(flagACC);
////Serial.print(" millis() == ");//Serial.println(millis());

if (flagAKB ==0 ){digitalWrite(13, 0);} else {digitalWrite(13, 1);}; // индикация напруги батареи на ардуинине.
//Serial.println(" ----====205 end of cikle=------- ");
//конец цикла void loop()
}
Вложения
Тип файла: rar 25.rar (31.2 Кб, 326 просмотров)
oleg707 вне форума   Ответить с цитированием