Алгоритм прожки. От себя! Приехал, заглушил двигло, включаешь девайс, тянешь ручник, прога в ожидании понижения температуры, на сколько выставишь от 0 до -20.
После включения, устройство переходит в режим постоянного измерения температуры.
При снижении температуры двигателя ниже установленной (-20 ... 0 град.), устройство включает зажигание и
производит запуск двигателя. Стартер включается на время не более 5 сек. С момента запуска стартера, контроллер
анализирует состояние выводов "Генератор" и "Тахометр". Если по входу "Генератор" напряжение станет больше 9 В
или число оборотов по входу "Тахометр" возрастет более 500 об/мин. контроллер отключает стартер.
После запуска двигателя, контроллер продолжает измерять температуру, напряжение генератора, частоту вращения и
состояние вывода "Выкл. СТОП-СИГНАЛА". По достижении температуры равной 70-ти градусам, устройство глушит двигатель.
Если во время работы двигателя нажать на педаль тормоза, то управление перейдет на водителя, поэтому до нажатия
на педаль необходимо вставить ключ зажигания и повернуть его, иначе двигатель заглохнет, т.к. разомкнется ключ на
транзисторе VT7. Индикация режима прогрева двигателя осуществляется с помощью поворотников автомобиля, которые
загораются на 1 сек. с периодом в 5 сек.
Если двигатель не завелся или заглох, контроллер через 10 сек. повторяет попытку запуска. После 5 неудачных попыток,
запуск двигателя прекращается до момента как двигатель будет запущен вручную, или будет произведено вкл./выкл.
устройства.
Автор пишет:
Если двигатель не завелся или заглох, контроллер через 10 сек. повторяет попытку запуска. После 5 неудачных попыток,
запуск двигателя прекращается до момента как двигатель будет запущен вручную, или будет произведено вкл./выкл.
Все работает!! но вот это мне не нравится.
Если двигатель завелся проработал какое то время и нечаянно
ЗАГЛОХ. Прога все равно сигналит поворотами и зажигание остается включенным. Так как двигатель не работает а электропитание остается включенным, в последствии приходишь к своему коню а акум мертвый или не дай бог что еще хуже. Я считаю что девайс после того как двигло заглохло, должен уйти в спячку, пока его не перезапустят ON/OF
Ребята вот сам код. Схема прикреплена в низу.
Спойлер
Код: Выделить всё
#include <mega8.h>
#include <delay.h>
#define ADC_VREF_TYPE 0x60 // опорный источник AVCC
#define POVOROT PORTB.0
#define STARTER PORTB.1
#define ZAJIGANIE PORTB.2
#define TAHOMETR PIND.3 // прерывание INT1
#define TORMOZ PINC.2
#define V_GEN 0 // напряжение генератора, порт АЦП
#define L_TEMP 1 // порог температуры, порт АЦП
#define STOP_ PINC.4 // вход кнопки стояночного тормоза
#define DIST_ST PINC.5 // отрицательный вход дистанционного запуска
#define SENS_OFF PORTB.4 // выход отклучения датчика удара
// 1 Wire Bus functions
#asm
.equ __w1_port=0x15 ;PORTC
.equ __w1_bit=3
#endasm
#include <1wire.h>
// DS18B20 Temperature Sensor functions
#include <ds18b20.h>
bit timer_1s = 0;
bit timer_100ms = 0;
bit pusk = 0; // идет запуск двигателя
bit ind_on = 0; // включение индикации
//bit enable = 1; // разрешение работы
bit old_dist_st = 1; // предидущее состояние входа дист. запуска
unsigned int gen_volt = 0; // напряжение генератора с АЦП в милливольтах
float temp_level = 0; // уровень температуры включения в градусах -20 ... 0
float temperature = 100; // температура, считанная с датчика
unsigned char starter_timer = 0; // кратно 100 мс
unsigned char ind_count = 0;
unsigned int tahometr_count = 0; // счетчик оборотов
unsigned int tahometr_speed = 0;
unsigned char starter_count = 0; // количество попыток завестись
unsigned char timer_10s = 0;
unsigned char delay_timer = 0;
// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void) // Прерывание каждые 100 миллисекунд
{
static unsigned char t1=0;
// Reinitialize Timer1 value
TCNT1H=0xE795 >> 8;
TCNT1L=0xE795 & 0xff;
// Place your code here
timer_100ms = 1;
if (starter_timer)
{
starter_timer--;
STARTER = 1;
}
else
{
if (STARTER) // если был запущен
{
STARTER = 0;
if (starter_count)
{
starter_count--;
timer_10s = 11;
}
else // после 5 попыток выключаем все
{
ZAJIGANIE = 0;
STARTER = 0;
POVOROT = 0;
}
}
}
if (delay_timer) delay_timer--; // счетчик задержки
if (delay_timer == 1)
{
delay_timer = 0;
SENS_OFF = 0; // включаем датчик
}
if (++t1 > 9) // раз в секунду
{
t1 = 0;
timer_1s = 1;
tahometr_speed = tahometr_count;
tahometr_count = 0;
}
}
// External Interrupt 1 service routine
interrupt [EXT_INT1] void ext_int1_isr(void)
{
// Place your code here
tahometr_count++; // считаем импульсы
}
// Read the 8 most significant bits
// of the AD conversion result
unsigned char read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
// Delay needed for the stabilization of the ADC input voltage
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA & 0x10)==0);
ADCSRA|=0x10;
return ADCH;
}
void Start_engine(void)
{
if ((STOP_ == 0) && (pusk == 0)) // стояночный тормоз взведен
{
if (gen_volt < 9000) // если двигатель не запущен
{
pusk = 1; // начинаем процесс
ZAJIGANIE = 1; // включаем зажигание
starter_timer = 50; // 5 секунд на работу стартера
starter_count = 4;
SENS_OFF = 1; // выключаем датчик удара
}
}
}
void main(void)
{
// Declare your local variables here
// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=T State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x17;
// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;
// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;
// Timer/Counter 0 initialization
// Clock source: T0 pin Falling Edge
TCCR0=0x06;
TCNT0=0x00;
// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 62,500 kHz
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x03;
TCNT1H=0xE7;
TCNT1L=0x95;
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=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: On
// INT1 Mode: Falling Edge
GICR|=0x80;
MCUCR=0x08;
GIFR=0x80;
// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;
// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;
// ADC initialization
// ADC Clock frequency: 62,500 kHz
// ADC Voltage Reference: AREF pin
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x86;
// 1 Wire Bus initialization
w1_init();
// инициализация датчика DS18B20
//ds18b20_init( 0, -50, 120, DS18B20_9BIT_RES);
// Global enable interrupts
#asm("sei")
while (1)
{
// Place your code here
if (timer_100ms)
{
timer_100ms = 0;
gen_volt = read_adc(V_GEN)*58; // в милливольтах
if (pusk) // двигатель завенден или в процессе запуска
{
if (((gen_volt > 9000) || (tahometr_speed > 33)) && starter_timer) // напряжение на генераторе больше 9 В пока крутим стартер
{ // примерно 500 об./мин.
#asm("cli")
starter_timer = 0; // отключаем стартер
STARTER = 0;
#asm("sei")
ind_on = 1;
}
}
if ((DIST_ST == 0) && old_dist_st) // вход перешел в нулевое значение
{
Start_engine();
}
old_dist_st = DIST_ST;
}
if (timer_1s) // раз в секунду
{
timer_1s = 0;
temp_level = -20 + (read_adc(L_TEMP)*0.07843); // в градусы //20 гр. - 0.07843, 35 гр. - 0.13725
temperature = ds18b20_temperature(0); // считываем температуру с датчика
if (temperature < temp_level) // начало процесса запуска
{
Start_engine();
}
if (TORMOZ || (temperature > 60)) // нажата педаль тормоза или температура выше заданной, выключаем все
{
ZAJIGANIE = 0;
POVOROT = 0;
#asm("cli")
starter_timer = 0; // отключаем стартер
STARTER = 0;
#asm("sei")
ind_on = 0;
pusk = 0;
timer_10s = 0;
delay_timer = 50; // через 5 сек включаем датчик удара
}
if (ind_on) // индикация работы
{
if (++ind_count > 4)
{
ind_count = 0;
POVOROT = 1;
}
else POVOROT = 0;
}
if (timer_10s) timer_10s--; // десять секунд перед повторным запуском
if (timer_10s == 1) starter_timer = 50;
}
};
}
Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы