Перейти к содержанию

Помощь с кодом. Управление 3-мя шаговыми двигателями


Alexander Weide

Рекомендуемые сообщения

Доброе время суток !!!

В программировании новичок по этому и спрашиваю ... 

Нужно осуществить управление 3-мя двигателями. По сути 5-я, но так как 3 работают синхронно то будем считать как за один.  Это будет специализированный станок.

Что нужно выполнить контроллеру:

Основная программа :

Задаются параметры для каждого двигателя персонально (скорость и направление вращения )

Двигатель №1  - Постоянно работает

Двигатель №2 - Изменяет направление движения при срабатывании концевиков  

Двигатель №3 - Изменяет направление движения при срабатывании концевиков 

Прерывания 

На каждый двигатель есть 4 кнопки ( вперед/назад/скорость+/скорость - )

Они нужны для подстройки скоростей двигателей и когда нужно в  ускорении работы или смены направления.

Было бы не плохо что бы после отключения питания все значения оставались в памяти.

Использовал процессор Atmega32. Код программы который я сделал на данный момент ниже. Также прикрепил електрическую схему, и печатную плату. Всем спасибо за помощь =)

 

#define F_CPU 8000000UL

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#define VD5 PORTA
#define VD4 PORTB

int S1=350;    
int S2=450;    
int S3=550;    


int main(void)

{
    PORTA = 0b00000000;
    DDRA =     0b11111111;
    
    PORTB = 0b11110000;
    DDRB =    0b00001111;
    
    PORTC = 0b11111111;
    DDRC =    0b00000000;
    
    PORTD = 0b11111111;
    DDRD =    0b00000000;
    

sei(); //разрешаем глобальные прерывания
            
    unsigned char butcount=0;
    

    
    void delay (int ms)
    {
        for (;ms;ms--)
        _delay_us(0.1);
    }
    void right_M1 (void) //Функция поворота ротора дигателя М1  вправо
    {
        VD4 = 0b00000011; // шаг 1
        delay(S1);
        VD4 = 0b00000110; // шаг 2
        delay(S1);
        VD4 = 0b00001100; // шаг 3
        delay(S1);
        VD4 = 0b00001001; // шаг 4
        delay(S1);
    }
    void left_M1 (void) //Функция поворота ротора дигателя М1  влево
    {
        VD4 = 0b00001001; // реверс шаг 1
        delay(S1);
        VD4 = 0b00001100; // реверс шаг 2
        delay(S1);
        VD4 = 0b00000110; // реверс шаг 3
        delay(S1);
        VD4 = 0b00000011; // реверс шаг 4
        delay(S1);
    }
    void right_M2 (void) //Функция поворота ротора дигателя М2  вправо
    {
        VD5 = 0b00000011; // шаг 1
        delay(S2);
        VD5 = 0b00000110; // шаг 2
        delay(S2);
        VD5 = 0b00001100; // шаг 3
        delay(S2);
        VD5 = 0b00001001; // шаг 4
        delay(S2);
    }
    void left_M2 (void) //Функция поворота ротора дигателя М2  влево
    {
        VD5 = 0b00001001; // реверс шаг 1
        delay(S2);
        VD5 = 0b00001100; // реверс шаг 2
        delay(S2);
        VD5 = 0b00000110; // реверс шаг 3
        delay(S2);
        VD5 = 0b00000011; // реверс шаг 4
        delay(S2);
    }
    void right_M3 (void) //Функция поворота ротора дигателя М3  вправо
    {
        VD5 = 0b00110000; // шаг 1
        delay(S3);
        VD5 = 0b01100000; // шаг 2
        delay(S3);
        VD5 = 0b11000000; // шаг 3
        delay(S3);
        VD5 = 0b10010000; // шаг 4
        delay(S3);
    }
    void left_M3 (void) //Функция поворота ротора дигателя М3  влево
    {
        VD5 = 0b10010000; // реверс шаг 1
        delay(S3);
        VD5 = 0b11000000; // реверс шаг 2
        delay(S3);
        VD5 = 0b01100000; // реверс шаг 3
        delay(S3);
        VD5 = 0b00110000; // реверс шаг 4
        delay(S3);
    }
    
    while (1)

{
    
    // -------------------------------------------------------------------------------------------------                
        if (!(PINC&0b01000000))
        {
            if(butcount < 5)
            {
                butcount++;
            }
            else
            {
                while (1)
                {
                    right_M1 ();
                                        
                    if (!(PINC&0b00100000))
                    {
                        if(butcount<5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S1=S1+1;
                        }
                    }
                                        
                    if (!(PINC&0b00010000))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S1=S1-1;
                        }
                    
                    }
                }
            }
        }
        
        
    if (!(PINC&0b10000000))
    {
        if(butcount < 5)
        {
            butcount++;
        }
        else
        {
            while (1)
            {
                
                left_M1 ();
                
                
                if (!(PINC&0b00100000))
                {
                    if(butcount < 5)
                    {
                        butcount++;
                    }
                    else
                    {
                        S1=S1+1;
                    }
                }
                
                
                if (!(PINC&0b00010000))
                {
                    if(butcount < 5)
                    {
                        butcount++;
                    }
                    else
                    {
                        
                        S1=S1-1;
                        
                    }
                }
            }
        }
    }
    
    
    
    // -------------------------------------------------------------------------------------------
        

    {
        if (!(PINC&0b00001000))
        {
            if(butcount < 5)
            {
                butcount++;
            }
            else
            {
                while (1)
                {
                    right_M2 ();
                    
                    if (!(PINC&0b00000010))
                    {
                        if(butcount<5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S2=S2+1;
                        }
                    }
                    
                    if (!(PINC&0b00000001))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S2=S2-1;
                        }
                        
                    }
                }
            }
        }
        
        
        if (!(PINC&0b00000100))
        {
            if(butcount < 5)
            {
                butcount++;
            }
            else
            {
                while (1)
                {
                    
                    left_M2 ();
                    
                    
                    if (!(PINC&0b00000010))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S2=S2+1;
                        }
                    }
                    
                    
                    if (!(PINC&0b00000001))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {    
                            S2=S2-1;    
                        }
                        }
                        }
                        }
                        }
        
    
    // ----------------------------------------------------------------------------------------
    {
        if (!(PIND&0b00010000))
        {
            if(butcount < 5)
            {
                butcount++;
            }
            else
            {
                while (1)
                {
                    right_M3 ();
                    
                    if (!(PIND&0b01000000))
                    {
                        if(butcount<5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S3=S3+1;
                        }
                    }
                    
                    if (!(PIND&0b10000000))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S3=S3-1;
                        }
                        }
                        }
                        }
                        }        
        
        if (!(PIND&0b00100000))
        {
            if(butcount < 5)
            {
                butcount++;
            }
            else
            {
                while (1)
                {
                    left_M3 ();
                            
                    if (!(PIND&0b01000000))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {
                            S3=S3+1;
                        }
                    }
                    
                    if (!(PIND&0b10000000))
                    {
                        if(butcount < 5)
                        {
                            butcount++;
                        }
                        else
                        {
                                S3=S3-1;
                        }
                    }
                }
            }
        }
        
// -------------------------------------------------------------------------------------------
        }
        }
        }
}

 

Безымянный.png

схема.pdf

Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Да работает. Только все двигатели по отдельности. 

Какую первую кнопку нажмешь тот двигатель и будет работать. 

По сути тела основной программы нет, так это в основном как мне кажется только управление кнопок. Да и то без прерываний они работают по принципу какая кнопка первая та и заняла весь мп. 

Ссылка на комментарий
Поделиться на другие сайты

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

18 часов назад, Alexander Weide сказал:

Только все двигатели по отдельности. 

Какую первую кнопку нажмешь тот двигатель и будет работать. 

а как должно быть?

и это, эта функция

#define F_CPU 8000000UL
#include <util/delay.h>

    void delay (int ms)
    {
        for (;ms;ms--)
        _delay_us(0.1);
    }

не работает, точнее выдает совсем не то, что от нее ожидалось...

Ссылка на комментарий
Поделиться на другие сайты

Это функция  которую я применяю для увеличения или уменьшения времени задержки. То есть управление скоростью двигателя Точно не знаю правильно ли но работает.

Если по пытаться  включить 3 двигателя одновременно то они как то странно одинаково крутятся ( не так как по отдельности ). Даже если заданные разные временные задержки   S1 S2 S3. Пока не понимаю почему.

Двигатели должны работать все одновременно с разными скоростями.

Изменено пользователем Falconist
Ссылка на комментарий
Поделиться на другие сайты

это и так понятно... у тубя частота МК стоит 8МГц , один машинный цикл выполняется за 0,125мкс

_delay_us(0.1) это макрос который частоту МК умножает на заданную задержку и получает количество маш.циклов

те этот макрос уже не может сформировать задержку в 0,1мкс, цикл for()  віполняется за 8-15маш.циклов , те длительность одного цикла состовляет 1,25..1,875мкс

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

у этого МК нет ресурсов и быстродействия, что бы нормально управлять тремя ШД паралельно без дополнительной обвязки , на вскидку  максимум что можно выжать это параллельную работу на скоростях до 30..40обр/мин

 

Ссылка на комментарий
Поделиться на другие сайты

А зачем, если и у AVR'ок хватит быстродействия?

Допустим, у ШД 200 шагов на оборот (вообще-то, это довольно много) и скорость 6000 об/мин (100 об/с). Получается 20`000 шагов в секунду. То есть 400 тактов на шаг при 8 МГц частоты.

Запас, конечно, небольшой, но на задачу ТСа быстродействия вполне хватит. Тем более если ставить более типичные шаговики, шагов на 20.

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

34 минуты назад, COKPOWEHEU сказал:

Допустим, у ШД 200 шагов на оборот (вообще-то, это довольно много) и скорость 6000 об/мин (100 об/с). Получается 20`000 шагов в секунду. То есть 400 тактов на шаг при 8 МГц частоты. 

о как...   только не 6000 вы до такой скорости  шаговик вряд ли не раскрутите, а вот до 1500 вполне реально. 

1500обр/мин = 25обр/сек = 5000имп/сек . длительность одного импульса 200мкс = 1600маш.цикл

считаем все тоже самое для 1499обр/мин = 24.98(3)обр/сек= 4996,(6)имп/сек длительность импульса 200.1334мкс = 1601маш.цикл

разница 0,1334мкс при тактовой 8МГц маш.цикл=0,125мкс , те крутить ШД точно с шагом 1обр/мин ужо не получицо  будет погрешность , сформировать такую длительность можно 16-ти битным таймером.  Для трех ШД таких нужно три , у 32й всего один.  чем будите формировать длительность импульсов? софтово? тогда шаг получицо уже не 0,125мкс, а в лучшем случае 50-100мкс и получите регулирование ШД как раз до 30-50обр/мин

 

 

Ссылка на комментарий
Поделиться на другие сайты

А точно ТСу нужна регулировка с точностью 0,07% ? Учитывая, что индикация не упомянута, точность установки вряд ли нужна выше 5%.

Даже для моего примера это 21 такт разницы (6000 против 5700 дают 20000 против 19000 шагов/сек, то есть 400 против 421 такта). Опять же запаса нет, но не безнадежно.

В более реалистичном варианте - 1500 об/мин (25 об/сек) и 24 шага -> 600 шагов/сек, точность 5%:

1500 об/мин -> 600 шагов/сек -> 13333 такта

1425 об/мин -> 570 шагов/сек -> 14035 тактов

разница аж 702 такта

Ругался на отсутствие форматирования исходного кода (включая отсутствие осмысленных комментариев и наличие неубранного после конфигуратора мусора) не менее 15 раз.

Часть моих наработок.

Ссылка на комментарий
Поделиться на другие сайты

29.07.2019 в 21:36, Alexander Weide сказал:

Двигатели должны работать все одновременно с разными скоростями.

для этого нужно функции поворота ШД вывернуть наизнанку и код поместить или в основной цикл или вызывать по таймеру

типа так:

const char step[]={
      0b00000011,
      0b00000110,
      0b00001100,
      0b00001001};
      

while(1)
{
if (count_motor1<speed_motor1)
   {
      count_motor1++;  
   }  
   else
     {
       count_motor1=0;
       if(flag_revers_M1)
          {step_motor1--;}
          else
          {step_motor1++;}
        step_motor1 &= 3;
     }

if (count_motor2<speed_motor2)
   {
      count_motor2++;  
   }  
   else
     {
       count_motor2=0;
       if(flag_revers_M2)
          {step_motor2--;}
          else
          {step_motor2++;}
        step_motor2 &= 3;
     }


PORTB = ((step[step_motor1])<<4)|(step[step_motor2]);


}

 

 

Ссылка на комментарий
Поделиться на другие сайты

Я дико извиняюсь, что лезу, куда не просят... Но мне кажется, что управлять полными шагами тремя движками по силам любому AVR c большим запасом! Во всяком случае, у меня дома валяются обломки настоящего плоттера Roland, в котором плата управления двумя ШД основана на классическом MCS51, который в самом идеальном случае способен за секунду на 2 миллиона однотактных команд (среднее количество тактов на команду у него больше 1,5). AVR в "базовом" варианте примерно в 12 раз производительнее - неужели этой разницы не хватит на третий движок?!

В трех массивах создается таблица состояний выходов на движки для каждого шага, в прерывании от таймера заводится три счетчика "фазы" (по принципу DDS) для выбора из этих массивов очередной комбинации, и вся проблема только в том, чтобы взять из массивов три байта и собрать из них несколько байт для вывода в порты. В главном цикле управление только "счетчиками фазы" для каждого канала.

По аналогичному принципу делаются музыкальные полифонические синтезаторы - сам делал 7-канальный. Думаю, для ШД тоже пойдет. Скажем, выдача новых комбинаций на ШД с частотой 8000 Гц - это сколько оборотов максимум? Для AVR это вообще не проблема, имхо. Да и 16000 представляется не сильно большой проблемой...

P.S. Даже на счет трех массивов я перегнул - и одного хватит.

Изменено пользователем ARV

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

не надо там мелкая дискретность задания скорости вообще.

ни какой ШД высокую скорость не развить не сможет.

у любого ШД есть параметр "частота приемистости". это такая скорость, которую он может развить, если подавать импульсы шагов сразу на полную скорость.

и частота приемистости зависит от нагрузки. чем больше момент нагрузки, тем меньше будет частота приемистости, так как разгоняться будет труднее.

а чтобы разогнать выше частоты приемистости, то для разгона сначала импульсы подают редко, и потом постепенно повышают частоту.

но все равно разогнать можно не до любой высокой скорости, у конструкции всегда есть предел, выше которого ШД выйдет из синхронизма, если подавать частоту выше этого предела.

занимался я для собственного удовольствия управлением ШД. и делал я это на ATMega8, и даже на внутреннем RC генераторе 1 МГц - вполне хватило производительности. и нет никакой необходимости лезть на 8 МГц или выше.

два двигателя у меня шли одновременно от двух таймеров - таймера1 и таймера2 в режиме СТС. время каждого таймера соответствовало 1 шагу.

и даже таймерам включал предделители, чтобы можно было на старте получить большое время первого шага.

а вы тут взялись частоту высокую брать, такты считать - глупости это...

при разгоне и торможении в прерывании таймера вычислялось новое время шага и записывалось в регистр TCCR таймера.

после достижения заданной скорости просто перезаписывалось то же самое время шага.

можно для третьего двигателя задействовать таймер0, но хлопот чуть больше из-за вычисления дополнительного числа до переполнения таймера.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

еще добавлю к сказанному.

у меня на частоте 1 МГц не только таймеры успевают делать расчет времени шага, но еще в главном цикле и экран 1602 работает, кнопки работают и интерфейс с компом работает. на всё хватает времени, и еще остается время до начала следующего главного цикла.

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

а ты разве ничего не понял из прочтения темы?

люди предлагали повышать частоту, чтобы успевать обрабатывать шаги. а я сказал, что повышать частоту не надо, всё прекрасно может работать на тактовой 1 МГц.

я разве непонятно выражаюсь?

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

Вполне понятно. Хотя я вообще не понимаю, зачем до сих пор используются AVR МК. По стоимости они давно не в выигрыше. За те же деньги продаются ARM МК, где есть куча аппаратных фишек и не надо морочить голову с программными извращениями.

Ссылка на комментарий
Поделиться на другие сайты

Только что, BARS_ сказал:

За те же деньги продаются ARM МК

А накопленные запасы предлагаете выбросить?

Если забанить всех, кто набрался смелости думать независимо, здорово будет на форуме - как на кладбище: тишина, птички поют...

Ссылка на комментарий
Поделиться на другие сайты

ну да.

купленное - выбросить, и за такие же деньги купить новое...

Мудрость приходит вместе с импотенцией...

Когда на русском форуме переходят на Вы, в реальной жизни начинают бить морду.

Ссылка на комментарий
Поделиться на другие сайты

... новое, огромное, мощное... И сделать на нём какую-нибудь мигалку, для которой хватило бы выброшенного 8-ми лапого МК.

@BARS_ , каждому своё. И каждой задаче соответственно своя реализация.

PS: Не начинайте очередной холивар, на тему "Что лучше .... ?".

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
  • Сообщения

    • Все предложенные к рассмотрению источники питания работают примерно по одному принципу: сетевое напряжение выпрямляется, фильтруется (получаем чуть больше 300 вольт постоянного), затем преобразуется снова в переменное, но уже на частотах в несколько десятков килогерц, понижается на трансформаторе и снова выпрямляется. За счёт высокой частоты преобразования используется трансформатор на ферритовом, а не на стальном, сердечнике, гораздо меньших габаритов и стоимости. Минусы: значительное усложнение схемы блока и вероятность возникновения различных помех от него. Модули управления (кроме первого) также являются импульными преобразователями, с теми же достоинствами и недостатками. Если нужно по быстрому собрать некое подобие ЛБП, то уж лучше брать модуль вроде этого. Ну и блок питания к нему соответствующий. Но не очень понятно, какой практический опыт можно получить от соединения готовых модулей парой проводов.  
    • У меня больше всего вопросов вызвала необычная схема обеспечения отрицательного питания. Автор этой обстоятельной заметки пишет: For this supply to work correctly, the transformer must have a secondary voltage of at least 18V RMS.  Почему? Что будет не так с отрицательным питанием, если напряжение на трансформаторе будет меньше 18В?   https://tinyurl.com/23mlwxtt - я в простейшей эмуляции ставлю 12В пикового напряжения для трансформатора и на стабилитроне все как положено: -5.6В.
    • Согласен, очень криво объяснил. Это работа трёх вольтовой линии, просто на диод шотки сдвоенный, на один анод приходит сигнал напрямую с трансформатора, а на второй через дроссель. Вольт/деление 5 вольт в клетке, тайминг по моему 10 МС. Третья фотография это сигнал на катодах уровень земли ровно по центру экрана. Но все линии по итогу в порядке 3.3 в, 5, в, 12 в и -12 в. Нагрузить все линии не могу сразу ,так как тут же выгорают транзисторы (имеется нагрузка 250 ватт по 10 ампер на каждую линию за исключением-12в), поэтому нагружаю 3.3 вольтовую линию на 10 ампер,  подключаю переменный резистор 50 ватт на 15 ом на 5 вольтовую линию и постепенно довожу до той той картины с перекосом (это гдето  50 ватт общее). По поводу микросхемы, вверху имеется скрин где между импульсами проскакивает мини импульс, если так можно сказать, он проскакивает и на одной  и на второй ноге (7,8). Микросхема не tl 494, а lw4933/abx942.1/c9421646. Далее они приходят на базы транзисторов 945g  коллекторы этих транзисторов соединены с  выводами трансформатора. Просто схема типовая, легче мне кажется просто привести фото самого блока, для тех кто разбирается будет гораздо информативне.  Диод шотки по 12 вольтовой линии был подгоревший, заменил на донора. Приводить скрины не буду что бы не захламлять тему. В итоге, пока все так же, при достижении определенной нагрузки суммарно где-то 50 ватт, появляется этот "выброс и перекос". По этому имеются мысли на два варианта, это микросхема , этот мини импульс между периодами, на низкой нагрузке особо не влияет, но при достижении определенной приводит с самовозбуждению входной цепи и непроизвольному открытию транзистора нижнего плеча. Либо дело в "горячей части", плавающий дефект в обвязке силовых ключей.  Спасибо за ответ.
    • @Gomerchik а вы контролировали как меняется уровень сигнала на А1 ардуины?
    • Спасибо за совет. Автором данного проекта я не являюсь, мне нужно было воссоздать уличный датчик для метеостанции взамен пропавшего(( Из разного найденного в интернете этот проект работает с моей станцией Орегон (спасибо автору). В понедельник попробую последовать Вашему совету. Но все равно куча непоняток  как блин это работает)) Если дело в неправильной отправки команды, то как на это влияет подключение датчика температуры? Если совсем не подключать таймер, то передача идет один раз (как и прописано в программе), станция принимает и отображает, но минут через сколько-то естественно станция уже ни чего не показывает, но с таймером питание полностью не пропадает с ардуинки, но передача сигнала каким-то образом работает по таймеру.  В моем понимании данная команда подается один раз потому, что таймер должен отключать питание МК после передачи сигнала и каждые 43 сек снова подавать питание (так того требует станция).  Ардуино передает показания температуры отключается полностью и 43 секунды мк не работает.  Сейчас у меня питание пока сделано на подпитке от солнечной батареи, но пару пасмурных дней и аккумулятор съедается до отключения(
    • thickman Так и сделаю. Вытащу из бу БП.  Буду знать, как отличить. Благодарю. Заменил транзисторы на IRFB20N50K. Картина стала, совсем другой.  Похоже трудность не в драйвере, на момент подвозбуда, переходные процессы, в нем, завершены. Увеличил затворные резисторы до 50ом, стало немного лучше.  Не понятно, почему верхний ключ греется несколько сильнее. Возможно, стоит посмотреть ток в коллекторе.  Снабберные емкости временно удалил, изменений не произошло.  Замена ТГР на другой, на кольце MSTN-16A-TH, так же, результата не принесла.   irfb20n50k.pdf
×
×
  • Создать...