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

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


Гость 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

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

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

Номиналы резисторов 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 кОм.

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

 

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

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

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

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

Сравнительное тестирование аккумуляторов EVE Energy и Samsung типоразмера 18650

Инженеры КОМПЭЛ провели сравнительное тестирование аккумуляторов EVE и Samsung популярного для бытовых и индустриальных применений типоразмера 18650. 

Для теста были выбраны аккумуляторы литий-никельмарганцевой системы: по два образца одного наименования каждого производителя – и протестированы на двух значениях тока разряда: 0,5 А и 2,5 А. Испытания проводились в нормальных условиях на электронной нагрузке EBD-USB от ZKEtech, а зарядка осуществлялась от лабораторного источника питания в режиме CC+CV в соответствии с рекомендациями в даташите на определенную модель. Подробнее>>

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

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

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

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

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

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

Новый аккумулятор EVE серии PLM для GSM-трекеров, работающих в жёстких условиях (до -40°С)

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

Эти аккумуляторы поддерживают заряд при температуре от -40/-20°С (сниженным значением тока), безопасны (не воспламеняются и не взрываются) при механическом повреждении (протыкание и сдавливание), устойчивы к вибрации. Они могут применяться как для автотранспорта (трекеры, маячки, сигнализация), так и для промышленных устройств мониторинга, IoT-устройств. Подробнее параметры и результаты тестов новой серии PLM по ссылке.

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

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

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

Литиевые батарейки и аккумуляторы от мирового лидера  EVE в Компэл

Компания Компэл, официальный дистрибьютор EVE Energy, бренда №1 по производству химических источников тока (ХИТ) в мире, предлагает продукцию EVE как со склада, так и под заказ. Компания EVE широко известна в странах Европы, Америки и Юго-Восточной Азии уже более 20 лет. Недавно EVE была объявлена поставщиком новых аккумуляторных элементов круглого формата для электрических моделей «нового класса» компании BMW.

Продукция EVE предназначена для самого широкого спектра применений – от бытового до промышленного. Подробнее>>

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

С новым годом! Всем здоровья, удачи, семейного благополучия, новых и интересных идей в новом году! :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

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

Спасибо!

 

 

 

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

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

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

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

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

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

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

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

Что-то первая неделя после праздников захватился меня в рабочие будни, тока добрался по тестить... в общем сделал как посоветовали, 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); 
}}}

 

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

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

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

Screen Shot 2017-01-07 at 00.09.47.png

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

 

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

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

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

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

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

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

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

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

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Приветствую всех, помучил сегодня мой мотор вновь, нашел следствие причины, но не саму причину, пока, а именно в положениях датчика холла 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.

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

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

 

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

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

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

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

3лампочки.jpg

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

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

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

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

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

 

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

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

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

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

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

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

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

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

Нашел, два пробитых мосфета, заменил, помигал лампочками, зацепил мотор, даю "газу", мотор дерганно идет вперед, смотрю на положения датчиков холла, они показывают 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); 
}}}

 

 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

×
×
  • Создать...