Jump to content

"Велосипедный" контроллер на ардуино


Guest CTPAHNK
 Share

Recommended Posts

Guest CTPAHNK

Приветствую дорогое сообщество, прошу помощи в реализации проекта- дрифт трайка для детворы, а именно в создании контроллера для мотор-колеса управляемого с ардуино. Сам трайк я построил еще летом, и тогда использовал дешевый китайский контроллер для запуска двигателя, вот пробный заезд

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

//throttle
const int analogInPin1 = 22; 
//hall input
int hall_sensor_a = 7;
int hall_sensor_b = 2;
int hall_sensor_c = 4;
//Motor setup
const int a_motor_lout = 3;
const int a_motor_pwm_hout = 9;
const int b_motor_lout = 6;
const int b_motor_pwm_hout = 11;
const int c_motor_lout = 10;
const int c_motor_pwm_hout = 5;
void setup(){
 // Serial.begin(9600);
  pinMode(a_motor_lout, OUTPUT);
  pinMode(a_motor_pwm_hout, OUTPUT);
  pinMode(b_motor_lout, OUTPUT);
  pinMode(b_motor_pwm_hout, OUTPUT);
  pinMode(c_motor_lout, OUTPUT);
  pinMode(c_motor_pwm_hout, OUTPUT);
  pinMode(hall_sensor_a, INPUT);
  pinMode(hall_sensor_b, INPUT);
  pinMode(hall_sensor_c, INPUT);
}  
void loop(){
/* int A;
 A = 11111;
 Serial.println(digitalRead(7));
 Serial.println(digitalRead(2));
 Serial.println(digitalRead(4));
 Serial.println(A);
  */
   while(1){
  int val = analogRead(analogInPin1);
  val = constrain(val, 211, 830);
  int thLevel = map(val, 211, 830, 50, 0);
if ( thLevel <= 45){  
//  int thLevel = 0;
   delay(thLevel); 
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){
        digitalWrite(a_motor_pwm_hout,1);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_lout,0);
        digitalWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,1);digitalWrite(c_motor_pwm_hout,0);
        delay(thLevel);} 
      else {
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){
        digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0);digitalWrite(c_motor_lout,1);
        digitalWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);digitalWrite(a_motor_pwm_hout,1);
        delay(thLevel);} 
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==1){
        digitalWrite(c_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);
        digitalWrite(b_motor_pwm_hout,1);digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,1);
        delay(thLevel);}           
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_pwm_hout,0);digitalWrite(a_motor_lout,1);
        digitalWrite(b_motor_lout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,1);
        delay(thLevel);} 
      else {  
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_pwm_hout,1);digitalWrite(c_motor_lout,0);
        digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,1);digitalWrite(b_motor_pwm_hout,0);
        delay(thLevel);}
      else {  
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==0){
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0);
        digitalWrite(b_motor_lout,1);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,1);
        delay(thLevel);}
        }}}}}
}        else{
          digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0);
        digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0);
    }}}

0d830e1f90174c7aa2543e4b0e068d4a.png

 

далее имеются в руках только N-channel мосфеты STP75NF75 которые решил завести с помощью драйвера HIP4086 нарисовал схему, вытравил плату, так как не очень удобно было к его ногам прицепиться(хотя пытался), пытаюсь запустить, а он не подает жизни :(. На двух выходах драйвера к мосфетам всегда высокий уровень(+12), и что бы я не подавал на входы, все молчит. Ранее когда пытался завести похожее но на базе транзисторов, то хоть мотор ногами дергал, но не крутился, а сейчас вообще тишина. Ни мосфеты, ни другие элементы на плате не греются. Не могу ума приложить что не так тут и как проверить еще...

Screen Shot 2016-12-30 at 00.39.59.png

Буду признателен за любые комментарии. 

Link to comment
Share on other sites

Номиналы резисторов R1-R6  как определяли?

Номиналы конденсаторов С1-С3 как определяли?

Рекомендуемый пример применения микросхемы http://www.intersil.com/content/dam/Intersil/documents/an18/an1829.pdf  и http://www.intersil.com/content/dam/Intersil/documents/an96/an9642.pdf

В примере на ток 20А и напряжение 48 В резисторы R1-R6 имеют значение 33 Ом и схема немного сложнее.

Ну и просто банальный совет посмотреть осциллографом сигналы на микросхеме и крутнув вал руками.

В примере AN9642 номинал резисторов R1-R6 еще меньше чем в примере  AN1829 и схема включения проще.

!!!! вход UVLO отвечающий за отключение контролера при низком напряжения. Не силен в английском, но по описанию вроде не стоит его подключать к земле через резистор. Сделайте как в базовом примере an9642  на рис.13. Или может кто поможет советом?

!!!! ВХОД Rdel отвечающий за тайминги  (задержки включения) подключен к Vdd через резистор 2.2 кОм, в одном примере  значение 20 кОм, в другом рекомендовано значение от 10 кОм до 100 кОм.

Либо поменяйте, либо поясните выбор.

 

Edited by Сергей_Харьков
Link to comment
Share on other sites

Реле, разъемы, вентиляторы, корпуса, микросхемы, конденсаторы и много другое!

Скидки до 20% на сайте электронного дискаунтера ТМ Электроникс.

Бесплатная доставка в любую точку России + кэшбэк 15%.

Всем кто сделает заказ в сентябре, начислим 3000 баллов на аккаунт. 1 балл = 1 рублю!

Подробнее

Приветствую Сергей, спасибо что заглянули в тему, и еще конструктивно покопались :)

Оба примера применения рассматривал, и на их принципах строил свою, как выбирал R1-R6, уже не помню, но точно помню что считал, хм, где это я их насчитал....!? Понял, исправлю. С1-С3, считал, а именно от сюда ноги растут, это KB интерсиловский, вопрос конечно в голове остался, почему их совет не совпал с расчетами, и если следовать было ему, то в их схеме должно было быть 616nf вместо 1nf. Нашел интересное чтиво тут сейчас все пересчитаю и попробую еще раз, отпишусь сегодня, а пока побежал за селедкой, мадамы шубу хотят, будем им селедка под шубой :P

Link to comment
Share on other sites

Привет , с праздниками. В примерах конденсаторы 0.22 мкф C1-C3. Возможно и 0.37 мкф пройдет.

Но резисторы на входы управляющих разными доп. функциями лучше сделать по примеру-даташиту .

Например  R10  по нему должен быть 50 кОм , а не 1 кОм. И  в этом варианте будет активна функция контроля  уставки по напряжению...., если подключить по рис.13 c  Vdd то функция будет отключена. Может из-за мелочи вроде резистора R10 - схема не запустится.

Лучше по даташиту, тем более в первый раз

Link to comment
Share on other sites

Сергей, спасибо за помощь, я все таки пересчитал конденсаторы и резисторы следуя указаниям с упомянутого документа, получилось следующее С1-С3 = 0.199 мкф, а резисторы R1-R6 = 16,3 Ом - это уже больше походит на "даташитовские". Утром попробую перепаять все и также управляющую часть, отпишусь по результатам. Спасибо!

Link to comment
Share on other sites

С новым годом! Всем здоровья, удачи, семейного благополучия, новых и интересных идей в новом году! :lol:

Вчера не получилось покрутить электронику, так как придавался плотским утехам за столом :), думаю многие так вчера лудили желудок и печень :)

Сегодня внес изменения в схему, и о чудо, мотор дергает ногой... но гад не крутится... :( Есть большое подозрение на то что датчики холла отрабатывают с задержкой, а точнее оборот создаваемый тягой двигателя не дотягивает до переключения датчика :(, как результат он резко дергается и потом замирает в одном положении, рукой можно с силой прокрутить в следующею "фазу", но там практически тот-же результат. А может что-то еще?

Screen Shot 2017-01-01 at 20.09.27.png

Когда первый раз включил, была жуть какая то, мотор дергался как дурной и не обращал внимание на сигналы с мк, на всех выходах творилась страшная картина мусорного характера, далее заметил на лабораторнике просадку по напряжению с 36 в 5 вольт, соответственно собранный источник питания для драйвера на LM317, тоже не мог держать 12 вольт и драйвер уходил в защиту. Подключением еще одного источника питания, проблема решилась и дальше продолжил тестить. На лабораторнике пока поставил 0.1А для теста, а то не хочется выжечь мосфеты полной силой.

Screen Shot 2017-01-01 at 20.27.56.png

Screen Shot 2017-01-01 at 20.27.43.png

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

Спасибо!

 

 

 

Link to comment
Share on other sites

С новым годом!  Желаю здоровья, успехов в хобби и  работе.

Может не стоит сразу дергать датчик холла?

0.1 А - ограничение которое имеет смысл только для не перемотанного мотора от CD-ROM. Для нормального мотора, как на фото, ток холостого хода (без нагрузки) , наверное будет за 1-5 А, а пусковой может больше . Может поменять ограничение?

Может не трогать датчики Холла, а поэкспериментировать с входом Rdel.  Вместо резистора 20 кОм включить последовательно  постоянный 10 кОм и переменный ( подстроечный ) 100 кОм. И попробовать при разных положениях  резистора.

Только менять положение резистора при отключенном питании

Edited by Сергей_Харьков
Link to comment
Share on other sites

Приветствую! С рождеством Христовым!

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

Что характерно, двигатель прыгает из положения холла 1-0-0, в 1-0-1 и потом обратно, и так в цикле туда сюда...  Если я прокручу мотор, ставлю его в положение к примеру 0-0-1 и 1-1-0, то мотор делает оборот пробегая дл крайнего значения(1-0-0 или 1-0-1) и вновь начинает свой цикл в никуда... и после чего лабораторник уходит в защиту пытаясь на одном из стопов восстановится, дать старт с полной силой, а на второй просто отскакивает назад - 10A порог. А вот с положения 0-1-1, мотор прыгает в 0-1-0 и там замирает, лабораторник тоже в защиту уходит. Логику еще раз пересмотрел по этой таблице истинности:

CommutationTable_CW.png

также добавил шим-а, и задержки между углами для отладки.

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

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

//throttle
const int analogInPin1 = 22; 
//hall input
int hall_sensor_a = 7;
int hall_sensor_b = 2;
int hall_sensor_c = 4;
//Motor setup
const int a_motor_lout = 3;
const int a_motor_pwm_hout = 9;
const int b_motor_lout = 6;
const int b_motor_pwm_hout = 11;
const int c_motor_lout = 10;
const int c_motor_pwm_hout = 5;
void setup(){
  Serial.begin(9600);
  pinMode(a_motor_lout, OUTPUT);
  pinMode(a_motor_pwm_hout, OUTPUT);
  pinMode(b_motor_lout, OUTPUT);
  pinMode(b_motor_pwm_hout, OUTPUT);
  pinMode(c_motor_lout, OUTPUT);
  pinMode(c_motor_pwm_hout, OUTPUT);
  pinMode(hall_sensor_a, INPUT);
  pinMode(hall_sensor_b, INPUT);
  pinMode(hall_sensor_c, INPUT);
}  
void loop(){
int A;
 A = 11111;
/* Serial.println(digitalRead(7));
 Serial.println(digitalRead(2));
 Serial.println(digitalRead(4));
 Serial.println(A);
  */
   while(1){
  int val = analogRead(analogInPin1);
  val = constrain(val, 211, 830);
  int gas = map(val, 211, 830, 0, 255);
if ( gas >= 5){  
  int thLevel = 400;
 Serial.println(gas);
 Serial.println(digitalRead(7));
 Serial.println(digitalRead(2));
 Serial.println(digitalRead(4));
 Serial.println(A); 

if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){
        analogWrite(a_motor_pwm_hout,gas);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_lout,0);
        digitalWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,1);digitalWrite(c_motor_pwm_hout,0);
        delay(thLevel);} 
      else {
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==0){
        digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0);digitalWrite(c_motor_lout,1);
        digitalWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);analogWrite(a_motor_pwm_hout,gas);
        delay(thLevel);} 
      else {  
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){
        digitalWrite(c_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);
        analogWrite(b_motor_pwm_hout,gas);digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,1);
        delay(thLevel);}           
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_pwm_hout,0);digitalWrite(a_motor_lout,1);
        digitalWrite(b_motor_lout,0);digitalWrite(c_motor_lout,0);analogWrite(b_motor_pwm_hout,gas);
        delay(thLevel);} 
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==1){
        digitalWrite(a_motor_pwm_hout,0);analogWrite(c_motor_pwm_hout,gas);digitalWrite(c_motor_lout,0);
        digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,1);digitalWrite(b_motor_pwm_hout,0);
        delay(thLevel);}
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0);
        digitalWrite(b_motor_lout,1);digitalWrite(a_motor_lout,0);analogWrite(c_motor_pwm_hout,gas);
        delay(thLevel);
        }}}}}}}        
else{
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0);
        digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0);
     Serial.println(digitalRead(7));
     Serial.println(digitalRead(2));
     Serial.println(digitalRead(4));
     Serial.println(A);
     delay(100); 
}}}

 

Если есть еще идеи, буду рад испытать, пока буду пилить код, может попробую зацепить моторчик от сидирома и его покрутить кодом который с ним работал, но уже через контроллер, надеюсь не сожгу :)

Link to comment
Share on other sites

Продолжаем тестирование, отключил двигатель от контроллера, оставил только датчики холла чтобы видеть изменения при подаче питания на входы двигателя, лабораторник прикрутил на 12В/0.1А, нарисовал на листочке таблицу истинности, мотора рукой довел до ВМТ( 1-0-1 :)), подаю питание - получаю оборот до следующего значения, 1-0-0 и мотор замирает, хорошо, продолжаю дальше... Так мотор прошел все значения и крутился в правильную сторону, значения занес в табличку...

Screen Shot 2017-01-07 at 00.09.47.png

посмотрев на схему, потом на плату, обнаружил что 1 и 3 контакт выходящий к мотору перепутаны местами, зацепил к двигателю, и уже прогресс!!! Двигатель начал крутиться, в правильную сторону, но каждый раз делает стоп от которого лабораторник уходит в защиту, но потом продолжает и так на каждый цикл прохода всех 6 фаз, такое ощущение как будто существует 7 фаза в которой он просто еще раз повторяет 6-ю. Хммм... Ищу дальше...

 

Link to comment
Share on other sites

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

Link to comment
Share on other sites

9 часов назад, CTPAHNK сказал:

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

На какой ток стоит ограничение?

Может просто не хватает  мощности импульса (бп не дает нужный ток-напряжение) , чтобы раскрутить мотор.

Определить ток холостого хода мотора и проверить может ли бп его выдать с 2-3 кратным запасом (пусковой ток всегда больше тока холостого хода)

 

Link to comment
Share on other sites

Данный мотор 36В 250Ватт, получается что нужно ему порядка 7 ампер для работы, на старт конечно больше необходимо но все-же не так много, на данный момент при тестировании 10А стоит. Просто как-то странно, я на моторе поставил маркером линию, провел последовательно по всем фазам и поставил вторую линию чтобы видеть, сколько мотор проходит за один цикл. Так вот как и писал выше, мотор с легкостью пролетает полный цикл и при переходе в следующий происходит "удар" в результате которого лабораторних уходит в защиту, то-есть вначале, для старта и прохождения первого цикла ему все хватает, а вот когда происходит этот затык, он уходит в защиту, потом вновь, восстанавливается, делает этот оборот, удар и так по кругу. Посижу сегодня дальше по колдую, если не вылечу, выложу видео его дерганья для полной картины может будут идеи.

Link to comment
Share on other sites

Отрицательный результат- тоже результат. Тока 10 А с головой должно хватать для пуска.

Значит причина в другом.

Конденсатор С5 емкостью 740 pF, в обоих примерах стоит емкость 470 pF. Может стоит поменять. Тем более, что отвечает Refresh Pulse Setting. Внешний конденсатор может быть соединен с этого пальца к VSSto увеличить длину импульса запуска обновления - см Рисунок 17. Если этот вывод не подключен, импульс обновления, как правило, 1.5μs.

По графику 17 максимальная емкость 470 pF. Минимальная 0 pF.

740 pF далеко за пределами рекомендованных.

Link to comment
Share on other sites

13 часа назад, CTPAHNK сказал:

при переходе в следующий происходит "удар" в результате которого лабораторних уходит в защиту

Если отключить двигатель и крутить его руками для датчика, какие токи потребляет схема?

Избегайте тех, кто старается подорвать вашу веру в себя. Эта черта свойственна мелким людям. Великий человек, наоборот, внушает чувство, что вы можете стать великим. (Марк Твен)

Link to comment
Share on other sites

Приветствую всех, помучил сегодня мой мотор вновь, нашел следствие причины, но не саму причину, пока, а именно в положениях датчика холла 1-0-0 и следующим за ним 1-1-0 контроллер не дает полный сигнал на мосфеты, из за чего они только малость приоткрываются и как результат мотор не успевает прокрутить все значение вовремя для положения 0-1-0, в итоге, если я ставлю в начало положения 0-1-0 и подаю питание, мотор дает рывок !!!ОБРАТНО!!!, а если в середину или конец, то он проворачивает его в правильную сторону. Что значит начало и середина? - при вращении мотора есть отчетливые магнитные зацепления, которые можно сравнить с трещоткой, так вот чтобы датчик холла сработал, двигатель должен пройти этих три щелчка, они очень маленькие-короткие, но чувствуются хорошо.

Сначала предположил что отпал один из сигнальных проводов с контроллера, проверил, все хорошо, сигнал есть, на каждое положение датчиков холла прилетают верные значения по всем каналам. Далее начал мерить что у меня на выходах, CLO прилетает 12В в обоих случаях, а вот значения для AHO BHO разные, при одинаковом результате, и еще, если просто мерить значения напряжения на резисторах R1,R5,R4 когда мотор находится в покое то R4 имею нуль, когда на R1= 36В и R5 = 48В.

значение датчиков холла 1-0-0, мотор еле проявляет тягу CLO = 12В, AHO ниже, лабораторник сразу улетает в защиту

Newfile2aa.jpeg

значение датчиков холла 1-1-0, мотор еле проявляет тягу CLO = 12В, BHO ниже, лабораторник сразу улетает в защиту

Newfile2b.jpeg

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

По поводу конденсатора, это у меня очепятка вышла, в плате впаян верный, на 470pf.

Edited by CTPAHNK
Link to comment
Share on other sites

а повесить 3 лампочки вместо обмоток и пошагать вручную по всем фазам и проверить все ключи? (только про ШИМ не забыть т.к. верхние ключи не заработают)

 

Link to comment
Share on other sites

2 часа назад, Mishany сказал:

верхние ключи не заработают

А почему не заработают? Если лампочки вместо обмоток подключить как на схеме?

3лампочки.jpg

Избегайте тех, кто старается подорвать вашу веру в себя. Эта черта свойственна мелким людям. Великий человек, наоборот, внушает чувство, что вы можете стать великим. (Марк Твен)

Link to comment
Share on other sites

Может вылетел  MOSFET в  одном канале.

А мотор не проверяли ?

Дерганье мотора бывает когда не работает один канал регулятора или повреждена одна (оборвана, к.з.) обмотка.

 

Edited by Сергей_Харьков
Link to comment
Share on other sites

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

Link to comment
Share on other sites

Потому что верхние ключи такие же как и нижние Nканал, а что бы коммутировать нканал по плюсу на затвор надо подать напряжение минимум больше на 10вольт по отношению к стоку, это напряжение обеспечивает бустстеперная цепочка из диода и конденсатора D2, D5, D6  и С1, С2, С3 на второй сверху схеме, а цепочка эта будет работать только если есть переключение ключей (присутствует ШИМ). Если без шим модуляции то на выводы AHB, BHB, CHB необходимо подать Vcc мотора + 10..15Вольт при 36в питания там должно быть около 50Вольт и тогда можно без шима дергать фазы как угодно

Link to comment
Share on other sites

Предварительный результат, лампочки не горят :(, ни одна... как бы ни крутил мотор... ШИМ присустствует, лабораторник просто работает и не шаволится... буду сейчас выпаивать мосфеты и мереть их отдельно.

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

Link to comment
Share on other sites

Нашел, два пробитых мосфета, заменил, помигал лампочками, зацепил мотор, даю "газу", мотор дерганно идет вперед, смотрю на положения датчиков холла, они показывают 1-0-1, 1-0-0, 0-1-0, все стальное пролетает мотор рывками, то есть получает он импульсы только в данных положениях датчиков холла. Убрал задержку, мотор срывается в максимум оборотов и начинает греться обмотка.

последний скетч для ардуины выглядит так:

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

//throttle
const int analogInPin1 = 22; 
//hall input
int hall_sensor_a = 7;
int hall_sensor_b = 2;
int hall_sensor_c = 4;
//Motor setup
const int a_motor_lout = 3;
const int a_motor_pwm_hout = 9;
const int b_motor_lout = 6;
const int b_motor_pwm_hout = 11;
const int c_motor_lout = 10;
const int c_motor_pwm_hout = 5;
void setup(){
  Serial.begin(9600);
  pinMode(a_motor_lout, OUTPUT);
  pinMode(a_motor_pwm_hout, OUTPUT);
  pinMode(b_motor_lout, OUTPUT);
  pinMode(b_motor_pwm_hout, OUTPUT);
  pinMode(c_motor_lout, OUTPUT);
  pinMode(c_motor_pwm_hout, OUTPUT);
  pinMode(hall_sensor_a, INPUT);
  pinMode(hall_sensor_b, INPUT);
  pinMode(hall_sensor_c, INPUT);
}  
void loop(){
int A;
 A = 11111;
/* Serial.println(digitalRead(7));
 Serial.println(digitalRead(2));
 Serial.println(digitalRead(4));
 Serial.println(A);
  */
   while(1){
  int val = analogRead(analogInPin1);
  val = constrain(val, 211, 830);
  int gas = map(val, 211, 830, 0, 255);
if ( gas >= 5){  
  int thLevel = 0;
 /*Serial.println(gas);
 Serial.println(digitalRead(7));
 Serial.println(digitalRead(2));
 Serial.println(digitalRead(4));
 Serial.println(A); 
*/
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){
        digitalWrite(a_motor_lout,0);digitalWrite(c_motor_lout,0);analogWrite(c_motor_pwm_hout,0);
        analogWrite(b_motor_pwm_hout,0);digitalWrite(b_motor_lout,1);analogWrite(a_motor_pwm_hout,gas);
        delay(thLevel);} 
      else {
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==0){
        digitalWrite(a_motor_lout,0);analogWrite(c_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);
        analogWrite(b_motor_pwm_hout,0);analogWrite(a_motor_pwm_hout,gas);digitalWrite(c_motor_lout,1);
        delay(thLevel);} 
      else {  
if (digitalRead(hall_sensor_a)==1 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){
        analogWrite(c_motor_pwm_hout,0);digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);
        analogWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,1);analogWrite(b_motor_pwm_hout,gas);
        delay(thLevel);}           
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==0){
        analogWrite(a_motor_pwm_hout,0);analogWrite(c_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);
        digitalWrite(b_motor_lout,0);analogWrite(b_motor_pwm_hout,gas);digitalWrite(a_motor_lout,1);
        delay(thLevel);} 
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==1 && digitalRead(hall_sensor_c)==1){
        analogWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);analogWrite(b_motor_pwm_hout,0);
        digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,1);analogWrite(c_motor_pwm_hout,gas);
        delay(thLevel);}
      else {  
if (digitalRead(hall_sensor_a)==0 && digitalRead(hall_sensor_b)==0 && digitalRead(hall_sensor_c)==1){
        analogWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);analogWrite(b_motor_pwm_hout,0);
        digitalWrite(a_motor_lout,0);analogWrite(c_motor_pwm_hout,gas);digitalWrite(b_motor_lout,1);
        delay(thLevel);
        }}}}}}}        
else{
        digitalWrite(a_motor_pwm_hout,0);digitalWrite(c_motor_lout,0);digitalWrite(b_motor_pwm_hout,0);
        digitalWrite(b_motor_lout,0);digitalWrite(a_motor_lout,0);digitalWrite(c_motor_pwm_hout,0);
     Serial.println(digitalRead(7));
     Serial.println(digitalRead(2));
     Serial.println(digitalRead(4));
     Serial.println(A);
     delay(50); 
}}}

 

 

Link to comment
Share on other sites

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

У авр есть апноты по управлению BLDC. Arduino думаю сдесь мало уместна со своими медленными и монструозными библиотеками

Link to comment
Share on other sites

Join the conversation

You are posting as a guest. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Loading...
 Share

  • Recently Browsing   0 members

    • No registered users viewing this page.

×
×
  • Create New...