На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Страницы: (3) [1] 2 3  все  ( Перейти к последнему сообщению )  
    > Какието непонятки с ШИМ + энкодер , ATTiny2313
      Попробовал прикрутить энкодер к контроллеру ATTiny2313 и с его помошью изменять параметр заполнения ШИМ.
      Работает, но очень криво и что самое страшное - через некоторе время контроллер может зависнуть.

      Кривость работы заключается в том, что например если увеличивать заполнение ШИМ, то светодиод начинает светить ярче, как и положено, НО через некоторе время он может вообще потухнуть / мигнуть / включиться на максиммум и в целом вести себя неадекватно :wacko:
      Или может начать моргать (как бы "коротить") светодиод на другом порту, что ещё более странно.
      Можно было бы сослаться на дребезг, но это явно не он, т.к. пробовал подавлять его многими способами включая длительные задержки / флаги.
      Глюки практически не зависят от скорости вращения ручки.


      Схема подключения

      Энкодер:
      Канал "А" : PORTD -> PD2 (INT0)
      Канал "B" : PORTD -> PD3
      Канал "С" : Земля
      Кнопка : PORTD -> PD0


      Светодиод ШИМ: PORTB -> PB3 (OC1)
      Дополнительный светодиод: PORTB -> PB0

      RESET через 10к резистор подтянут на плюс.

      Питание от +5 вольт с компьютера (красный/черный провода в молекс коннектора блока питания)


      Прошивка:
      ExpandedWrap disabled
        #include <inttypes.h>
        #include <avr/io.h>
        #include <avr/interrupt.h>
        #include <avr/sleep.h>
         
        #include "iocompat.h"
         
         
        volatile SHORT  PWMValue;   // --- Переменная со значением ШИМ
         
         
         
         
        void setPin(uint8_t Pin, uint8_t Enable){
            if(Enable) PORTB |= _BV(Pin);
            else PORTB &= ~_BV(Pin);
        }
         
         
         
        int main (void){
            
            // --- Настройка ШИМ
            TCCR1A      =   TIMER1_PWM_INIT;
            TCCR1B      |=  TIMER1_CLOCKSOURCE;
            TIMSK       = _BV (TOIE1);          // - Прерывание по переполнению таймера
            OCR         = 0;                    // - Стартовое значение ШИМ
            PWMValue    = 0;
         
            // --- Обработка хуков настройки таймера
            #if defined(TIMER1_SETUP_HOOK)
                TIMER1_SETUP_HOOK();
            #endif
         
            // --- Конфигурирование порта B на выход
            DDRB    = _BV(PB0) | _BV(OC1);
            PORTB   = 0x00;
         
            // --- Конфигурирование порта D на вход
            DDRD    = ~_BV(PD0) | ~_BV(PD2) | ~_BV(PD3);    // - PD 0,2,3 на вход
            PORTD   = _BV(PD0) | _BV(PD2) | _BV(PD3);       // - Подтягивающие резисторы для PD 0,2,3
         
            // --- Настройка прерывания INT0 по изменению состояния
            MCUCR   |=  _BV(ISC00);
            MCUCR   &= ~_BV(ISC01);
            GIMSK   |=  _BV(INT0);
         
         
            // - Разрешение прерываний
            sei();
         
         
            static uint8_t flag = 0;
         
            while(1){
                
            
                if(bit_is_clear(PIND, PD0) && flag == 0){
                    flag = 1;
                    setPin(PB0, 1);
         
                }else if(bit_is_set(PIND, PD0) && flag == 1){
                    flag = 0;
                    setPin(PB0,0);
                
                }
         
                sleep_mode();
         
            }
            return (0);
        }
         
        //! Обработчик прерывания переполнения таймера
        ISR (TIMER1_OVF_vect) {
            OCR = PWMValue;
        }
         
         
        //! Обработчик прерыания INT0
        /* первоначальный вариант
        ISR (INT0_vect){
            
            static char A_State;    // - Предыдущее значение канала А
         
            GIMSK   &=  ~_BV(INT0);
         
            // - Получаем текущее состояние каналов энкодера
            char _A = bit_is_clear(PIND, PD2);
            char _B = bit_is_clear(PIND, PD3);
         
            // - Если предыдущее значение канала А сопадает то выходим
            if (A_State == _A ) return;
         
            A_State = _A;
         
            // - Обработка направления вращения
            if ((_B != _A)) PWMValue ++;
            if ((_B == _A)) PWMValue --;
         
            GIMSK   |=  _BV(INT0);
        }
        */
         
        ISR (INT0_vect){
            volatile SHORT Value = PWMValue;
         
            if((((PIND) & (1<<PD2)) == 0)   ^ (((PIND) & (1<<PD3)) == 0)){
                Value++;
                if(Value > TIMER1_TOP) PWMValue = TIMER1_TOP;
                else PWMValue = Value;
            }else{
                Value--;
                if(Value < 0) PWMValue = 0;
                else PWMValue = Value;
            }
        }


      Компилятор - WinAVR (avr-gcc)

      Параметры компиляции:

      ExpandedWrap disabled
        avr-gcc -g -Os -mmcu=attiny2313 -c main.c
        avr-gcc -g -mmcu=attiny2313 -o main.elf main.o
        avr-objcopy -j .text -j .data -O ihex main.elf main.hex


      Ещё заметил странность что если убрать sleep_mode() из главного цикла то вообще всё рандомно начинает работать :wacko:

      Если изменять значение PWMValue внутри прерывания таймера, например инкрементировать от нуля до TIMER1_TOP и декрементировать обратно, то всё работает стабильно. Чудеса начинаются при обработке INT0 прерываний.

      Какие есть идеи как это исправить?
      Сообщение отредактировано: KillerXX7 -
        SHORT - он точно со знаком?
          А может быть ширина импулься близка к периоду, а потом приосходит попытка увеличить её ещё больше? В результате старший разряд(ы) числа, которое хранит ширину импульса, игнорируются, и импульс получается опять коротким.
            Prince, да, это я задефайнил т.к. программлю под Windows в VisualStudio и привык к типам из windows.h :)


            ExpandedWrap disabled
              typedef uint8_t     BYTE;
              typedef uint16_t    WORD;
              typedef uint32_t    DWORD;
               
              typedef int8_t      CHAR;
              typedef int16_t     SHORT;
              typedef int32_t     LONG;
               
              typedef BYTE*   PBYTE;
              typedef WORD*   PWORD;
              typedef DWORD*  PDWORD;
               
              typedef CHAR*   PCHAR;
              typedef SHORT*  PSHORT;
              typedef LONG*   PLONG;


            Alexanbar, где в программе это может происходить?

            TIMER1_TOP = 1023

            Тоесть заполнение может изменяться от 0 до 1023 включительно, что соотвествует 10-ти битному таймеру. (2^10-1)
            Если устаноить его в 0, то на выходе PD3 (OC1) установится постоянное низкое напряжение и наоборот, если установить 1023 то всегда будет высокое.

            Новое значение устанавливается в прерывании переполнения таймера.
            Границы проверяются ещё раньше.

            Если только компилятор чтото черезчур оптимизирует... других мыслей пока нет.

            Добавлено
            Да, ещё такой момент. Когда крутишь ручку энкодера, то контроллер греется.

            Добавлено
            Есть подозрение что глюки возникают при изменениии параметра заполнения т.к. если его не трогать, то контроллер ведёт себя стабильно.
              Цитата KillerXX7 @
              RESET через 10к резистор подтянут на плюс.

              А емкостина на землю ?

              -Added
              Цитата KillerXX7 @
              Да, ещё такой момент. Когда крутишь ручку энкодера, то контроллер греется.

              Это что то аппаратное. :wacko:
              А блокировочные емкости имеются ?

              -Added
              Цитата KillerXX7 @
              Ещё заметил странность что если убрать sleep_mode() из главного цикла то вообще всё рандомно начинает работать

              я не совсем понял, как все работает.
              Но сам бы сделал так:
              - если произошло изменение кода, только тогда будем менять значение ШИМ.
              - значение ШИМ я бы попытался менять синхронно с работой самого ШИМ-а.
              Сообщение отредактировано: ЫукпШ -
                Цитата
                Есть подозрение что глюки возникают при изменениии параметра заполнения т.к. если его не трогать, то контроллер ведёт себя стабильно.

                Ачто, если изменять OCR в обработчике int0. Ведь OCR и так "защелкивается" только в момент, когда таймер досчитает до TIMER1_TOP.
                Так что обработчик таймера в таком варианте лишний как бы. ИМХО.

                Цитата
                Ещё заметил странность что если убрать sleep_mode() из главного цикла то вообще всё рандомно начинает работать

                А если всё убрать из главного цикла?


                Цитата
                Если только компилятор чтото черезчур оптимизирует... других мыслей пока нет.

                А как насчёт в эмуляторе погонять? Или этот код в AVRStudio никак не запихать?
                  Поставил на энкодер конденцаторы между выводами C-A и C-B на 0.1 мкФ каждый
                  плюс поменял код прерываний на
                  ExpandedWrap disabled
                    ISR (INT0_vect){
                        if((((PIND) & (1<<PD2)) == 0)   ^ (((PIND) & (1<<PD3)) == 0)){
                            PWMValue+=50;
                            setPin(PB0, 1); // - Отладка
                        }else{
                            PWMValue-=50;
                            setPin(PB0, 0); // - Отладка
                            
                        }
                        if(PWMValue < 0)PWMValue = 0;
                        if(PWMValue > TIMER1_TOP) PWMValue = TIMER1_TOP;    
                    }
                     
                    ISR (TIMER1_OVF_vect) {
                        static SHORT LastPWM;
                        if(LastPWM == PWMValue) return;
                     
                        LastPWM = PWMValue;
                        OCR = PWMValue;
                     
                    }

                  как посоветовал ЫукпШ

                  и... всё заработало правильно user posted image

                  Отладочное включение / выключение светодиода на PB0 при увеличении / уменьшении значения соотвественно, показывает небольшой дребезг только при вращении ручки против часовой стрелки (уменьшение значения) на большой скорости.
                  Обусловлено это недостаточной точностью фиксации ручки.

                  Похоже дело было всётаки в дребезге, только почему он приводил к зависанию контроллера - это непонятно.
                  Также странно что в обсуждениях в интернете, были мнения что конденцаторы не нужны.
                  Сам сначала хотел поставить, но почитав по теме, отказался :angry:


                  Цитата ЫукпШ @
                  значение ШИМ я бы попытался менять синхронно с работой самого ШИМ-а.

                  Это где/как и когда? Подробней плиз.

                  Что касается нагревания, то оно исчезает если подтянуть входы к плюсу через 10к резисторы на 0.25Вт. Похоже тепло излучают внутренние резисторы.

                  Добавлено
                  Цитата Prince @
                  Ачто, если изменять OCR в обработчике int0. Ведь OCR и так "защелкивается" только в момент, когда таймер досчитает до TIMER1_TOP.
                  Так что обработчик таймера в таком варианте лишний как бы. ИМХО.

                  Попробовал так, работает.

                  Кстати без sleep_mode тоже начал нормально работать.
                  Получается что проблема была в аппаратной части.
                    Цитата KillerXX7 @
                    Что касается нагревания, то оно исчезает если подтянуть входы к плюсу через 10к резисторы на 0.25Вт. Похоже тепло излучают внутренние резисторы.

                    Порт можно сконфигурировать как "вход с подтяжками"
                    или "вход без подтяжек".
                    (Внутренние подтяжки ~100K-130K, те тоже не очень хорошо)
                    Если подтягивающие резисторы внутри отключены, а внешних
                    нет то получим вход вентиля с высоким входным сопротивлением.
                    Такое включение будет чувствительно к помехам.
                    Теоретически возможна неустойчивая работа и даже возбуждение
                    вентиля.

                    -Added
                    Цитата KillerXX7 @
                    Похоже дело было всётаки в дребезге, только почему он приводил к зависанию контроллера - это непонятно.

                    Если проблему удалось победить блокировками (по питанию), значит
                    качество питания контроллера было не достаточным. ;)
                    Без этого работа любого процессора будет не устойчивой.
                    Что и приводило контроллер к зависанию.
                    Надо смотреть осциллографом. Тогда станет понятно, что происходит.

                    -Added
                    Цитата KillerXX7 @
                    Цитата ЫукпШ @
                    значение ШИМ я бы попытался менять синхронно с работой самого ШИМ-а.

                    Это где/как и когда? Подробней плиз.


                    Смысл предложения простой.
                    У ШИМ есть некий период.
                    А желание поменять яркость возникает
                    в любой момент, т.е. асинхронно по отношению
                    к генерации ШИМ.
                    Если поменять параметр ШИМ в любой момент
                    может получиться "рваный период".
                    Новый параметр нужно вводить в эксплуатацию только
                    в момент окончания периода и начало нового периода ШИМ.

                    (соблюдается это условие в данной программе или нет я
                    не разбирался)
                    Сообщение отредактировано: ЫукпШ -
                      Цитата ЫукпШ @
                      Новый параметр нужно вводить в эксплуатацию только
                      в момент окончания периода и начало нового периода ШИМ.


                      судя по всему так и есть, изменения вступают в силу по прерыванию таймера(надеюсь таймера самого шима, а не запущенного рядом TCCR1B ;) )
                      Цитата KillerXX7 @
                      ExpandedWrap disabled
                        ISR (TIMER1_OVF_vect) {
                            static SHORT LastPWM;
                            if(LastPWM == PWMValue) return;
                         
                            LastPWM = PWMValue;
                            OCR = PWMValue;
                         
                        }

                      только проверки ИМХО тут излишние, потомучто TCNT(счетчик таймера) и так должен сбрасываться по прерыванию, на крайний случай его cамому нулить...
                      да и не совсем поняткно к какому OCR ты присваиваешь новое значение....их там вроде 3 для каждого таймера, а ШИМ ты стартуешь на TCCR1A. еще бы увидеть чему равен TIMER1_PWM_INIT, ну то есть сам инициализатор шима...
                        Сейчас реализовано так:

                        Переписал работу с ШИМ TIMER1 на макросы и сделал изменение параметра заполнения канала в обработчике INT0, освободив тем самым ресурсы, потребляемые при обработке прерывания переполнения таймера (а оно очень часто происходит).
                        Думаю полная синхнронизация по периуду мне тут не очен нужна т.к. внешняя нагрузка имеет доольно большую инерцию и попросту не заметит "ломаного" периуда длиной несколько мс или нс.

                        Без sleep_mode() сейчас также работает.

                        Вывод - бороться с дребезгом нужно аппаратными методами, а конденсаторы цепи механического энкодера просто необходимы, какие бы доводы не приводились против этого.
                        При ёмкость 0.1 кмФ пропуски щелчков заметны только при очень быстром вращении ручки.
                        Кстати чисто "на глаз" пропуски на большинстве заводских девайсах значительно больше не той же скорости. Похоже там ещё большее подавление дребезга.

                        Собсвтенно код тестового проекта на 2 канала ШИМ таймера TIMER1

                        ExpandedWrap disabled
                          #include <inttypes.h>
                          #include <avr/io.h>
                          #include <avr/interrupt.h>
                          #include <avr/sleep.h>
                           
                          // ----------------------------------------------------------------------
                          // - Каналы PWM
                          #define PWM_CHANNEL_OC1A    COM1A1
                          #define PWM_CHANNEL_OC1B    COM1B1
                           
                          #define TIMER1_TOP 1023 // - 10 bit PWM
                          #define TIMER1_CLOCKSOURCE _BV(CS10)
                           
                          // --- Инициализация PWM
                          #define TIMER1_PWM_INIT     TCCR1A  = _BV(WGM10) | _BV(WGM11)
                           
                          // --- Включение / Выключение PWM
                          #define TIMER1_PWM_ENABLE   TCCR1B  |= TIMER1_CLOCKSOURCE
                          #define TIMER1_PWM_DISABLE  TCCR1B  &= ~TIMER1_CLOCKSOURCE
                           
                          // --- Подключение / Отключение каналов PWM для TIMER1
                          #define TIMER1_PWM_ENABLE_CHANNEL(Channel)      TCCR1A |= _BV(Channel)
                          #define TIMER1_PWM_DISABLE_CHANNEL(Channel)     TCCR1A &= ~_BV(Channel)
                           
                          // --- Установка значения
                          #define TIMER1_PWM_OC1A_SET_VALUE(Value)        OCR1A = Value
                          #define TIMER1_PWM_OC1B_SET_VALUE(Value)        OCR1B = Value
                           
                           
                           
                          // --- Функция установки состояния вывода для порта B
                          void setPin(uint8_t Pin, uint8_t Enable){
                              if(Enable) PORTB |= _BV(Pin);
                              else PORTB &= ~_BV(Pin);
                          }
                           
                          // -----------------------------------------------
                          // --- Главная функция
                          // -----------------------------------------------
                          int main (void){
                           
                              // --- Настройка ШИМ на TIMER1
                              TIMER1_PWM_INIT;    
                              TIMER1_PWM_ENABLE_CHANNEL( PWM_CHANNEL_OC1A );
                              TIMER1_PWM_ENABLE_CHANNEL( PWM_CHANNEL_OC1B );
                              TIMER1_PWM_ENABLE;
                           
                              // - Стартовое значение ШИМ для каналов
                              PWMValue    = 0;
                              OCR1A       = 0;        
                              OCR1B       = TIMER1_TOP;
                              
                           
                              // --- Обработка хуков настройки таймера
                              #if defined(TIMER1_SETUP_HOOK)
                                  TIMER1_SETUP_HOOK();
                              #endif
                           
                              // --- Конфигурирование порта B на выход
                              DDRB    = 0xFF;
                              PORTB   = 0x00;
                           
                              // --- Конфигурирование порта D на вход
                              DDRD    = ~_BV(PD0) | ~_BV(PD2) | ~_BV(PD4); // - PD 0,2,4 на вход
                              PORTD   = _BV(PD0) | _BV(PD2) | _BV(PD4);   // - Подтягивающие резисторы для PD 0,2,4
                           
                           
                              // --- Настройка прерывания INT0 по изменению состояния
                              MCUCR   |=  _BV(ISC00);
                              MCUCR   &= ~_BV(ISC01);
                              GIMSK   |=  _BV(INT0);
                           
                              // - Разрешение прерываний
                              sei();
                           
                           
                              while(1){
                                  // - Спим до следующего прерывания
                                  sleep_mode();
                              }
                              return (0);
                          }
                           
                          // ---------------------------------------------------------------
                          // --- Обработчик прерывания INT0
                          // ---------------------------------------------------------------
                          ISR (INT0_vect){
                              static SHORT LastPWM;   // - Предыдущее значение ШИМ
                              
                              
                              // --- Определяем направление вращения ручки
                              if((((PIND) & (1<<PD2)) == 0)   ^ (((PIND) & (1<<PD4)) == 0)){
                                  // - Вращение вправо, увеличиваем яркость
                                  PWMValue += 10;
                              }else{
                                  // - Вращение влево, уменьшаем яркость
                                  PWMValue -= 10;
                              }
                              
                              // - Проверка выхода за допустимые значения ШИМ
                              if(PWMValue < 0) PWMValue = 0;
                              if(PWMValue > TIMER1_TOP) PWMValue = TIMER1_TOP;    
                           
                              // - Если значение не изменилось то выходим
                              if(LastPWM == PWMValue) return;
                              LastPWM = PWMValue;
                           
                              // - Устанавливаем новое значение заполнения ШИМ
                              TIMER1_PWM_OC1A_SET_VALUE( PWMValue );
                              TIMER1_PWM_OC1B_SET_VALUE( TIMER1_TOP - PWMValue );
                           
                          }



                        И схемка:

                        user posted image

                        Работой энкодера доволен, вопрос можно считать решенным, всем спасибо!

                        Однако обсуждение и идеи по теме приветсвуются =)

                        Добавлено
                        На схеме не указано, но на кнопку также желательно вешать конденсатор.
                        Сообщение отредактировано: KillerXX7 -
                          про емкость на сбросе сказали, а вот RC фильтра(10-100 Ом+0.1мкФ) по питанию нет....я ставлю 0805 или 0603 10 Ом, работает как предохранитель ;).
                          какое напряжение питания контроллера? просто нет резисторов на светиках, да и сами светики лучше развернуть, чтоб зажигать нулём гасить единицей. это чтоб уменьшить суммарную нагрузку на порты ввода вывода контроллера.
                            Что бы я обязательно изменил в этой схеме:
                            1. Добавил емкость 0.1 - 1.0 с RESET на землю (вывод 1 процессора).
                            По-хорошему в такой схеме сброса надо еще зашунтировать резистор R2
                            диодом в обратной полярности, а между шинами питания запаять резистор.
                            По вкусу 1К0 - 10К0.
                            2. Два конденсатора питание-земля.
                            0.1 и 10.0x10V
                            3. Убрать конденсаторы с энкодера. Дребезг легко подавляется программно.
                            В такой схеме потенциально возможно обгорание контактов.
                            Ни к чему хорошему это не приведет.
                            4. 3 нагрузочных резистора 1К0 - 10К0
                            на выводы 2,6,8 процессора к питанию.
                            5. резисторы последовательно со светодиодами ! ~1К0
                            (Интересно,выгорели выводы 15,16 процессора или еще нет ? :wacko: )
                            Возможно, это и есть причина разогрева контроллера.
                            6. Это не обязательно, но светодиоды я предпочитаю включать логическим 0.
                            Традиционно драйверы включения на землю у аппаратуры посильнее будут.
                            7. Все свободные выводы пусть будут выходами.
                            Сообщение отредактировано: ЫукпШ -
                              Цитата ElcnU @
                              какое напряжение питания контроллера?

                              5 вольт, снятых с красного провода MOLEX коннектора компьютера =))))
                              земля взята тамже, естественно с черного провода.

                              Цитата ElcnU @
                              про емкость на сбросе сказали, а вот RC фильтра(10-100 Ом+0.1мкФ) по питанию нет....я ставлю 0805 или 0603 10 Ом, работает как предохранитель

                              Резистор в роле предохранителя? :huh:
                              В каких случаях он может помочь?

                              Цитата ЫукпШ @
                              3. Убрать конденсаторы с энкодера. Дребезг легко подавляется программно.
                              В такой схеме потенциально возможно обгорание контактов.
                              Ни к чему хорошему это не приведет.

                              Вот именно на это самое программное подавление я и потратил целый день, прочитав похоже доводы против.
                              Что только не пробовал, оно всёравно глючило. Поставил конденсаторы - глюки исчезли, а регулироание стало плавным.
                              Обгарание контактов врятли будет, всётаки напряжение и ток довольно низкие, да и дребезг не очень продолжительный.

                              Цитата ЫукпШ @
                              5. резисторы последовательно со светодиодами ! ~1К0
                              (Интересно,выгорели выводы 15,16 процессора или еще нет ? )
                              Возможно, это и есть причина разогрева контроллера.

                              Резисторы конечно нужная штука, но в тестовую схему не стал их ставить.
                              Нагревание явно не из-за "перегруза" светодиодами, а судя по всему греются внутренние подтягивающие резисторы.
                              Тепло выделяется в верхней части МК, примерно между 1/3, 20/18 выводами и только при вращении ручки энкодера.


                              Вот собсвтенно кусок схемы железки, которую собираю.
                              При помощи двух энкодеров нужно управлять двумя "высоковольными" мощьными нагрузками.
                              Одна нагрузка - электромотор, вторая - лампа (по факту скорее всего будет светодиодной)
                              Железка эта предназначена для авто, поэтому питание берётся с бортовой сети.
                              Для питания низковольной части схемы используется стабилизатор, поддерживающий на выходе от 4.8 до 5.2 вольт. Номинальное выходное напряжение 5.0 вольт. (данные из даташита)
                              Номиналы керамических кондесаторов возле стабилизатора взяты также из даташита из примера использования, плюс добавлен конденсатор на 470мкФ и диод на входе.

                              Учел пожелания с диодом и конденсатором на сбросе.



                              Цитата ЫукпШ @
                              а между шинами питания запаять резистор

                              Для чего он нужен?
                              Мне кажется он будет просто "греться", хотя могу ошибаться.

                              К тому же на "боевой" схеме на выходе в стабилизаторе стоит делитель напряжения на 2 резисторах, тоесть по сути уже есть поротивление между плюм и землёй.


                              Есть несколько вопросов по схеме:
                              1. Нагрузки я защитил предохранителями, однако они стоят после транзисторов. Это правильно?
                              2. Если использовать только внешние подтягивающие резисторы, то схема почемуто не работает, поэтому даже в тестовой схеме включал внутренние резисторы. В чем может быть проблема? Слишком большое сопротивление внешних?
                              3. Стоит ли на выходы энкодера поставить диоды для ограничения возможного обратного тока?
                              4. Стоит ли подтянуть Gate транзисторов к земле через резистор? (для исключения ситуации когда на нагрузко подано напряжение, а контроллер обесточен и Gate болтается в воздухе)
                              4. Что ещё можно добавить убрать в этой схеме Энкодер-Контроллер-Нагрузка
                              Сообщение отредактировано: KillerXX7 -

                              Прикреплённая картинка
                              Прикреплённая картинка
                                Цитата KillerXX7 @
                                Резистор в роле предохранителя?

                                Технологически внутри смонтирована плавкая вставка - типа этого
                                Цитата KillerXX7 @
                                В каких случаях он может помочь?
                                В тех же случаях, что и предохранитель - отключение вышедшего из строя оборудования от источника питания при превышении предельного тока. :D

                                Добавлено
                                Цитата KillerXX7 @
                                Железка эта предназначена для авто, поэтому питание берётся с бортовой сети.

                                Хм...смотря что за авто. Я бы еще пересмотрел (на всякий случай) алгоритм прошивки, с применением сторожевого таймера (были случаи с помехами от ВЧ части авто - ПИК 16F84A работал нестабильно - пришлось "перекраивать" алгоритм, предусмотрев сброс контроллера). :D
                                  Цитата KillerXX7 @
                                  а судя по всему греются внутренние подтягивающие резисторы.

                                  внутренние подтягивающие резисторы порядка 18кОм и только когда порт на вход включен, и нужно сильно постараться, чтоб их зажарить


                                  Цитата KillerXX7 @
                                  Резисторы конечно нужная штука, но в тестовую схему не стал их ставить.

                                  без них как равило вылетают светодиоды


                                  Цитата KillerXX7 @
                                  5 вольт, снятых с красного провода MOLEX коннектора компьютера =))))

                                  отсюда резисторы(если диоды типа ал307) порядка 300 Ом, потомучто оптимальный ток свечения 10мА.
                                  Цитата KillerXX7 @
                                  4. Стоит ли подтянуть Gate транзисторов к земле через резистор?

                                  обязательно, я так 3 DSPника по 40$ спалил :)
                                  0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                                  0 пользователей:
                                  Страницы: (3) [1] 2 3  все


                                  Рейтинг@Mail.ru
                                  [ Script execution time: 0,1240 ]   [ 15 queries used ]   [ Generated: 2.05.24, 02:44 GMT ]