Like Tree23сказали спасибо

Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110

Страница 1 из 3 123 ПоследняяПоследняя
Показано с 1 по 10 из 21

Комбинированный просмотр

Предыдущее сообщение Предыдущее сообщение   Следующее сообщение Следующее сообщение
  1. #1
    AKWoland
    Автор темы

    Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110

    Всем привет!В начале прошлой зимы установил себе подогрев сидений от ВАЗ-2110. Штука классная и нужная зимой, но есть у нее один недостаток: через пару минут после включения начинает поджаривать задницу, а если выключить в мороз сиденье остывает моментально и становится тоже не очень комфортно. Решил модернизировать блок управления чтобы эти недостатки устранить.За основу взял восьмибитный микроконтроллер AVR Attiny2313, для которого была написана прошивка и изготовлена плата для установки в штатный десятошный корпус. Регулируется нагрев при помощи ШИМ: ток подается с постоянным напряжением в виде импульсов и чем они шире, а паузы между ними короче - тем сильнее нагревается элемент. Силовая часть каждого канала выполнена на MOSFET-транзисторе, индикация режима работы производится комбинацией двух светодиодов, красного и зеленого. Клеммы разъема для подключения, а также сами кнопки взяты из штатного блока.Блок имеет три режима нагрева: 30%, 60% и 100% от полной мощности. Каждый канал работает независимо друг от друга, последний выбранный режим работы запоминается в энергонезависимой памяти (EEPROM) и при следующем включении выбирается автоматически. При включении нагрева сначала на некоторое время включается режим интенсивного прогрева на полной мощности, после чего автоматически включается последний запомненный режим. Время интенсивного нагрева можно настроить в процессе эксплуатации, для этого при выключенном нагреве зажимается качелька включения водительского сиденья на 2 секунды, после чего блок включает водительский обогрев на полную мощность. Как только начало припекать, выключаем нагрев, блок запоминает время и переходи в штатный режим. В дальнейшем будет включаться именно на это время.Индикация каждого канала сделана двумя светодиодами: 30% - зеленый цвет, 60% - желтый, 100% - красный. Режим интенсивного прогрева индицируется миганием красным цветом, режим настройки времени - миганием зеленым.Хотелось сделать чтобы обновленный блок встал без переделок на имеющуюся проводку, но поскольку место под монтаж в блоке сильно ограниченно, пришлось использовать наиболее простую схему включения силового транзистора, которая подразумевает управление нагрузкой минусом и постоянным присутствием плюса на втором выводе нагрузки, а в штатном было наоборот: один вывод постоянно на массе и коммутируется плюс. Потому неизбежны небольшие переделки проводки.
    Принципиальная схема:Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-assheat.jpg
    В конечном варианте были незначительные отступления от данной схемы на случай возникновения наводок от зажигания, генератора и т.п. (МК очень чувствителен к помехам по питанию), но практика показала, что и без них все отлично работает.

    В процессе работы над девайсом наткнулся на такое решение: http://www.drive2.ru/communities/e-stuff/blog/636105
    Идея и реализация интересная, за счет того, что отказались от родных кнопок, который отъедают 60% полезной площади платы, в пользу микриков от обычной бытовой аппаратуры, удалось высвободить достаточно места для дополнительной обвязки МК, но пришлось колхозить свои стоечки для качелек из текстолита. Я надеялся, что получится снять родные и поставить на новую плату, но я ошибся, качество их изготовления осталяло желать лучшего и они были плотно завальцованы на плате и мне пришлось таки одну стоечку делать такую же самодельную. Также я сомневался, что микрики дадут достаточное усилие нажатия в такой конструкции, частично мои опасения нашли подтверждения в комментах на драйве. Кроме того, автором устройства был использован более дорогой микроконтроллер, в тоже время мой опыт показал, что более дешевого и компактного вполне достаточно.

    На данный момент блок полностью готов, осталось только переделать проводку.

    Чего в нем нет:
    Возможности определять обрыв или КЗ в нагрузке и сигнализировать об этом. Хотел реализовть, но помешала банальная нехватка места, для измерения тока нужны довольно массивные резисторы, которые просто негде разместить в таком корпусе.
    Возможности корректировать алгоритм работы по датчику температуры. Тут рассматривал два варианта: либо автоматически включать после длительной стоянки если температура воздуха ниже некоторого порога, либо установить термопару непосредственно под обивку сидений и поддерживать заданную температуру. Второй вариант посчитал утопичным и слишком перфекционистским, ибо понятия не имею как засунуть в сиденье термомару чтобы она давала объективные показания, когда само сиденье прогревается неравномерно. В тоже время прошивка занимает 98% отведенного для нее места в МК, потому отбросил и первый вариант. Можно было конечно сделать глубокую оптимизацию и/или переписать все на ассемблере, но для меня эта фича не на столько важна чтобы столько возиться.

    Себестоимость:
    1. Микроконтроллер Attiny2313-SU20 - 140р 1шт.
    2. SMD светодиоды для индикации режима 9р 4шт (красные и зеленые по два)
    3. Линейный стабилизатор 78L05 для питания МК - 25р 1шт
    4. Керамические конденсаторы - 2шт по 5р
    5. Резисторы 13шт - бесплатно со старой материнской платы.
    6. Силовые MOSFET-транзисторы - 2шт, бесплатно оттуда же.
    7. Светодиоды для подсветки кнопок - 2шт со штатной платы, бесплатно.
    8. Кнопки 4шт - бесплатно, оттуда же.
    9. Расход текстолита и химии для изготовления платы - ~20р

    Итого: 231р.



    Вот собстенно и все, надеюсь информация была для кого-нибудь полезна.
    Миниатюры Миниатюры Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0654.jpg   Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0658.jpg   Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0662.jpg   Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0665.jpg  

    Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0666.jpg   Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0668.jpg   Блок управления подогревом сидений на микроконтроллере в корпусе от ВАЗ-2110-img_0669.jpg  
    Последний раз редактировалось AKWoland; 10.02.2014 в 23:40.

  2. #2
    Олег92
    Старожил
    У меня почему-то регулировка подогрева сидений себя не оправдала. Когда начинаю чувствовать что тепло пошло выключаю полностью и сиденье остаётся тёплым, дальше греть не за чем. Вот для руля очень кстати регулятор, на минимум ставлю и руль постоянно подогревается немного.

  3. #3
    AKWoland
    Автор темы
    Исходник прошивки (С, Atmel Studio)

    Скрытый текст

    /** AssHeat.c
    *
    * Created: 25.12.2013 2:29:55
    * Author: Alex
    */




    #include <avr/io.h>


    #include <avr/interrupt.h>
    #include <avr/delay.h>
    #include <avr/eeprom.h>




    #define CHAN1_INC 0
    #define CHAN1_DEC 1


    #define CHAN2_INC 2
    #define CHAN2_DEC 3


    #define MAX_STAGE 3




    volatile unsigned char chan1Stage = 0;
    volatile unsigned char chan2Stage = 0;


    volatile uint32_t channel1StartCount = 0;
    volatile uint32_t channel2StartCount = 0;


    volatile int chan1HeatMode = 0;
    volatile int chan2HeatMode = 0;


    volatile int indicatorFlashCounter = 0;
    volatile int indicatorFlashState = 0;


    volatile int buttonPressTime[4];
    volatile char buttonStates[] = {0,0,0,0};
    char buttonPins[] = {PB0, PB1, PB6, PB7};


    //volatile char btn1State = 0;
    //volatile char btn2State = 0;
    //volatile char btn3State = 0;
    //volatile char btn4State = 0;


    volatile char learnMode = 0;


    uint32_t heatingTime_ee EEMEM;


    volatile uint32_t heatingTime = 0;


    char chan1LastStage_ee EEMEM;
    char chan2LastStage_ee EEMEM;


    char chan1LastStage = 0;
    char chan2LastStage = 0;




    void startHeat(unsigned char chan)
    {
    if (1==chan)
    {
    channel1StartCount = 0;
    chan1HeatMode = 1;
    }
    else if (2==chan)
    {
    channel2StartCount = 0;
    chan2HeatMode = 1;
    }
    }


    void updateStatusLeds()
    {
    if (chan1HeatMode==0)
    {
    switch (chan1Stage)
    {
    case 0:
    PORTD &= ~(1 << PD0);
    PORTD &= ~(1 << PD1);
    break;
    case 1:
    PORTD &= ~(1 << PD0);
    PORTD |= (1 << PD1);
    break;
    case 2:
    PORTD |= (1 << PD0);
    PORTD |= (1 << PD1);
    break;
    case 3:
    PORTD |= (1 << PD0);
    PORTD &= ~(1 << PD1);
    break;
    }
    }

    if (chan2HeatMode==0)
    {
    switch (chan2Stage)
    {
    case 0:
    PORTD &= ~(1 << PD2);
    PORTD &= ~(1 << PD3);
    break;
    case 1:
    PORTD &= ~(1 << PD2);
    PORTD |= (1 << PD3);
    break;
    case 2:
    PORTD |= (1 << PD2);
    PORTD |= (1 << PD3);
    break;
    case 3:
    PORTD |= (1 << PD2);
    PORTD &= ~(1 << PD3);
    break;
    }
    }


    }




    void strartLearn()
    {
    learnMode = 1;
    }


    void stopLearn()
    {
    heatingTime = channel1StartCount;
    eeprom_write_dword(&heatingTime_ee, heatingTime);
    learnMode = 0;
    chan1HeatMode = 0;
    channel1StartCount = 0;

    }


    void buttonDown(int btn)
    {

    }


    void updateState()
    {
    updateStatusLeds();
    updatePWM();
    }


    void buttonUp(int btn, int pressTime)
    {
    _delay_ms(20);

    //PORTB |= (1 << PB4);
    switch (btn)
    {
    case CHAN1_INC:

    if (pressTime<35)
    {
    if (0==chan1Stage)
    {
    startHeat(1);
    if (chan1LastStage>0 && chan1LastStage <= MAX_STAGE)
    chan1Stage = chan1LastStage;
    else
    chan1Stage = 1;
    }
    else if (chan1Stage<MAX_STAGE && chan1HeatMode==0)
    {
    chan1Stage++;
    chan1LastStage = chan1Stage;
    eeprom_write_byte(&chan1LastStage_ee, chan1LastStage);
    }
    }
    break;

    case CHAN1_DEC:
    if (1==learnMode)
    {
    stopLearn();
    if (chan1LastStage>0 && chan1LastStage <= MAX_STAGE)
    chan1Stage = chan1LastStage;
    else
    chan1Stage = 1;
    }
    else if (pressTime<35)
    {
    if (chan1Stage>0 && chan1HeatMode==0)
    {
    chan1Stage--;
    if (chan1Stage==0)
    chan1HeatMode = 0;
    else
    {
    chan1LastStage = chan1Stage;
    eeprom_write_byte(&chan1LastStage_ee, chan1LastStage);
    }
    }
    else if (chan1HeatMode==1)
    {
    chan1HeatMode = 0;
    }
    }
    break;

    case CHAN2_INC:
    if (0==chan2Stage)
    {
    startHeat(2);
    if (chan2LastStage > 0 && chan2LastStage <= MAX_STAGE)
    chan2Stage = chan2LastStage;
    else
    chan2Stage = 1;
    }
    else if (chan2Stage<MAX_STAGE && chan1HeatMode==0)
    {
    chan2Stage++;
    chan2LastStage = chan2Stage;
    eeprom_write_byte(&chan2LastStage_ee, chan2Stage);
    }
    break;

    case CHAN2_DEC:
    if (pressTime < 35)
    {
    if (chan2Stage>0 && chan2HeatMode==0)
    {
    chan2Stage--;
    if (chan2Stage==0)
    chan2HeatMode = 0;
    else
    {
    chan2LastStage = chan2Stage;
    eeprom_write_byte(&chan2LastStage_ee, chan2LastStage);
    }
    }
    else if (chan2HeatMode==1)
    {
    chan2HeatMode=0;
    }
    }
    break;
    }

    updateState();


    }


    //#define Prescaler 0x01 //0x00 - для кварца 4MHz, 0x01 - для кварца 8MHz...


    void updatePWM()
    {
    // fast PWM mode
    TCCR0A = (1 << WGM01) | (1 << WGM00);
    if (chan1Stage>0 || chan1HeatMode)
    {
    TCCR0A |= (1 << COM0A1);
    }
    if (chan2Stage>0 || chan2HeatMode)
    {
    TCCR0A |= (1 << COM0B1);
    }
    }


    void loadEepromValues()
    {
    heatingTime = eeprom_read_dword(&heatingTime_ee);
    if (0==heatingTime)
    heatingTime = 1000;

    chan1LastStage = eeprom_read_byte(&chan1LastStage_ee);
    chan2LastStage = eeprom_read_byte(&chan2LastStage_ee);
    }


    int main(void)
    {

    unsigned char stateValues[] = {255,64,128,254};


    DDRB = 0;
    DDRD = 0;


    DDRB |= (1 << PB2) | (1 << PB4); // PWM output on PB2 - OC0A
    DDRD |= (1 << PD5) | (1 << PD0) | (1 << PD1) | (1 << PD2) | (1 << PD3); // PWM output on PD5 - OC0B


    TCCR0A = (1 << WGM01) | (1 << WGM00);
    TCCR0B = (1 << CS02); // clock source = CLK/8, start PWM




    TCCR1A = 0;
    TCCR1B = (0 << CS12)|(1 << CS11)| (0 << CS10);//|(1 << WGM12); //предделитель clk/1024, режим таймера СТС;
    OCR1AH=0x0F; OCR1AL=0x42; // Число N=15625=0x3D09.
    TCNT1 = 0;

    //OCR1A = 0;//62500/1; // compare match register.

    //TCCR1B |= (1 << WGM12); // CTC mode
    //TCCR1B |= (1 << CS12); // 256 prescaler
    TIMSK |= (1 << OCIE1A); // enable timer compare interrupt


    //TIMSK = (TOIE1<<1);
    //TCNT1 = 7;


    chan1Stage = 0;
    chan2Stage = 0;


    PORTB &= ~(1 << PB4);


    PORTB |= (1 << PB0);
    PORTB |= (1 << PB1);


    PORTB |= (1 << PB6);
    PORTB |= (1 << PB7);

    loadEepromValues();


    sei();


    while(1)
    {
    OCR0A = chan1HeatMode==0 ? stateValues[chan1Stage] : 254;// PWM_val1; // write new PWM value
    OCR0B = chan2HeatMode==0 ? stateValues[chan2Stage] : 254;

    for (char btn=0;btn<4;++btn)
    {
    if ((PINB & (1 << buttonPins[btn]))==0)
    {
    if (0==buttonStates[btn])
    {
    buttonDown(btn);
    buttonPressTime[btn] = 0;
    }
    buttonStates[btn] = 1;

    }
    else
    {
    if (1==buttonStates[btn])
    {

    buttonUp(btn, buttonPressTime[btn]);
    }
    buttonStates[btn] = 0;
    }
    }



    if (buttonStates[CHAN1_DEC]==1 && buttonPressTime[CHAN1_DEC]>35)
    {
    chan1Stage = 0;
    chan1HeatMode = 0;
    updateState();
    }

    if (buttonStates[CHAN2_DEC]==1 && buttonPressTime[CHAN2_DEC]>35)
    {
    chan2Stage = 0;
    chan2HeatMode = 0;
    updateState();
    }

    if (buttonStates[CHAN1_INC]==1 && 0==chan1Stage && buttonPressTime[CHAN1_INC] > 35)
    {
    startHeat(1);
    strartLearn();
    updateState();
    }
    }




    }


    int state = 0;


    ISR (TIMER1_COMPA_vect)
    {
    TCNT1H=0; TCNT1L=0; // Сброс таймера.

    for (char btn=0;btn<4;++btn)
    {
    if (buttonStates[btn]!=0)
    buttonPressTime[btn]++;
    }



    indicatorFlashCounter++;


    if (indicatorFlashCounter > 4)
    {
    indicatorFlashCounter = 0;
    indicatorFlashState = ~ indicatorFlashState;
    }


    if (chan1HeatMode == 1)
    {
    channel1StartCount ++;
    if (channel1StartCount > heatingTime && learnMode == 0)
    {
    chan1HeatMode = 0;
    updateStatusLeds();
    }
    else
    {
    int port = learnMode==0 ? PD0 : PD1;
    if (indicatorFlashState==0)
    PORTD &= ~ (1 << port);
    else
    PORTD |= (1 << port);
    }
    }

    if (chan2HeatMode == 1)
    {
    channel2StartCount ++;
    if (channel2StartCount > heatingTime)
    {
    chan2HeatMode = 0;
    updateStatusLeds();
    }
    else
    {
    if (indicatorFlashState==0)
    PORTD &= ~ (1 << PD2);
    else
    PORTD |= (1 << PD2);
    }
    }


    }
    [свернуть]


    - - - Добавлено - - -

    Цитата Сообщение от Олег92 Посмотреть сообщение
    У меня почему-то регулировка подогрева сидений себя не оправдала. Когда начинаю чувствовать что тепло пошло выключаю полностью и сиденье остаётся тёплым, дальше греть не за чем.
    Вот когда как. Иногда выключаешь и больше не надо, иногда хочется чтоб слегка подогревало. Жена того же мнения.Просто жарить начинает через примерно минуту-полторы, на сильом морозе - через две три, а салон еще слишком холодный.
    Цитата Сообщение от Олег92 Посмотреть сообщение
    Вот для руля очень кстати регулятор, на минимум ставлю и руль постоянно подогревается немного.
    К следующей зиме планирую сделать подогрев руля. Но там с подведением проводов пока непонятки.

  4. #4
    Олег92
    Старожил
    Цитата Сообщение от AKWoland Посмотреть сообщение
    К следующей зиме планирую сделать подогрев руля. Но там с подведением проводов пока непонятки.
    http://www.nexia-club.ru/f/tula/1521...63#post1894098
    http://www.nexia-club.ru/f/tula/1521...64#post1901440 сигнал перенёс на кнопку от дверного звонка (под переключателем видно). Скользящий контакт сигнала отлично справляется, мощность 50-60 ватт.
    http://www.nexia-club.ru/f/tula/1521...72#post1914986 регулировать мощность пришлось плюсовым проводом, понадобилось 4 p-канальных полевика чтобы не грелся регулятор.

  5. #5
    AKWoland
    Автор темы
    Идея конечно интересная, но для меня данный процесс больше хобби, чем бытовая необходимость, потому есть специфические условия: чтобы все выглядело как заводское или максимально к нему приближено. Потому вариант с кнопкой от звонка не смотря на свою простоту не канает. Пока два варианта на повестке дня: 1. Использовать улитку от Приоры. Достоинства: дофига линий, можно и сигнал сохранить, и подогрев запилить, и кнопки майфуна вывести до кучи. Недостатки: дорого, непонятно как на нексии это дело крепить. 2. На штатном скользящем контакте использовать что-то типа 1-Wire. Т.е. по этому контакту подаем питание на устройство в руле и по этому же проводу передаем этому девайсу данные и принимаем. По сигналу снаружи плата включит или выключит обогрев, запитав его от той же шины, можно отправить команду изменения скважности ШИМ, а также руль сможет сообщить о нажатии как сигнала, так и любой другой кнопки, которая может понадобиться. Преимущества: простота реализации механической части, недостатки: непонятно как это дело на скользящем контакте, где постоянно есть дребезг, будет работать.

  6. #6
    AKWoland
    Автор темы
    Вчера подправил наконец проводку под сиденьями, пока сделал времянку, ибо пока снимать сиденья перспектива не радует. Сегодня первый день покатался, все работает как надо, но субъективно показалось, что калибровки режимов я выбрал не самые удачные. На зеленом (первом, 33% мощности) режиме подогрев едва чувствуется, хотя за бортом +3, на желтом (втором, 66%) получается легкий ненавязчивый подогрев, в -10 и ниже его уже будет недостаточно, примерно так я себе представлял зеленый режим, ну и красный никуда не делся, 100% они и в африке 100%, жарит как и раньше, это значит, что падение напряжения на силовом мосфете минимальное и за перегрев можно не переживать.
    Как будет свободное время залью прошивку с новыми калибровками: зеленый - 50%, желтый - 75 или 80% Пока покатаюсь так, может еще мнение поменяю.
    Вообще, если сравнивать с регулировкой колесиком, то я считаю, что она себя не оправдывает: да, можно выставить любой нагрев, но запомнить комфортный режим и после выставить его снова там сложнее. Тем более, высокой точности тут не нужно, двух-трех хорошо подобранных промежуточных режимов должно быть достаточно. Я выбрал два чтобы немного упростить немного трассировку платы для индикации.

  7. #7
    Oxx
    Новичок
    Здравствуйте! Это то, что я искал! Хочу собрать такой блок, не могли бы Вы выложить схемку более качественную, не получается на этой разобрать номера выводов МК и, если можно прошивочку в .hex

  8. #8
    AKWoland
    Автор темы
    Цитата Сообщение от Oxx Посмотреть сообщение
    Здравствуйте! Это то, что я искал! Хочу собрать такой блок, не могли бы Вы выложить схемку более качественную, не получается на этой разобрать номера выводов МК и, если можно прошивочку в .hex
    Схемку боюсь не найду уже, вот исходник платы готовый https://yadi.sk/d/hnpukxeJcyvHF
    Бинарника у меня сейчас нет, на другом винте он остался, боюсь найти проблематично. Качай AVR Studio, создавай пустой проект для 2313, там будет файлик main.c, удаляй его содержимое, вместо него вставляй исходник из моего поста выше, можно компилить. Только обязательно релиз-версию, ибо дебаг не проходит под ограничение по объему памяти.

  9. #9
    Oxx
    Новичок
    Спасибо за быстрый ответ! Попробую эмулировать в протеусе, надеюсь, разберусь что к чему.

  10. #10
    AKWoland
    Автор темы
    Удачи! Рад что моя статья была полезной.

Похожие темы

  1. ДПДЗ от ВАЗ 2110
    от Hapson в разделе Электрооборудование и электроника
    Ответов: 4
    Последнее сообщение: 20.09.2014, 00:26
  2. Электростеклоподъемники от ВАЗ 2110
    от Alti в разделе Электрооборудование и электроника
    Ответов: 1
    Последнее сообщение: 13.07.2012, 00:02
  3. блок управления электростеклоподъёмниками от ВАЗ 1118
    от Neznaemo Kto в разделе Ответы на вопросы по тюнингу
    Ответов: 117
    Последнее сообщение: 17.03.2012, 01:02
  4. Реле центрального замка на Нексию от ВАЗ-2110
    от GalS в разделе Электрооборудование и электроника
    Ответов: 0
    Последнее сообщение: 23.10.2011, 21:52
  5. Приборы от ваз 2110
    от Alex484 в разделе Электрооборудование и электроника
    Ответов: 9
    Последнее сообщение: 12.03.2010, 03:37

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •