Скетч для управления bldc

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Всем привет!

Мучаюсь уже месяц :) , спалил три ардуинки :( .

Имеется китайская Arduino ProMicro, 6 транзисторов IRLB3034, потенциометр, батарейка 12В. В даташите пишут, что эти транзисторы при напруге на ключе в 5В могут пропускать через себя до 100А. Значит должно заработать.

Из говна и палок сделал настольный bldc, который хочу запустить для некоторых экспериментов. Если подавать сигналы напрямую с батарейки на выводы моста, ротор-маховик раскручивается, но очень быстро менять местами провода я не смогу :)

Собрал Н-мосты, подключил к ардуине и батарейке. Пишу скетч, но сомневаюсь в его работе потому, что нет определения положения ротора-маховика. Хаотичная подача импульсов не раскрутит привод, пробовал. Ну или мой скетч не работает. А синхронизировать что-то не знаю как. 

Помогите пожалуйста...

Moderator : пожалуйста, вставьте код правильно (возможно, новым сообщением в тему), 
 

 

rkit
Онлайн
Зарегистрирован: 23.11.2016

MotorArdent пишет:

Собрал Н-мосты,

Еще один фантаст. H-мостом bldc не управляют. Рисуй схему чего ты там собрал. И расчеты.

MotorArdent
Offline
Зарегистрирован: 25.02.2020

:)

верхние выводы на плюс батарейки, нижние выводы на минус батарейки. Питается ардуинка от USB. Общий минус с ардуинкой и батарейкой. Выводы с затворов (Q 1-6) на ардуинку напрямую, без резисторов. Надо будет с резисторами попробовать. Расчетов никаких нет.

Если верить даташиту, то 5В достаточно для открытия IRLB3034. Другой вопрос в том, что является ли сигнал HIGH на пине ардуино эквивалентом 5В? Что-то я мультиметром не обнаружил этого. Хотя может криво проверял...

 

rkit
Онлайн
Зарегистрирован: 23.11.2016

5В является эквивалентом 5В, в этом можно не сомневаться. Только вот напряжение на схеме измеряется между двумя точками, и мне кажется сомнительным, чтобы в даташите на транзистор эти цифры указывались относительно земли ардуино. 

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

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

MotorArdent пишет:

Другой вопрос в том, что является ли сигнал HIGH на пине ардуино эквивалентом 5В? 

Напряжение логической единицы на пине (HIGH) равно напряжению питания микроконтроллера (ножка VCC микроконтроллера).

MotorArdent
Offline
Зарегистрирован: 25.02.2020

А какой мне смысл врать про цифры в даташитах? Получается, что я сам себе тогда вру.

Если питание ардуины подается на пин при параметре HIGH, это хорошо, буду думать дальше, что у меня не так.

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

 

SLKH
Offline
Зарегистрирован: 17.08.2015

MotorArdent пишет:

:)

верхние выводы на плюс батарейки, нижние выводы на минус батарейки. Питается ардуинка от USB. Общий минус с ардуинкой и батарейкой. Выводы с затворов (Q 1-6) на ардуинку напрямую, без резисторов. Надо будет с резисторами попробовать. Расчетов никаких нет.

Если верить даташиту, то 5В достаточно для открытия IRLB3034. Другой вопрос в том, что является ли сигнал HIGH на пине ардуино эквивалентом 5В?

в твоем случае сигнал на затворах верхних транзисторов не является эквивалентом 5В.

схема нерабочая. совсем.

схема опасна для выводов ардуины. "спалил три ардуинки" - не удивительно.

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Горели не выводы. Горели элементы отвечающие за внешние питание. Сжог именно тогда, когда питал еще и ардуину от батарейки. Скорее всего в таком режиме и ошибках в коде банально происходило замыкание ардуины. Один раз сжог именно так, что плата осталась рабочей, успел отрубить батарейку. Вот только потом ардуинка на подключение внешнего питания не реагировала, соглашалась питаться исключительно от USB.

 

SLKH пишет:
в твоем случае сигнал на затворах верхних транзисторов не является эквивалентом 5В.

Вот здесь не совсем понятно почему выделены только верхние транзисторы. Затворы всех транзисторов подключены к пинам ардуины. Тогда уж ситуация одинакова со всеми транзисторами.

Вот здесь эта схема работает. Но у него скетч сложный для меня. Я только учусь.

https://youtu.be/QE33HCjZ5pk

rkit
Онлайн
Зарегистрирован: 23.11.2016

MotorArdent пишет:

А какой мне смысл врать про цифры в даташитах? Получается, что я сам себе тогда вру.

Получается, что ты смотришь в книгу и видишь фигу. Уверен, что в твоей схеме Vds=25V ?

Не получится разобраться в этих вещах просто в лоб. Транзистор это слишком сложное устройство и в даташите его принцип действия не описан. Не понимая принципа ты не сможешь использовать цифры из даташита.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

MotorArdent пишет:

SLKH пишет:
в твоем случае сигнал на затворах верхних транзисторов не является эквивалентом 5В.

Вот здесь не совсем понятно почему выделены только верхние транзисторы. Затворы всех транзисторов подключены к пинам ардуины. Тогда уж ситуация одинакова со всеми транзисторами.

MotorArdent, обратите внимание, что управляющее напряжение для транзисторов - это напряжение, приложенное между истоком и затвором (на приведенном Вами графике это указано под горизонтальной осью). Для нижних транзисторов это выполняется всегда, поскольку их истоки соединены с общим проводом Ардуино, а затворы - с выходами МК.

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

Как только один из нижних транзисторов открывается, он "притягивает" потенциалы истоков верхних транзисторов к "0" (=общему проводу) и тогда верхние транзисторы могут открыться по сигналам с выходов МК. Если при этом включиться верхний для уже открытого нижнего транзистора, то через них, минуя нагрузку, пойдет так называемый "сквозной ток" и будет КЗ источника питания. Если откроется верхний транзистор "рядом" с уже открытым нижним, то он останется открытым в том случае, если суммарное падение напряжение на нижнем транзисторе и нагрузке не превысит 2 В ... 2,5 В, которые будут вычитаться из управляющего напряжения 5 В, поступающего с выхода МК на затвор верхнего транзистора. Но это будет выполняться только в том случае, если верхний транзистор приоткрылся "чуть-чуть" и через нагрузку течет "совсем небольшой" ток. Т.е. верхние транзисторы даже при правильной коммутации будут работать не в ключевом режиме и запросто могут сами перегреться. (О частоте переключения и переходных процессах на индуктивной нагрузке я пока сознательно умалчиваю.)

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

MotorArdent
Offline
Зарегистрирован: 25.02.2020

rkit пишет:

Получается, что ты смотришь в книгу и видишь фигу. Уверен, что в твоей схеме Vds=25V ?

Не получится разобраться в этих вещах просто в лоб. Транзистор это слишком сложное устройство и в даташите его принцип действия не описан. Не понимая принципа ты не сможешь использовать цифры из даташита.

Конечно в лоб просто не разберешься. Но постепенно можно. Никто не родился со знаниями. Я просто прошу помочь. Идея не в покупке драйвера, а в том, чтобы сделать самому, хоть самый примитивный.

Vds это пока еще безопасная напруга сток-исток в закрытом состоянии. Я уверен, что такой напруги в моей схеме нет вообще, минимум в два раза меньше. Это плохо?

Для затвора надо Vgs. Оно вот нам на графике от 1В до 5В. Питание ардуинки с USB с потерями ну примерно 4,5В. Этого должно хватить для открытия. Ну пусть на транзистор попадает еще меньше. Но он откроется и хоть что-то уже пропустит.

Беда в коде. Либо надо датчики холла, для позиционирования ротора-маховика, либо думать с задержками. Из-за моих некорректных задержек, которые наверное слишком малы, скорее всего происходит замыкание. Пока не придумал как выйти из положения, но датчиками холла усложнять конструкцию не хочется.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

MotorArdent пишет:
Беда в коде. ...

Может, и в коде тоже. :)) А что происходит со схемой, я выше описал.

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Duino A.R. пишет:

Может, и в коде тоже. :)) А что происходит со схемой, я выше описал.

Да это понятно. Идеальных условий не будет. Мне стронуть с места нужно. Этого пока хватило бы :)

//Пины ключей Н-мостов 
boolean TAH = 20;                             //T - IRLB3034, A - фаза, Н - верхний ключ полумоста
boolean TAL = 15;                             //T - IRLB3034, A - фаза, L - нижний ключ полумоста
boolean TBH = 19;                             //T - IRLB3034, B - фаза, H - верхний ключ полумоста
boolean TBL = 14;                             //T - IRLB3034, B - фаза, L - нижний ключ полумоста
boolean TCH = 18;                             //T - IRLB3034, C - фаза, H - верхний ключ полумоста
boolean TCL = 16;                             //T - IRLB3034, C - фаза, L - нижний ключ полумоста
int Mass[] = {TAH, TAL, TBH, TBL, TCH, TCL};  //записываем ключи в массив
int countMass = sizeof(Mass) / sizeof(int *); //вычисление количества индексов массива Mass
int i;                                        //переменная индексов массива Mass
#define val 10                                //для управление скважностью на ШИМ
int pwm;                                      //переменная для хранения значений val

void setup() 
{                                             //Установка пинов ключей на выход через массив и на вход для потенциометра
    for(i = 0; i < countMass; i++)
{
    pinMode(Mass[i], OUTPUT);  
}
    pinMode(val, INPUT);
    
    Serial.begin(9600);
} 

void loop() 
{
    pwm = analogRead(val);
    pwm = map(pwm, 0, 1023, 0, 255);          //перевод в диапазон 0-255
    pwm = constrain(pwm, 0, 255);             //страхуемся обрезкой диапазона

    Serial.println(pwm);
    
if (pwm = 0)
{   Mass[0] = 0;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 0;
}
else 
{   Mass[0] = 1;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 1;
    Mass[4] = 0;
    Mass[5] = 0;
    delay(pwm);
    Mass[0] = 1;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 1;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 0;
    Mass[2] = 1;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 1;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 1;
    Mass[2] = 1;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 0;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 1;
    Mass[2] = 0;
    Mass[3] = 0;
    Mass[4] = 1;
    Mass[5] = 0;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 1;
    Mass[4] = 1;
    Mass[5] = 0;
    delay(pwm); 
}
}
    

 

mykaida
mykaida аватар
Offline
Зарегистрирован: 12.07.2018

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

wdrakula
wdrakula аватар
Offline
Зарегистрирован: 15.03.2016

ТС либо ты ставишь в верхнее плечо p mosfet logic level, либо начинаешь изучить инет на тему бутстрапной схемы. Или (по русски) схемы с предзарядом емкости.

У бутстрапной схемы есть недостаток. Управление всегда ложно быть импульсным. Бутстрапный конденсатор заряжается пока транзистор закрыт. Но для BLDC моторчика это  должно быть нормально.

p mosfet - может быть проблемма найти подходящий, бутстрап сложнее делать. Выбирай. Хотя если ты чисто для левел апа... полчаса паяльником - почему нет?

b707
Онлайн
Зарегистрирован: 26.05.2017

MotorArdent пишет:

Да это понятно. Идеальных условий не будет. Мне стронуть с места нужно. Этого пока хватило бы :)

//Пины ключей Н-мостов 
boolean TAH = 20;                             //T - IRLB3034, A - фаза, Н - верхний ключ полумоста
boolean TAL = 15;                             //T - IRLB3034, A - фаза, L - нижний ключ полумоста
boolean TBH = 19;                             //T - IRLB3034, B - фаза, H - верхний ключ полумоста
boolean TBL = 14;                             //T - IRLB3034, B - фаза, L - нижний ключ полумоста
boolean TCH = 18;                             //T - IRLB3034, C - фаза, H - верхний ключ полумоста
boolean TCL = 16;                             //T - IRLB3034, C - фаза, L - нижний ключ полумоста
int Mass[] = {TAH, TAL, TBH, TBL, TCH, TCL};  //записываем ключи в массив
int countMass = sizeof(Mass) / sizeof(int *); //вычисление количества индексов массива Mass
int i;                                        //переменная индексов массива Mass
#define val 10                                //для управление скважностью на ШИМ
int pwm;                                      //переменная для хранения значений val

void setup() 
{                                             //Установка пинов ключей на выход через массив и на вход для потенциометра
    for(i = 0; i < countMass; i++)
{
    pinMode(Mass[i], OUTPUT);  
}
    pinMode(val, INPUT);
    
    Serial.begin(9600);
} 

void loop() 
{
    pwm = analogRead(val);
    pwm = map(pwm, 0, 1023, 0, 255);          //перевод в диапазон 0-255
    pwm = constrain(pwm, 0, 255);             //страхуемся обрезкой диапазона

    Serial.println(pwm);
    
if (pwm = 0)
{   Mass[0] = 0;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 0;
}
else 
{   Mass[0] = 1;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 1;
    Mass[4] = 0;
    Mass[5] = 0;
    delay(pwm);
    Mass[0] = 1;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 1;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 0;
    Mass[2] = 1;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 1;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 1;
    Mass[2] = 1;
    Mass[3] = 0;
    Mass[4] = 0;
    Mass[5] = 0;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 1;
    Mass[2] = 0;
    Mass[3] = 0;
    Mass[4] = 1;
    Mass[5] = 0;
    delay(pwm);
    Mass[0] = 0;
    Mass[1] = 0;
    Mass[2] = 0;
    Mass[3] = 1;
    Mass[4] = 1;
    Mass[5] = 0;
    delay(pwm); 
}
}
    

 

ой жуть какая....

Значит вы сначала вписываете в массив Mass[] номера пинов, а потом туда же пихаете нули и единички? И далее еще круче - пихаете нули и единички, просто ждете delay(pwm), а потом пихаете следующие нули и единички??? И кто же, по вашему, обновляет эти единички на выходах? 

Какая тут схема, хоспади...

MotorArdent
Offline
Зарегистрирован: 25.02.2020

wdrakula пишет:

...бутстрапная схема...

мне нравится идея, почитаю обязательно

b707 пишет:

ой жуть какая....

Конечно жуть. Ужас просто. Вывожу в монитор порта, там одни единички, вот и замыкание.

 

Если бы мог справиться сам, меня бы здесь не было. Критика это хорошо, но была надежда на получение помощи с кодом.

sadman41
Offline
Зарегистрирован: 19.10.2016

Почитайте про digitalWrite()

MotorArdent
Offline
Зарегистрирован: 25.02.2020

sadman41 пишет:
Почитайте про digitalWrite()

Я понял, что надо записывать, но пока не понял как записывать в массив. Хотя можно и без массива обойтись.

А как выставить адекватную задержку? Что-то мне подсказывает, что моя маловата по времени.

sadman41
Offline
Зарегистрирован: 19.10.2016

Что записывать в массив? Вы что вообще от микроконтроллера хотите?

b707
Онлайн
Зарегистрирован: 26.05.2017

MotorArdent пишет:

sadman41 пишет:
Почитайте про digitalWrite()

Я понял, что надо записывать, но пока не понял как записывать в массив.

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

Цитата:
А как выставить адекватную задержку? Что-то мне подсказывает, что моя маловата по времени.

да подождите вы с задержками. Вам до них пока как неграмотному до "Войны и мира"

MotorArdent
Offline
Зарегистрирован: 25.02.2020

b707 пишет:

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

:))))) светодиодом мигать умею

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

новерное попробовать switch case и выходить из каждого шага break

 

void loop() 
{
    pwm = analogRead(val);
    pwm = map(pwm, 0, 1023, 0, 255);          //перевод в диапазон 0-255
    pwm = constrain(pwm, 0, 255);             //страхуемся обрезкой диапазона

    Serial.println(pwm);
    
while (pwm = 0)
{   digitalWrite (TAH, 0);                     //питание не подается
    digitalWrite (TAL, 0);
    digitalWrite (TBH, 0);
    digitalWrite (TBL, 0);
    digitalWrite (TCH, 0);
    digitalWrite (TCL, 0);
}
while (pwm > 0) 
{   digitalWrite (TAH, 1);                     //A+ B-
    digitalWrite (TAL, 0);
    digitalWrite (TBH, 0);
    digitalWrite (TBL, 1);
    digitalWrite (TCH, 0);
    digitalWrite (TCL, 0);
    delay(pwm);
    digitalWrite (TAH, 1);                     //A+ C-
    digitalWrite (TAL, 0);
    digitalWrite (TBH, 0);
    digitalWrite (TBL, 0);
    digitalWrite (TCH, 0);
    digitalWrite (TCL, 1);
    delay(pwm);
    digitalWrite (TAH, 0);                     //B+ C-
    digitalWrite (TAL, 0);
    digitalWrite (TBH, 1);
    digitalWrite (TBL, 0);
    digitalWrite (TCH, 0);
    digitalWrite (TCL, 1);
    delay(pwm);
    digitalWrite (TAH, 0);                     //B+ A-
    digitalWrite (TAL, 1);
    digitalWrite (TBH, 1);
    digitalWrite (TBL, 0);
    digitalWrite (TCH, 0);
    digitalWrite (TCL, 0);
    delay(pwm);
    digitalWrite (TAH, 0);                     //C+ A-
    digitalWrite (TAL, 1);
    digitalWrite (TBH, 0);
    digitalWrite (TBL, 0);
    digitalWrite (TCH, 1);
    digitalWrite (TCL, 0);
    delay(pwm);
    digitalWrite (TAH, 0);                     //C+ B-
    digitalWrite (TAL, 0);
    digitalWrite (TBH, 0);
    digitalWrite (TBL, 1);
    digitalWrite (TCH, 1);
    digitalWrite (TCL, 0);
    delay(pwm); 
}
}
    

 

 

 

sadman41
Offline
Зарегистрирован: 19.10.2016

Будет, но не так, как себе это представляете.

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

MotorArdent пишет:
Да это понятно. Идеальных условий не будет. Мне стронуть с места нужно. Этого пока хватило бы :)

MotorArdent, если под страгиваением с места Вы имеете ввиду психологический процесс, то, возможно. :)) Если речь идет о электромеханике, то маловероятно. :(( В Вашей схеме верхние транзисторы работают в режиме "ненасыщенного истокового повторителя", т.е. на нагрузке при любом напряжении питания моста не будет больше 3 В ... 3,5 В. Причем напряжение это будет поделено пополам между включенными последовательно катушками двигателя. И сколько ни увеличивай напряжение питания моста, прирост питания будет "оседать" на верхних транзисторах, не доставаясь нагрузке.

Вы писали, что заставляли двигатель крутиться, коммутируя его обмотки вручную проволочкой. Попробуйте сделать то же самое, используя Вашу схему. Чтобы не пробить статикой затворы, соедините каждый с общим проводом резистором 100 кОм ... 1 МОм. Отсоедините мост от МК. Подсоедините проволочку к шине питания +5 В и вручную коммутируйте затворы полевиков, помня о возможном сквозном токе. Так Вы сможете оценить, хоть как то Вас результат устроит, или, всё-таки, схему надо сильно переделывать.

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Точно. Надо попробовать.

P.S.:Но скетч все равно надо исправить до работоспособности. Даже после изменения схемы он все равно нужен будет.

rkit
Онлайн
Зарегистрирован: 23.11.2016

MotorArdent пишет:

Конечно в лоб просто не разберешься. Но постепенно можно. Никто не родился со знаниями.

Так ПОЧЕМУ ТЫ ЭТОГО НЕ ДЕЛАЕШЬ? ПОЧЕМУ ТЫ ЛЕЗЕШЬ В ЛОБ? Почему ты пытаешься собрать схему в которой требуется минимум 24 транзистора, когда ты не освоил даже ОДИН.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

как-то смущает это:
 

boolean TAH = 20;                             //T - IRLB3034, A - фаза, Н - верхний ключ полумоста
boolean TAL = 15;                             //T - IRLB3034, A - фаза, L - нижний ключ полумоста
boolean TBH = 19;                             //T - IRLB3034, B - фаза, H - верхний ключ полумоста
boolean TBL = 14;                             //T - IRLB3034, B - фаза, L - нижний ключ полумоста
boolean TCH = 18;                             //T - IRLB3034, C - фаза, H - верхний ключ полумоста
boolean TCL = 16;                             //T - IRLB3034, C - фаза, L - нижний ключ полумоста

 

-NMi-
Offline
Зарегистрирован: 20.08.2018

MotorArdent пишет:

Мучаюсь уже месяц :) , спалил три ардуинки :( .

Помогите пожалуйста...

ТС! Не мучай ардуинки, ато я Гретте пожалуюсь!

ТС!  --- Купи ГОТОВЫЙ драйвер для BLDC и не загрязняй природу!!!

b707
Онлайн
Зарегистрирован: 26.05.2017

ua6em пишет:

как-то смущает это:
 

boolean TAH = 20;

прелестно :) я даже не заметил ...

MotorArdent, если вы спустя месяц делаете подобные ошибки - приготовтесь делать этот драйвер года три... И начните с чтения учебника по Си - времени у вас навалом, спешить некуда :)

nik182
Offline
Зарегистрирован: 04.05.2015

Люди целые микросхемы сторят .http://www.datasheetdir.com/SI9979+Brushless-DC-Motor-Drivers

Схем с контроллерами на рассыпухе полно. Неужто гуглем пользоваться не умеешь? 

b707
Онлайн
Зарегистрирован: 26.05.2017

nik182 пишет:

Неужто гуглем пользоваться не умеешь? 

о чем вы... если человек о digitalWrite() прочитал только после пинка...

nik182
Offline
Зарегистрирован: 04.05.2015

https://www.chipdip.ru/product/fan73832mx

3 штуки, 210 руб, и никаких сгоревших ардуин. Входной уровень тлько согласовать.

rkit
Онлайн
Зарегистрирован: 23.11.2016

nik182 пишет:

https://www.chipdip.ru/product/fan73832mx

3 штуки, 210 руб, и никаких сгоревших ардуин.

Эта МС для очень мощных вещей, питающихся от выпрямленного сетевого напряжения. На 12В стабильно работать не будет. Не надо кидаться первой найденной ссылкой, не понимая, что это такое.

nik182
Offline
Зарегистрирован: 04.05.2015

rkit пишет:

... Не надо кидаться первой найденной ссылкой, не понимая, что это такое.

Ты опять на личности переходишь? С чего ты взял что я не понимаю, что это такое? Да, это первая попавшаяся ссылка из чипа-дипа на двух плечевой драйвер. Но мне в лом было искать точно под параметры ТС. Мне нужно было показать, что есть драйверы верхнего и нижнего плеча мощных мосфетов по приемлемой цене и схема включения в pdf. У ST есть то что нужно ТС. Пусть сам ищет под его параметры.    

-NMi-
Offline
Зарегистрирован: 20.08.2018

nik182 пишет:

Ты опять на личности переходишь?

Есть такое дело, присуцтвуют тута некоторые пассажиры с ярко выраженным чсв. Пасиму придлагаю - пущщай аргументируют свои высказывания а НЕ просят УДАЛЯТЬ сообщения!!! Це буит правильно!

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Всем здравствуйте!

Duino A.R., я попробовал, вы были правы. Один транзистор ардуина открывает. А когда их шесть, то уже не справляется. Схему буду менять. nik182, добавить в нее полумостовые драйверы действительно придется, наверное ir2101.

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

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

Вопрос по скетчу конечно же остается открытым.

 

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

MotorArdent пишет:

Duino A.R., я попробовал, вы были правы. Один транзистор ардуина открывает. А когда их шесть, то уже не справляется. ...

MotorArdent, дело не в количестве транзисторов, а в схеме их включения. Верхние транзисторы МК не откроет никогда, сколько бы их не было, если ни открыт хотя бы один нижний. И "боковой верхний" (относительно открытого нижнего) если и приоткроет, то совсем чуточку в линейном режиме. Я об этом писал. МК тут не причем. При подаче управляющих воздействий "проволочкой" будет тоже самое.

MotorArdent пишет:
Я хочу собрать эту штуку сам и именно на ардуине. Советы бросить и купить готовое не интересны. ...

MotorArdent, я Вам предлагаю разделить процессы построения устройства и изучения электроники и программирования. Пионер, собирающий радиоприёмник по книге "Юный радиолюбитель", никак не в силах такой приёмник самостоятельно спроектировать и рассчитать. И даже близко. Он понять его работу может только на уровне еще не знающем электричества. Но он его по книжке собирает, настраивает и эксплуатирует. И он в этом получает мощный и единственно возможный в его случае импульс к продолжению своих занятий радиоделом. Он учится по правильной схеме собирать и налаживать работающую конструкцию. На этом этапе он учится "через руки". В этом нет ничего зазорного, это совершенно нормально, а такие занятия можно только приветствовать.

Научитесь, для начала, искать и в "железе" воспроизводить чужие работающие схемы, решающие Вашу задачу. Попутно разбираясь, в силу имеющихся знаний, как они работают.

 

nik182
Offline
Зарегистрирован: 04.05.2015

MotorArdent пишет:

... Схему буду менять. nik182, добавить в нее полумостовые драйверы действительно придется, наверное ir2101..

По Вашей схеме лучше подойдет IR2104. У него нагрузка не в разрыв между верхним и нижним. 

rkit
Онлайн
Зарегистрирован: 23.11.2016

nik182 пишет:

По Вашей схеме лучше подойдет IR2104.

И опять тот же  самый вредный совет не в тему. Потрясающе.

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit
Онлайн
Зарегистрирован: 23.11.2016

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

https://www.all4rc.ru/catalog/regulyatory/beskollektornyy-regulyator-sky...

Управляется широтной модуляцией, как обычный серво.

nik182
Offline
Зарегистрирован: 04.05.2015

rkit пишет:

nik182 пишет:

По Вашей схеме лучше подойдет IR2104.

И опять тот же  самый вредный совет не в тему. Потрясающе.

У меня именно на этом кристалле железка генерит 12 вольтовые мощные одиночные импульсы по трём независимым каналам. Блю пилом управляется. Ну надо мне так. Что тебя так потрясает? Можешь объяснить?

P.S. Вот люди моторчики крутят https://www.electronics-lab.com/project/ir2104-h-bridge/

И на 01 тоже https://simple-circuit.com/arduino-brushless-dc-motor-controller/

 

SLKH
Offline
Зарегистрирован: 17.08.2015

b707 пишет:

ua6em пишет:

как-то смущает это:
 

boolean TAH = 20;

прелестно :) я даже не заметил ...

да пофигу, что там в программе написано - если схема абсолютно нерабочая, а ТС принципиально не желает читать, что ему Duino A.R. объясняет.

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

rkit пишет:

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

https://www.all4rc.ru/catalog/regulyatory/beskollektornyy-regulyator-sky...

Управляется широтной модуляцией, как обычный серво.

цена на гуманная, обычный жёлтенький с алиэкспресса рублей 250-300, я дюжинами сразу беру

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Снова всем здравствуйте!

Duino A.R. пишет:
...предлагаю разделить процессы...

Duino A.R. вы опять правы :) .

Сборку собственного драйвера отложу. Почитаю умные книжки, посмотрю реализацию проектов других. Какие-то попробую повторить. А пока для своих целей закажу Motor Control Shield для ардуино на L293D. Там четыре независимых канала. У меня трехфазный мотор. Мне нужны три канала. Я правильно понял? Я ведь смогу этой штукой крутить трехфазник, верно?

P.S.:ua6em, сейчас из-за колоновируса от китаянцев товар не уходит…

 

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

MotorArdent пишет:

P.S.:ua6em, сейчас из-за колоновируса от китаянцев товар не уходит…

НА АЛИ разные продавцы, у меня идёт уже

Duino A.R.
Offline
Зарегистрирован: 25.05.2015

MotorArdent пишет:
Сборку собственного драйвера отложу. Почитаю умные книжки, посмотрю реализацию проектов других. Какие-то попробую повторить.

На мой взгляд, это правильно и естесственно.

MotorArdent пишет:
А пока для своих целей закажу Motor Control Shield для ардуино на L293D. Там четыре независимых канала. У меня трехфазный мотор. Мне нужны три канала. Я правильно понял? Я ведь смогу этой штукой крутить трехфазник, верно?

Я посмотрел в сети даташит на L293D. В этой микросхеме действительно 4 канала усиления. А у Вас 3-х фазный двигатель, на каждую обмотку которого нужно подавать разнополярное (=переменное по знаку) напряжение по определенному закону. Для этого нужно 6 ключей, как у Вас и было. Формально всё сходится. Но тут нужно разобраться с мощностью, может ещё какие особенности есть у конкретной ИМС.

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

MotorArdent
Offline
Зарегистрирован: 25.02.2020

:)

Заказал Motor Control Shield. Возился со скетчем. Проверку не проходит. Есть сомнения по расположению, что написать в void setup, а что void loop. Да и нужен ли здесь вообще void loop, если я задам прерывания? Разве что для потенциометра (pwm).

Подскажите что исправить :)

//распиновка фаз
const int AH = 20;
const int AL = 15;
const int BH = 19;
const int BL = 14;
const int CH = 18;
const int CL = 16;
//датчики Холла на пинах с прерыванием
#define hall_A 3
#define hall_B 6
#define hall_C 9
//переменные для хранения значений датчиков Холла
volatile boolean a;
volatile boolean b;
volatile boolean c;
//потенциометр для управление скважностью на ШИМ
#define val 10
//переменная для хранения значений val
int pwm;
//хрень для прерывания
int ISR_a;
int ISR_b;
int ISR_c;

void setup() {  
    pinMode(AH, OUTPUT);  
    pinMode(AL, OUTPUT);
    pinMode(BH, OUTPUT);
    pinMode(BL, OUTPUT);
    pinMode(CH, OUTPUT);
    pinMode(CL, OUTPUT);
    pinMode(val, INPUT);
    pinMode(hall_A, INPUT);
    pinMode(hall_B, INPUT);
    pinMode(hall_C, INPUT);
//Считывание датчиков Холла
    a = digitalRead(hall_A);
    b = digitalRead(hall_B);
    c = digitalRead(hall_C);
//Аппаратное прерывание
    attachInterrupt(digitalPinToInterrupt(hall_A), ISR_a, CHANGE);
    attachInterrupt(digitalPinToInterrupt(hall_B), ISR_b, CHANGE);
    attachInterrupt(digitalPinToInterrupt(hall_C), ISR_c, CHANGE); }

void loop() {
    pwm = analogRead(val);
    pwm = map(pwm, 0, 1023, 0, 255);
    pwm = constrain(pwm, 0, 255);
while(pwm = 0) {
    digitalWrite(AH, LOW);
    digitalWrite(AL, LOW);
    digitalWrite(BH, LOW);
    digitalWrite(BL, LOW);
    digitalWrite(CH, LOW);
    digitalWrite(CL, LOW); }
while(pwm > 0) {
void Phases() {
    digitalWrite(AH, (a && !b) ? HIGH : LOW);  //если a==HIGH и b==LOW, записать HIGH, иначе LOW
    digitalWrite(AL, (b && !a) ? HIGH : LOW);
    digitalWrite(BH, (b && !c) ? HIGH : LOW);  //A+ B- //A+ C- //B+ C- //B+ A- //C+ A- //C+ B-
    digitalWrite(BL, (c && !b) ? HIGH : LOW);
    digitalWrite(CH, (c && !a) ? HIGH : LOW);
    digitalWrite(CL, (a && !c) ? HIGH : LOW);
    delay(pwm); }
}
void ISR_a() {
    a = digitalRead(hall_A);
    Phases(); }
void ISR_b() {
    b = digitalRead(hall_B);
    Phases(); }
void ISR_c() {
    c = digitalRead(hall_C);
    Phases(); }
}
}

 

b707
Онлайн
Зарегистрирован: 26.05.2017

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

nik182
Offline
Зарегистрирован: 04.05.2015

https://www.chipdip.ru/product/bldcshieldtle9879tobo1
https://www.seeedstudio.com/BLDC-Motor-Shield-TB6605-p-4025.html
Для трёхфазных безщёточных моторов делают отдельные шилды.
По второй ссылке из #41 есть схема и программа к ней. Это минимум с разбора которого следует начинать свои изыскания.

MotorArdent
Offline
Зарегистрирован: 25.02.2020

Всем привет!

Скетч проверку прошел, но сомнения остаются. И чувствуется мне, что подсказок не будет :)

P.S.: nik182, я понял, спасибо

//распиновка фаз
const int AH = 20;
const int AL = 15;
const int BH = 19;
const int BL = 14;
const int CH = 18;
const int CL = 16;

//датчики Холла на пинах с прерыванием
#define HALL_A 3
#define HALL_B 6
#define HALL_C 9

//переменные для хранения значений датчиков Холла
volatile boolean a;
volatile boolean b;
volatile boolean c;

void setup() {
  
//установка режимов пинов
    pinMode(AH, OUTPUT);  
    pinMode(AL, OUTPUT);
    pinMode(BH, OUTPUT);
    pinMode(BL, OUTPUT);
    pinMode(CH, OUTPUT);
    pinMode(CL, OUTPUT);
    pinMode(HALL_A, INPUT);
    pinMode(HALL_B, INPUT);
    pinMode(HALL_C, INPUT);
    
//считывание датчиков Холла
    a = digitalRead(HALL_A);
    b = digitalRead(HALL_B);
    c = digitalRead(HALL_C);
    
//аппаратные прерывания
    attachInterrupt(digitalPinToInterrupt(HALL_A), Interrupt, CHANGE);
    attachInterrupt(digitalPinToInterrupt(HALL_B), Interrupt, CHANGE);
    attachInterrupt(digitalPinToInterrupt(HALL_C), Interrupt, CHANGE); }
    
//переключения фаз
void Phases() {
    digitalWrite(AH, (a && !b) ? HIGH : LOW); //если a==HIGH и b==LOW, записать HIGH, иначе LOW
    digitalWrite(AL, (b && !a) ? HIGH : LOW);
    digitalWrite(BH, (b && !c) ? HIGH : LOW); //A+ B- //A+ C- //B+ C- //B+ A- //C+ A- //C+ B-
    digitalWrite(BL, (c && !b) ? HIGH : LOW);
    digitalWrite(CH, (c && !a) ? HIGH : LOW);
    digitalWrite(CL, (a && !c) ? HIGH : LOW); }

//работа прерываний
void Interrupt() {
    a = digitalRead(HALL_A);
    b = digitalRead(HALL_B);
    c = digitalRead(HALL_C);
    Phases(); }
    
void loop() {}