Всем кто встраивает планшет или навигатор в Астру.
Собрал себе такую схемку:
Rev 1:
Rev 2:
Выглядит так:
Размер платы 100х70мм.
"Тянет" до 5А (до 25Вт), т.е. можно туда подключить планшет, регистратор, радар, да и телефон еще заряжать.
Алгоритм такой:
- первый старт - работает только МК и отслеживает зажигание;
- появляется зажигание - подается питание на планшет и на периферию;
- пропадает зажигание более чем на 10сек - эмулируется нажатие кнопки "Power", планшет засыпает, еще через 7сек снимается питание с периферии;
- появляется зажигание - подается питание на периферию, через 7сек эмулируется нажатие кнопки "Power", планшет просыпается;
- нет зажигания, через 30сек начинает контроллироваться аккум - менее 10.5В - обесточивается все (кроме МК);
- нет зажигания более 14 часов - обесточивается все (кроме МК) - далее как будто первый старт;
Питание 12В и АСС от авто подключается к разъему Х1.
Питание планшета подключается к разъему Х3.
Кнопка Power подключается к разъему Х2.
Периферия подключается к разъемам Х5 и Х6.
На разъем Х4 можно подключить, например, зарядку для телефона.
Код для МК:
Код:
#include <tiny13a.h>
#define F_CPU 1200000UL
#include <delay.h>
// Назначим константы
int bat_volt_min = 535;
// Глобальные переменные
bit first_start=0;
bit batt_bad=0;
bit power_on=0;
bit HUB_state=0;
unsigned int timer0_sec=0;
unsigned int timer0_count=0;
unsigned int batt_volt=0;
// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
timer0_count++;
if (timer0_count==146)
{
timer0_sec+=1;
timer0_count=0;
}
}
// Bandgap Voltage Reference: Off
#define ADC_VREF_TYPE ((0<<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;
}
// Выключение всего
void all_off ()
{
PORTB.4=1;
HUB_state=0;
PORTB.0=LCD_state;
first_start=0;
power_on=0;
}
// Нажатие кнопки Power на планшете
void power_on_off ()
{
PORTB.1=1;
HUB_state=!LCD_state;
PORTB.0=LCD_state;
delay_ms (300);
PORTB.1=0;
power_on=!power_on;
}
// Проверка батареи
void check_bat ()
{
batt_volt = read_adc (1);
if (batt_volt < bat_volt_min)
{
batt_bad=1;
}
else {
batt_bad=0;
};
}
// Первый старт
void first_start_func ()
{
check_bat ();
if (batt_bad==1)
{
all_off ();
}
if (PINB.3==1 && batt_volt>=bat_volt_min)
{
PORTB.4=0;
HUB_state=1;
PORTB.0=HUB_state;
first_start=1;
power_on=1;
PORTB.1=1;
delay_ms (1000);
PORTB.1=0;
}
timer0_count=0;
timer0_sec=0;
}
void main(void)
{
// Declare your local variables here
// Crystal Oscillator division factor: 1
#pragma optsize-
CLKPR=(1<<CLKPCE);
CLKPR=(0<<CLKPCE) | (0<<CLKPS3) | (0<<CLKPS2) | (0<<CLKPS1) | (0<<CLKPS0);
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif
// Input/Output Ports initialization
// Port B initialization
// Function: Bit5=In Bit4=Out Bit3=In Bit2=In Bit1=Out Bit0=Out
DDRB=(0<<DDB5) | (1<<DDB4) | (0<<DDB3) | (0<<DDB2) | (1<<DDB1) | (1<<DDB0);
// State: Bit5=T Bit4=1 Bit3=T Bit2=T Bit1=0 Bit0=0
PINB=(0<<PINB5) | (1<<PINB4) | (0<<PINB3) | (0<<PINB2) | (0<<PINB1) | (0<<PINB0);
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 37,500 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
// Timer Period: 6,8267 ms
TCCR0A=(0<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (0<<WGM01) | (0<<WGM00);
TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00);
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;
// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=(0<<OCIE0B) | (0<<OCIE0A) | (1<<TOIE0);
// External Interrupt(s) initialization
// INT0: Off
// Interrupt on any change on pins PCINT0-5: Off
GIMSK=(0<<INT0) | (0<<PCIE);
MCUCR=(0<<ISC01) | (0<<ISC00);
// 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<<ACIS1) | (0<<ACIS0);
// Digital input buffer on AIN0: On
// Digital input buffer on AIN1: On
DIDR0=(0<<AIN0D) | (0<<AIN1D);
// ADC initialization
// ADC Clock frequency: 600,000 kHz
// ADC Bandgap Voltage Reference: Off
// ADC Auto Trigger Source: ADC Stopped
// Digital input buffers on ADC0: On, ADC1: On, ADC2: On, ADC3: On
DIDR0|=(0<<ADC0D) | (0<<ADC2D) | (0<<ADC3D) | (0<<ADC1D);
ADMUX=ADC_VREF_TYPE;
ADCSRA=(1<<ADEN) | (0<<ADSC) | (0<<ADATE) | (0<<ADIF) | (0<<ADIE) | (0<<ADPS2) | (0<<ADPS1) | (1<<ADPS0);
ADCSRB=(0<<ADTS2) | (0<<ADTS1) | (0<<ADTS0);
// Global enable interrupts
#asm("sei")
while (1)
{
if (first_start==0)
{
first_start_func ();
}
if (PINB.3==0 && timer0_sec>=10 && power_on==1)
{
power_on_off ();
}
if (PINB.3==0 && timer0_sec>=30)
{
check_bat ();
}
if (batt_bad==1)
{
all_off ();
}
if (PINB.3==0 && timer0_sec>=50400)
{
all_off ();
}
if (PINB.3==1 && power_on==0 && batt_bad==0 && first_start==1)
{
power_on_off ();
timer0_sec=0;
}
if (PINB.3==1 && power_on==1)
{
timer0_sec=0;
}
}
}
Последний раз редактировалось nrgizer79; 03.02.2015 в 12:54.
Я себе тоже делаю "умный БП" на подобном DC-DC конвертере и с управлением от Arduino.
Встроенный "спящий" режим в DC-DC не использую.
Сделал приблизительно так:
Ардуина питается через своеобразное "ИЛИ" (2 встречно включенных диода) - либо от можного DC-DC (когда он включен), либо от LM7805.
Вход DC-DC плодключен через реле на постоянный плюс. Реле управляется ардуиной.
LM7805 запитывается от сигнала ACC. Так же ACC в виде логического сигнала заведено на один из выводов Ардуины для мониторинга.
Таким образом:
1. Исходное состояние - все выключено.
2. Поворачиваем ключ, появляется ACC. Через LM7805 запитывается ардуина, стартует, замыкает реле - запитывается DC-DC и включается CarPC.
3. При пропадании ACC ардуина остается запитанной от DC-DC, все продолжает работать.
4. Если ACC пропало более, чем на 10 секунд, ардуина размыкает реле, таким образом обесточивая DC-DC и, соответсвенно, CarPC и саму себя.
Таким образом, добился нулевого тока потребления в выключенном состоянии - DC-DC не потребляет, т.к. обесточен, Ардуина тоже выключена.
Ток потребления в 10-ки мА в выключенном состоянии считаю неприемлимым - у меня и так сигналка с обратной связью выжирает аккум за 2 недели с небольшим.
Подумываю над реализацией режима, в котором CarPC не обесточивается в течении одной ночи (как у автора темы) с мониторингом напряжения батаери. Чтобы не ждать, пока загрузится при ежедневных поездках.
При этом все остальное ненужное (например, экран) отключалось бы сразу 9через 10 секунд после снятия ACC).
Хмммм......
Видимо не на одной волне были
60-80мА - это ток потребления, когда DC-DC включен микроконтроллером, но при этом у него по выходу ничего не потребляется (все потребители отключены).
В режиме выключенном я даже и не измерял.
все равно дофига, в 4 раза больше чем в даташите заявлено, может конечно быть погрешность, но не такая
Заинтриговали вы меня тут
Взял чистый DC-DC.
Итого (измерял мультиметром с пределом до 200мА):
11.5мА в состоянии OFF
12.8мА в состоянии ON
В потребление БП еще входит потребление МК.
Плюс 60-80мА - это мне показывал мой лабораторный БП. Может и привирает.
Надо на досуге будет мультиметром измерить.