Коты ситуация такая. Год назад мне один товарищ подогнал схемку автопрогрева двигателя на меге8, но он сразу предупредил, прога есть, написана, но в железе не проверялась. Накидал я ее в протеусе, вроде работает. Собрал схемку работает, но заметил несколько косяков. Написал автору он ответил что будет время загляну, и тишина. Думаю что ждать, залез сам порылся кое что подправил, но один остался, не такой он важный но остался. Так как С знаю на троечку столкнулся с одной настройкой, таймера/счётчика. Вот этот кусок кода. TCNT1H=0xE795 >> 8; TCNT1L=0xE795 & 0xff; В общем то понятно, за что эти настройки отвечают, но не могу понять что обозначают эти цифры E795 Ребята подскажите!
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
Последний раз редактировалось Акма Ср фев 28, 2018 20:10:24, всего редактировалось 1 раз.
Добавлено after 1 minute 47 seconds: просто сначала автор выделил из числа старший байт и записал его в старший разряд счетчика, а затем младший ПС: хоть бы число задефайнил, чтоб менять его в одном месте.
Добавлено after 1 minute 40 seconds: а эта цифра - просто начальная точка счёта этого счетчика, чем она больше, тем раньше случится определяемое счетчиком событие
Добавлено after 1 minute 7 seconds: подробней написать не могу - отсюда не видно
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Добавлено after 1 minute 7 seconds: подробней написать не могу - отсюда не видно [/uquote] Спасибо! Что для этого нужно? я имею в виду чтоб узнать поподробнее.
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
Зарегистрирован: Пн апр 25, 2016 15:43:23 Сообщений: 197 Откуда: Россия , Воронеж
Рейтинг сообщения:0
Цитата:
Спасибо! Что для этого нужно? я имею в виду чтоб узнать поподробнее.
Тебе уже ответили для установки начального значения таймера 1.
Хотя в at7 можно сразу записать так TCNT1=0xE795; или так TCNT1=59285; Но в любом случае , 16 битный таймер в мгновение ока обнулится т.к. досчитать до 65к даже причастоте в пару КГц , не долго. Кстатетак же можно и считывать значение int32_t tic=TCNT1; - присвоит переменной tic текущее значение таймера.
Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ очень важен контроль процесса заряда и разряда для избегания воздействия внешнего зарядного напряжения после достижения 100% заряда. Инженеры КОМПЭЛ подготовили список таких решений от разных производителей.
Компания EVE выпустила новый аккумулятор серии PLM, сочетающий в себе высокую безопасность, длительный срок службы, широкий температурный диапазон и высокую токоотдачу даже при отрицательной температуре.
Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств.
Что для этого нужно? я имею в виду чтоб узнать поподробнее.
по этому куску больше не сказать, надо больше кусок... или весь код, и очень желательно с описанием того, что он делает неправильно.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
[uquote="Ivanoff-iv",url="/forum/viewtopic.php?p=3318901#p3318901"...просто сначала автор...[/uquote] действовал согласно даташиту, т.е. сначала записал старший байт, а потом младший. И невдомёк ему было, что компилятор сам разберётся что когда писать. Перфекционист, однако. Автор, не компилятор. Последний при рождении уже перфекционист.
да, согласно даташиту, но, не вынеся константу, заботливо разложил грабли для невнимательных... трудно было сделать #define , осмысленное название и комментарий?
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Алгоритм прожки. От себя! Приехал, заглушил двигло, включаешь девайс, тянешь ручник, прога в ожидании понижения температуры, на сколько выставишь от 0 до -20. После включения, устройство переходит в режим постоянного измерения температуры. При снижении температуры двигателя ниже установленной (-20 ... 0 град.), устройство включает зажигание и производит запуск двигателя. Стартер включается на время не более 5 сек. С момента запуска стартера, контроллер анализирует состояние выводов "Генератор" и "Тахометр". Если по входу "Генератор" напряжение станет больше 9 В или число оборотов по входу "Тахометр" возрастет более 500 об/мин. контроллер отключает стартер. После запуска двигателя, контроллер продолжает измерять температуру, напряжение генератора, частоту вращения и состояние вывода "Выкл. СТОП-СИГНАЛА". По достижении температуры равной 70-ти градусам, устройство глушит двигатель. Если во время работы двигателя нажать на педаль тормоза, то управление перейдет на водителя, поэтому до нажатия на педаль необходимо вставить ключ зажигания и повернуть его, иначе двигатель заглохнет, т.к. разомкнется ключ на транзисторе VT7. Индикация режима прогрева двигателя осуществляется с помощью поворотников автомобиля, которые загораются на 1 сек. с периодом в 5 сек.
Если двигатель не завелся или заглох, контроллер через 10 сек. повторяет попытку запуска. После 5 неудачных попыток, запуск двигателя прекращается до момента как двигатель будет запущен вручную, или будет произведено вкл./выкл. устройства.
Автор пишет: Если двигатель не завелся или заглох, контроллер через 10 сек. повторяет попытку запуска. После 5 неудачных попыток, запуск двигателя прекращается до момента как двигатель будет запущен вручную, или будет произведено вкл./выкл. Все работает!! но вот это мне не нравится. Если двигатель завелся проработал какое то время и нечаянно ЗАГЛОХ. Прога все равно сигналит поворотами и зажигание остается включенным. Так как двигатель не работает а электропитание остается включенным, в последствии приходишь к своему коню а акум мертвый или не дай бог что еще хуже. Я считаю что девайс после того как двигло заглохло, должен уйти в спячку, пока его не перезапустят ON/OF Ребята вот сам код. Схема прикреплена в низу. Спойлер
// 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 (++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
// 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;
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; } }; }
Вложения:
Комментарий к файлу: Схема. схема.png [83.46 KiB]
Скачиваний: 371
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
Последний раз редактировалось Акма Пт мар 02, 2018 07:21:51, всего редактировалось 1 раз.
1) спрячь код в теги {spoiler}{code} ...твой код... {/code}{/spoiler} (только скобки квадратные) так и портянки не будет и код сайтом гарантированно не попортит 2) по коду - замени условие (строка 266):
Код:
if (TORMOZ || (temperature > 60)) // нажата педаль тормоза или температура выше заданной, выключаем все
на:
Код:
if ((TORMOZ || (temperature > 60))||((ind_on)&&(gen_volt < 12000))) // нажата педаль тормоза или температура выше заданной, или при запущенном моторе упало напряжение - выключаем все
ну, может, напряжение только поправить придётся.
Добавлено after 3 minutes 35 seconds: 3) вот этого изврата можно было и не делать TCNT1H=0xE795 >> 8; TCNT1L=0xE795 & 0xff; если правильно настроить таймер (по режиму СТС). (это пока оставь, но если сам будешь кодить - делай правильно)
Добавлено after 27 minutes 57 seconds: возможно в строку 243 (до закрывающей скобки) придется добавить
Код:
gen_volt=60000;
чтобы до обновления показаний вольтметра мотор не заглушило
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
3) вот этого изврата можно было и не делать TCNT1H=0xE795 >> 8; TCNT1L=0xE795 & 0xff; если правильно настроить таймер (по режиму СТС). (это пока оставь, но если сам будешь кодить - делай правильно)
Если бы мог писать на Цэ, написал бы так
Код:
#define Fo 8000000 ;тактовая частота 8МГц
TCNT1=-Fo/64/10 ;100ms досчетом до переполнения OCR1A=Fo/64/10-1 ;100ms в режиме CTC
Режим CTC хорош тем, что OCR1A загружается один раз, а TCNT1 при досчете по переполнения в прерывании нужно каждый раз загружать. Экономия.
if ((TORMOZ || (temperature > 60))||((ind_on)&&(gen_volt < 12000))) // нажата педаль тормоза или температура выше заданной, или при запущенном моторе упало напряжение - выключаем все
ну, может, напряжение только поправить придётся.
Добавлено after 27 minutes 57 seconds: возможно в строку 243 (до закрывающей скобки) придется добавить
Код:
gen_volt=60000;
чтобы до обновления показаний вольтметра мотор не заглушило
Спасибо! Внес я первую с верху поправку. Доходит до процесса запуска, включается стартер-запуск пошел, через секунду глушит двигатель. Вторую поправку не вносил. Строки сдвинулись, у меня под строкой 240-#asm("cli"), 241-starter_timer = 0;, 242-STARTER = 0;, соответственно 243- #asm("sei")
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
ну, вот туда и ставь, а эта строчка (и все последующие) уедет вниз на одну я ещё исправил в условии напряжение: поставил 12000 (это типа 12в) - возможно с ним поиграться придётся - чтобы и при работающем моторе не глушило (если глушит - надо убавлять) и при остановке глушило как можно раньше (если не глушит - добавляй)
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
if ((TORMOZ || (temperature > 60))||((ind_on)&&(gen_volt < 12000))) // нажата педаль тормоза или температура выше заданной, или при запущенном моторе упало напряжение - выключаем все
ну, может, напряжение только поправить придётся.
Что я сразу заметил, 12вольт многовато! при включении стартера, бывают просадки до 10вольт. Подправил я с 12вольт, на 11вольт и заработало!!! я думаю всетаки поставить 9.5вольта. И на счет вот этой поправки! gen_volt=60000; скопируйте строку куда подставить этот код. Понятно! пока я верстал топик, вы уже ответили на мой вопрос. Спасибо все работает!
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
попробуй теперь принудительно машину заглушить - проверь отрабатывает ли отключение ведь 12 вольт в этом условии я написал для разделения работающего/неработающего двиг-ля при выключенном стартере (а там напруги повыше)
Добавлено after 38 minutes 17 seconds: ещё поправил условие:
Код:
if ((TORMOZ || (temperature > 60))||((ind_on)&&((gen_volt < 12000)||(tahometr_speed == 0)))) // нажата педаль тормоза или температура выше заданной, или при запущенном моторе упало напряжение или обороты - выключаем все
чтобы и по оборотам следило. но сначала напряжение отстрой.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
попробуй теперь принудительно машину заглушить - проверь отрабатывает ли отключение ведь 12 вольт в этом условии я написал для разделения работающего/неработающего двиг-ля при выключенном стартере (а там напруги повыше)
Вроде глушит! Но это в процессе тестирования все повылазиет. Внес поправочку. (tahometr_speed == 0) Сейчас попробую.
Добавлено after 23 minutes 4 seconds: Все работает!!! Заходит в цикл при низком напряжении и после принудительно заглушенного двигателя. Я думал прожка с этой поправкой (tahometr_speed == 0) будет заходить в цикл в процессе работы. Днем потеплело! Ладно будем ждать вечера, когда температура на улице опустится ниже нуля.
Добавлено after 7 hours 46 minutes 14 seconds: Вот и понеслось!! после простоя, при запуске начало заходить в цикл, выключаем все. !! При идеальном аккумуляторе, а это без нагрузок, должен держать 12.5, но при запуске может просесть до 9-10 вольт. А при работающем двигателе, если с генератором все в норме, то вылет может достичь до 14.2волта. !!! как привязаться к этим цифрам, 9-14.2вольта???? разница грубо в 5.2 вольта. Чтоб не сильно ломать голову с вольтами, думаю лучше сделать привязку к тахометру, есть импульсы-работаем, нет импульсов уходим в цикл, выключаем все.
Добавлено after 1 hour 31 minute 6 seconds: Более детально вник в процесс. Получается так. На аккуме 12.5вольта. Термометр дает команду на запуск, стартует стартер, идет просадка до 10.3, заводится двигатель, выключается стартер. Вроде все в норме! но не все. Если двигатель по какой то причине заглох. Примерно через 5-8 сек. включается зажигание и идет в цикл (если двигатель не запустился),через 5 -10 сек, включается зажигание, стартер, и. дальше по кругу. Полагаю здесь вина термометра, который после того как двигатель заглох, тоже должен уйти в спячку, а он продолжает давать команды на запуск!!!
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
тогда надо добавить переменную (защелку), которая будет взводиться при заглыхании двигателя и не даст ему больше самозаводиться. я уже тоже об этом подумал, (что после остановки система возвращается в исходное состояние) но решил эксперимента дождаться, а то и тормозом мотор не заглушить (в исходной схеме)(только отпустишь - и заводится по новой) о том как её устанавливать и сбрасывать я подумаю в понедельник, пока некогда.
_________________ Просто не учи физику в школе, и вся твоя жизнь будет наполнена чудесами и волшебством Безграмотно вопрошающим про силовую или высоковольтную электронику я не отвечаю, а то ещё посадят за участие в (само)убиении оболтуса...
Сутра со свежими мыслями проследил весь алгоритм. 1)Термометр дает команду на запуск, стартер пуск, двигатель не завелся, заходит в цикл, (если двигатель не завелся) производит 5 попыток запуска, двигатель не завелся! прожка останавливается! здесь норма. 2)Термометр дает команду на запуск, стартер пуск, заводится двигатель, стартер стоп, греем двигатель, температура>60, двигатель молотит! прожка не видит термометр, именно по высокой температуре, а раньше видел!!!!!!!!!!!!!!!!!!!!!! 3)Термометр дает команду на запуск, стартер пуск, заводится двигатель, стартер стоп, греем двигатель, если двигатель по какой то причине заглох, зажигание выкл. прожка идет в цикл (если двигатель не запустился), через 1 сек, включает зажигание, стартер, если двигатель не заводится, через 5 сек. стартер стоп, через 10 сек, повторная попытка запуска, делает 5 попыток запуска, если двигатель не завелся полный СТОП! здесь норма.
Осталась непонятка с термометром, почему не глушит двигатель при температуре>60. уже паяльник подносил, молчит гад!! боюсь перегреть датчик. И вот этот бы кусок подправит, №3 (зажигание выкл. прожка идет в цикл (если двигатель не запустился), через 1 сек, включает зажигание,) вместо 1 сек, delay_ms(5000); ато как то все быстро происходит!
_________________ Во время поиска небольших радиодеталей, упавших со стола, вероятность их обнаружения прямо пропорциональна размеру детали и обратно пропорциональна их значению для завершения работы
Карма: 3
Рейтинг сообщений: 12
Зарегистрирован: Пт мар 27, 2015 16:59:55 Сообщений: 135 Откуда: г. Радужный ХМАО
Рейтинг сообщения:0
Чтот у вас много попыток на запуск. Да и длительность прокрутки стартером великовата. Достаточно установить для первой попытки 1 секунду. Последующие с увеличением на 0.2-0.5 сек. Позаливает и свечи и коллектора и возможен большой пых (был прецендент у одного эксперементатора, но там алгоритм по таймеру был). 4 попытки будет достаточно. У вас как то реализован интервал между включением зажигания и попыткой запуска двигателя? Если нет, то желательно бы, хотябы две три секунды.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 26
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения