1. В сообществе нашего форума Вконтакте создан раздел по продаже электронных компонентов.
    Каждый может продать в нем свои залежавшиеся детали. Подробности здесь.

Решено Стеклоподъемники для Audi 80

Тема в разделе "Автомобильная электроника", создана пользователем Buba_Chkhadze, 19 янв 2015.

  1. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    вроде конец уже, потом как все отлажу напишу отдельный туториал, а обсуждения пусть останутся, мало ли какие проблемы возникнут...
    я так думаю ;)
    --- Сообщения объединены, 11 авг 2015 ---
    щас чуть позже попробую
  2. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    переделал, вроде работает, подстроечник не крутил даже. Подождем\посмотрим что будет ...
  3. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.848
    Симпатии:
    313
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Тут вот плохая мысля закралась. Что будет, если закрываем от центр.замка (двигатель заглушен), а аккум не полностью заряжен?
    Компаратор может не сработать, не хватит тока/напруги на шунте. Надо обязательно проверить на подсевшем аккуме.
    А лучше опору брать с простого делителя сразу от аккума, без диода (заменить простым резистором), чтобы при пониженном напряжении опора компаратора тоже меньше была.
  4. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    у
    меня такое впечатление, что получилось наоборот, т.е. при меньшей напруге нормально , а при большей может не сработать
  5. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.848
    Симпатии:
    313
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Ноборот не должно быть. При большем напряжении у моторов будет больший ток упора и, следовательно, большее напряжение на шунте.
  6. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    так за два несрабатывания оба раза так было, в первый раз он не сработал когда я машину завел и напруга поднялась, второй
    сегодня, после вчерашней зарядки
  7. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.848
    Симпатии:
    313
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Надо-бы сравнить напряжение на шунте при разном питании. Я так не понимаю этот эффект.
  8. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    пока посмотрим как работает, там видно будет
  9. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    доработали код, добавили отключение моторов по времени

    PHP:
    /*
    * GccWind_2.cpp
    *
    * Created: 01.05.2015 13:33:45
    *  Author: BUBA_CHKHADZE
    */
    #define F_CPU 1000000UL
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdio.h>
    #include <avr/interrupt.h>



    int  LK1LK2RK1RK2LR1LR2LARA;
    int LTimRunRTimRun;                                  //("1" = run, "0" = stop)
    int LTimCntRTimCnt;                                  // счетчики интервалов 0.1 сек
    int LTimRunCntRTimRunCnt;                            // счетчики времени откр\закр для правой и левой дверей
    enum MoveStates {stStoppedstMovedUpstMovedDownstAligned};   //машина состояния моторов
    MoveStates LStateRState;                             // состояния левого и правого подъемников




    void SetupTIMER1 (void)
    {
        
    TCCR1B 0x05;                                     //инициализация управления таймером 1000000/1024 гЦ
        
    TCNT1H 0xFF;                                     //инициализация счетного регистра таймера
        
    TCNT1L 255-97;
        
    TIMSK |= (<< 2);                                 //разрешаем прерывание по переполнению таймера
        
    sei ();
        }                                                  
    //общее разрешение прерываний
     
     
     

    ISR (TIMER1_OVF_vect)                                  // Обработка прерывания по переполнению
    {
        
    TCNT1H 0xFF;                                     //инициализация счетного регистра таймера
        
    TCNT1L 255-97;
     
        if (
    LTimRun == 1) {LTimCnt++;}                     //если левый таймер запущен, левый счетчик ++
        
    if (RTimRun == 1) {RTimCnt++;}                     //если правый таймер запущен, правый счетчик ++     
        
    if (LTimCnt 0) {LTimRunCnt++;} else {LTimRunCnt=0;} // если левый счетчик больше 0, левый счетчик откр\закр ++
        
    if (RTimCnt 0) {RTimRunCnt++;} else {RTimRunCnt=0;} // если правый счетчик больше 0, правый счетчик откр\закр ++     
    }


     
        
    // запустить левый счетчик с "0"
        
    void LTimer_Start()
        {
            
    LTimRun=1;
            
    LTimCnt=0;
        }

        
    // остановить левый счетчик
        
    void LTimer_Stop()
        {
            
    LTimRun=0;
        }

        
    // остановить и обнулить левый счетчик
        
    void LTimer_Reset()
        {
            
    LTimRun=0;
            
    LTimCnt=0;
        }
     
        
    // запустить правый счетчик с "0"
        
    void RTimer_Start()
        {
            
    RTimRun=1;
            
    RTimCnt=0;
        }

        
    // остановить правый счетчик
        
    void RTimer_Stop()
        {
            
    RTimRun=0;
        }

        
    // остановить и обнулить правый счетчик
        
    void RTimer_Reset()
        {
            
    RTimRun=0;
            
    RTimCnt=0;
        }

        
    // левый двигатель выключен
        
    void LMotor_Stop()
        {
            
    PORTB&= ~(<< 0);
            
    PORTB&= ~(<< 1);
        }

        
    // левый двигатель поднимает стекло
        
    void LMotor_Up()
        {
            
    PORTB|= (<< 0);
            
    PORTB&= ~(<< 1);
        }

        
    // левый двигатель опускает стекло
        
    void LMotor_Dn()
        {
            
    PORTB&= ~(<< 0);
            
    PORTB|= (<< 1);
        }
     
        
    // правый двигатель выключен
        
    void RMotor_Stop()
        {
            
    PORTB&= ~(<< 2);
            
    PORTB&= ~(<< 3);
        }

        
    // правый двигатель поднимает стекло
        
    void RMotor_Up()
        {
            
    PORTB|= (<< 2);
            
    PORTB&= ~(<< 3);
        }

        
    // правый двигатель опускает стекло
        
    void RMotor_Dn()
        {
            
    PORTB&= ~(<< 2);
            
    PORTB|= (<< 3);
        }
     

    int main(void)
    {
        
    DDRD  0x00;             // порт D на вход
        
    DDRC  0x00;             // порт С на вход
        
    PORTC 0xFF;             // установить 1
        
    DDRB  0xFF;             // порт В на выход
        
    PORTB 0x00;             // установить 0
     
         
        // установка начальных значений переменных
        
    LState stStopped;                              
        
    RState stStopped;                              
        
    LTimRun 0;
        
    RTimRun 0;
        
    LTimCnt 0;
        
    RTimCnt 0;
     
             
        
    SetupTIMER1(); 
     
        while(
    1)
        {
            
    //сбросить переменные кнопок
            
    LK1 0;
            
    LK2 0;
            
    RK1 0;
            
    RK2 0;
            
    LR1 0;
            
    LR2 0;
                 
         
            
    // установить для левой двери кнопки
            
    if ((PIND& (<< 0)) != 0) {LK1 1;}
            if ((
    PIND& (<< 1)) != 0) {LK2 1;}
            
    // вход с компаратора
            
    if ((PINC& (<< 0)) == 0) {LTimer_Start(); LState=stAligned;}
             
            
    // установить для правой двери кнопки
            
    if ((PIND& (<< 2)) != 0) {RK1 1;}
            if ((
    PIND& (<< 3)) != 0) {RK2 1;}
                     
            
    // установить дублер для правой двери
            
    if ((PIND& (<< 4)) != 0) {LR1 1;}
            if ((
    PIND& (<< 5)) != 0) {LR2 1;}
         
            
    // обработка дублера для правой двери 
            
    if ((LR1 == 1)||(LR2 == 1)) {RK1 LR1RK2 LR2;} 
             
            
    // вход с компаратора
            
    if ((PINC& (<< 1)) == 0) {RTimer_Start(); RState=stAligned; } 
         
            
    // закрытие от центрального замка 
            
    if ((PIND& (<< 6)) == 0)
                 {
                     
    _delay_ms(3000);
                     if ((
    PIND& (<< 6)) == 0// через 2 сек проверить нажатие кнопки
                     
    {
                     
    LTimer_Reset(); RTimer_Reset();
                     
    LTimRunCnt++; RTimRunCnt++;
                     
    LState=stMovedUpRState=stMovedUp;
                    
                     }
                 }
            
    // таймеры на время открытия\закрытия
             
    if (LTimRunCnt 45) {LTimer_Reset(); LState=stStopped;}
             if (
    RTimRunCnt 55) {RTimer_Reset(); RState=stStopped;}
                       
                
    // обработка машины состояний левой двери
                
    switch (LState)
                {
                    
    //состояние мотора левой двери "стоп"
                    
    case stStopped:
                    if (
    LK1==1) {LTimer_Start(); LState=stMovedUp;}
                    if (
    LK2==1) {LTimer_Start(); LState=stMovedDown;}
                    break;
                 
                    
    //состояние мотора левой двери "стекло вверх"
                    
    case stMovedUp:
                    if ((
    LK1==0)&&(LTimCnt<10)) {LTimer_Stop(); LState=stMovedUp;}
                    if ((
    LK1==0)&&(LTimCnt>10)) {LTimer_Reset(); LState=stStopped;}
                    if (
    LK2==1) {LTimer_Reset(); LState=stStopped_delay_ms(250);}
                    break;
                                                 
                    
    //состояние мотора левой двери "стекло вниз"
                    
    case stMovedDown:
                    if ((
    LK2==0)&&(LTimCnt<10)) {LTimer_Stop(); LState=stMovedDown;}
                    if ((
    LK2==0)&&(LTimCnt>10)) {LTimer_Reset(); LState=stStopped;}
                    if (
    LK1==1) {LTimer_Reset(); LState=stStopped_delay_ms(250);}
                    break;
                         
                    
    // обработка крайних положений
                    
    case stAligned:
                    if (
    LTimCnt 10) {LTimer_Reset(); LState=stStopped;}
                    break;     
                }
             
                
    // обработка состояния левого двигателя
                
    switch (LState)
                {
                    case 
    stStoppedLMotor_Stop(); break;
                    case 
    stMovedUpLMotor_Up(); break;
                    case 
    stMovedDownLMotor_Dn(); break;
                    case 
    stAlignedLMotor_Stop(); break;             
                }
                 
                 
                 
                    
    // обработка машины состояний правой двери
                    
    switch (RState)
                    {
                        
    //состояние двигаделя правой двери "стоп"
                        
    case stStopped:
                        if (
    RK1==1) {RTimer_Start(); RState=stMovedUp;}
                        if (
    RK2==1) {RTimer_Start(); RState=stMovedDown;}
                        break;
                     
                        
    //состояние двигателя правой двери "стекло вверх"
                        
    case stMovedUp:
                        if ((
    RK1==0)&&(RTimCnt<10)) {RTimer_Stop(); RState=stMovedUp;}
                        if ((
    RK1==0)&&(RTimCnt>10)) {RTimer_Reset(); RState=stStopped;}
                        if (
    RK2==1) {RTimer_Reset(); RState=stStopped_delay_ms(250);}
                        break;
                     
                        
    //состояние мотора правой двери "стекло вниз"
                        
    case stMovedDown:
                        if ((
    RK2==0)&&(RTimCnt<10)) {RTimer_Stop(); RState=stMovedDown;}
                        if ((
    RK2==0)&&(RTimCnt>10)) {RTimer_Reset(); RState=stStopped;}
                        if (
    RK1==1) {RTimer_Reset(); RState=stStopped_delay_ms(250);}
                        break;
                     
                        
    // обработка крайних положений
                        
    case stAligned:
                        if (
    RTimCnt 10) {RTimer_Reset(); RState=stStopped;}
                        break;
                     
                    }
                 
                    
    // обработка состояния правого двигателя
                    
    switch (RState)
                    {
                        case 
    stStoppedRMotor_Stop(); break;
                        case 
    stMovedUpRMotor_Up(); break;
                        case 
    stMovedDownRMotor_Dn(); break;
                        case 
    stAlignedRMotor_Stop(); break;
                    }
                 
                 
                        
    _delay_ms(200);
            }
        }
    Последнее редактирование: 21 авг 2015
  10. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    закладку сделаю http://www.onsemi.ru.com/pub_link/Collateral/BBS3002-D.PDF
    --- Сообщения объединены, 21 авг 2015 ---
    а разве сюда не надо добавить LTimRunCnt=0 и RTimRunCnt=0 ?

    // установка начальных значений переменных
    LState = stStopped;
    RState = stStopped;
    LTimRun = 0;
    RTimRun = 0;
    LTimCnt = 0;
    RTimCnt = 0;
    Последнее редактирование: 21 авг 2015
  11. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.848
    Симпатии:
    313
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    Можно не добавлять, как только прерывание по таймеру сработает, то они сами правильно установятся.
    Хотя... чисто для "правильности" кода - можно в "0" установить.
  12. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    ясно, щас поставлю
  13. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    выявилось пару косяков. Один косяк простой, похолодало и левое окно стало выключаться раньше чем надо
    (слишком рано компаратор отключает), всё таки придется опорное для компараторов делать раздельное.
    Второй косяк интереснее, если машина не завелась с первого раза, крутишь еще раз, и после запуска двигателя
    включаются сами оба окна вверх :eek:, компараторы конечно срабатывают, но неприятно
  14. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    пометка: запустить таймер почаще
    вместо TCNT1L = 255-97;
    поставить TCNT1L = 255-57; в двух местах

    перенести из конца в начало кода и уменьшить задержку до 100мс
    Последнее редактирование: 1 окт 2015
  15. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    проверил в старом коде, там точно так же, в первые три секунды компараторы не срабатывают , когда
    от центр замка. В протеусе по ступеням вроде все срабатывает нормально, только почему то я там
    время не вижу, мож смотрю не там
  16. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    так ?
    PHP:
    if (((PIND& (<< 6)) == 0)&& (DLpressed == 0))
                 {
                     
    DLpressed 1;
                     
    _delay_ms(3000);
                     if ((
    PIND& (<< 6)) == 0) {DLpressed 0;} // через 3 сек проверить нажатие кнопки
                     
    {
                     
    LTimer_Reset(); RTimer_Reset();
                     
    //LTimCnt++; RTimCnt++;
                     
    LState=stMovedUpRState=stMovedUp;
                     }
                 }
  17. UL7AAjr

    UL7AAjr В доску свой

    Сообщения:
    1.848
    Симпатии:
    313
    Род занятий:
    инженер-программист
    Адрес:
    Алма-Ата
    было так

    // закрытие от центрального замка
    if ((PIND& (1 << 6)) == 0)
    {
    _delay_ms(3000);


    надо так


    // проверка, что кнопка центр.замка отжата, сбрасываем признак нажатия
    if ((PIND& (1 << 6)) != 0) {DLpressed = 0};

    // закрытие от центрального замка (только если нет признака нажатия)
    if (((PIND& (1 << 6)) == 0) && (DLpressed == 0))
    {
    // устанавливаем признак нажатия кнопки центр.замка.
    DLpressed = 1;
    _delay_ms(3000);​
    ........
    Последнее редактирование: 12 окт 2015
  18. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    вот так работает вроде :)

    PHP:
    // закрытие от центрального замка
            
    if ((PIND& (<< 6)) != 0) {DLpressed 0;}   
            if (((
    PIND& (<< 6)) == 0)&& (DLpressed == 0))
                 {
                     
    DLpressed 1;
                     
    _delay_ms(3000);
                      if ((
    PIND& (<< 6)) == 0// через 2 сек проверить нажатие кнопки
                     
    {
                     
    LTimer_Reset(); RTimer_Reset();
                     
    //LTimCnt++; RTimCnt++;
                     
    LState=stMovedUpRState=stMovedUp;
                     }
                 }
  19. Buba_Chkhadze

    Buba_Chkhadze Модератор Команда форума

    Сообщения:
    4.343
    Симпатии:
    353
    Адрес:
    Талгар
    разделил опору, еле запихал блин, места совсем не осталось. Что то
    устройство обрастает деталями и
    становится страшно смотреть на него :D
    буду пробовать ;)

    4 версия.jpg
  20. SeregaZ

    SeregaZ В доску свой

    Сообщения:
    391
    Симпатии:
    38
    представляю что будет, когда тот клиент, кому ты продашь машину когданить, чонить сломает и поедет к электрику чинить :))))))))))))

Поделиться этой страницей