Jump to content
Guest CTPAHNK

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

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

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

Share this post


Link to post
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 Сергей_Харьков

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Литиевые батарейки Fanso для систем телеметрии и дистанционного контроля

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

Подробнее

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

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

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

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
                     

Приглашаем на вебинар Решения для построения ультразвуковых счетчиков жидкостей и газов на базе MSP430

Компэл совместно с Texas Instruments 23 октября 2019 приглашают на вебинар, посвященный системам-на-кристалле для построения ультразвуковых расходомеров жидкостей и газов на базе ядра MSP430. Вебинар проводит Йоханн Ципперер – эксперт по ультразвуковым технологиям, непосредственно участвовавший в создании данного решения. На вебинаре компания Texas Instruments представит однокристальное решение, позволяющее создавать точные недорогие счетчики жидкостей и газов.

Подробнее...

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

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

Спасибо!

 

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

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

Edited by Сергей_Харьков

Share this post


Link to post
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); 
}}}

 

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

Share this post


Link to post
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-ю. Хммм... Ищу дальше...

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
9 часов назад, CTPAHNK сказал:

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

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

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

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
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 далеко за пределами рекомендованных.

Share this post


Link to post
Share on other sites
13 часа назад, CTPAHNK сказал:

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

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

Share this post


Link to post
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

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites
2 часа назад, Mishany сказал:

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

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

3лампочки.jpg

Share this post


Link to post
Share on other sites

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

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

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

 

Edited by Сергей_Харьков

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
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); 
}}}

 

 

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
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
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...

  • Similar Content

    • By Alexandr Petrenko
      Нужна помощь, так случилось, что я никак не связан с радиотехникой и т.д, но мне нужно сделать перчатку (тема дипломной работы) по видео AlexGyver, которая по сути и есть стробоскопом на базе Arduino nano. И я её кое-как спаял и конечно же она не работает, причины искать нет смысла, потому что может быть всё что угодно. Подскажите мне как можно упростить это устройство чтобы я его смог сделать, что-то проще, желательно схему иначе я не справлюсь.
      Вот то видео:
      https://www.youtube.com/watch?v=rLpn_4ERJXQ
    • By SigmA
      Доброго времени суток всем. Для своей новой жены захотелось мне сделать сердечко на atmega8, с кучей эффектов и т.д. Так вот, разные мигалки-переключалки св-диодов я написал, использовал delay. Но мне этого стало мало и я решил подключить шим программный. Отдельно от всей программы шим работает как нужно, так же и переключалки работают отдельно от шим, но вот когда я соединяю это всё воедино то работает только шим и не переходит дальше по коду.Я так понимаю, что таймеры и delay вместе работать не могут? Но если могут, то как?
      #include <mega8.h> #include <delay.h> #define GREEN PORTC.1=PORTC.2=PORTC.3=PORTC.0 unsigned char i, s,; unsigned char green=255; unsigned char green_b; //переменные, для буферизации значений скважности ШИМ unsigned char count; //переменная- счетчик вызовов обработчика прерываний unsigned char temp=1; interrupt [TIM0_OVF] void timer0_ovf_isr(void) { count++; if (count == 0){ //если счетчик переполнился и принял значение 0 green_b = green; GREEN = 1; } if (green_b == count) { GREEN = 0;} } void main(void) { PORTC=0x0F; //конфигурируем порт DDRC=0x0F; TCCR0=0x01; //настраиваем таймер TCNT0=0x00; TIMSK=0x01; //разрешаем генерацию прерывания по переполнению таймера T0 #asm("sei") //глобально разрешаем прерывания while (1) { for (i=0;i<3;i++) { if (temp==1) {if (green < 255) green += 1; else temp = 2;} if (temp==2) {if (green > 0) green -= 1; else temp = 1;} delay_ms(1000); }; s=7; for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.0=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.3=1; delay_ms(200); PORTC.3=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.3=0; PORTC.2=1; delay_ms(200); PORTC.2=0; PORTC.1=1; delay_ms(200); PORTC.1=0; PORTC.0=1; delay_ms(200); PORTC.0=0; } for (i=0;i<=s;i++) { PORTC.3=1; delay_ms(200); PORTC.2=1; delay_ms(200); ; PORTC.1=1; delay_ms(200); PORTC.0=1; delay_ms(200); PORTC.3=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.0=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC.0=1; delay_ms(200); PORTC.1=1; delay_ms(200); ; PORTC.2=1; delay_ms(200); PORTC.3=1; delay_ms(200); PORTC.0=0; delay_ms(200); PORTC.1=0; delay_ms(200); PORTC.2=0; delay_ms(200); PORTC.3=0; delay_ms(200); } for (i=0;i<=s;i++) { PORTC=0x01; delay_ms(200); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x09; delay_ms(200); PORTC=0x0A; delay_ms(200); PORTC=0x0C; delay_ms(200); PORTC=0x0D; delay_ms(200); PORTC=0x0E; delay_ms(200); PORTC=0x0F; delay_ms(200); PORTC=0x07; delay_ms(150); PORTC=0x0B; delay_ms(200); PORTC=0x03; delay_ms(250); PORTC=0x05; delay_ms(300); PORTC=0x09; delay_ms(350); PORTC=0x01; delay_ms(400); PORTC=0x02; delay_ms(200); PORTC=0x04; delay_ms(200); PORTC=0x08; delay_ms(200); PORTC=0x00; delay_ms(200); } for (i=0;i<=5;i++) { PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(300); PORTC=0x00; delay_ms(150); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(100); PORTC=0x0f; delay_ms(100); PORTC=0x00; delay_ms(1000); } } }  
    • By IgnatiusF
      Взял с места практики отладочную плату с атмегой 32-й, дома понял (возможно), что микроконтроллер заблокирован.
      Пытался шить через USBASP при помощи AVRDUDE, однако ошибка:
      avrdude.exe: error: programm enable: target doesn't answer. 1 avrdude.exe: initialization failed, rc=-1 Double check connections and try again, or use -F to override this check. В правильности и надежности подключения полностью уверен, проверил каждый контакт и каждый элемент на всей плате тестером. Кстати, вот она:
      У меня точно такая же, только с Atmega32A.
      Попробовал поставить на нее дрова, но теперь она определяется вот так: Неизвестное USB-устройство (сбой дескриптора устройства).
      Из этой статьи по решению данной проблемы выполнил все указания, однако ничего не сработало.
      Тут я подумал на отключенный rst выход, так как был опыт из-за путаницы с обратными и прямыми фьюзами на Attiny13A. Тогда быстренько все исправил высоковольнтным программатором из этой статьи, вот и подумал сделать здесь подобное. Немного (чуть больше) полазив в интернете нашел вот такую схему на arduino. Все есть, чтобы ее сделать, только сперва понять бы, можно или нет без выпаивания это делать. И еще понять бы, в этом ли настоящая проблема? Или может я что-то не то надумал?
      Надеюсь на вашу помощь
    • By myhhyk
      .include "m8adef.inc" .cseg main1: LDI R16,Low(RAMEND) ; тут стэк инициализирую OUT SPL,R16 ; LDI R16,High(RAMEND) OUT SPH,R16 ldi r20,1 reset: ldi r16,$02;--ICR1H значение $222 при заданом режиме счетчик должен считать до $222 и сбрасывать в ноль ldi r17,$22;--ICR1L OUT ICR1H,r16;--выводим сначала старший байт, как учили OUT ICR1l,r17;--затем младший ldi r16,$1;---OCR1AH при значении $1AA должен менять пин OCR1A ldi r17,$AA;--OCR1AL OUT OCR1AH,r16;--старший OUT OCR1AL,r17;--и младший ldi r17,$82;--TCCR1A режим такой: WGM-1110 COM-10 ldi r16,$19;--TCCR1B OUT TCCR1B,r16 OUT TCCR1A,r17 ldi r16,$FF OUT DDRB,r16;-- порт б на выход main:;--должны получать шим rjmp main Здравствуйте, помогите пожалуйста. Хочу сделать плавное включение светодиода с помощью ШИМа и Timer1,чтобы плавненько было. Устанавливаю WGM 1110 т.е. быстрый шим и со счетом до ICR1, а счетчик считает почему то до $1ff и потом начинает уменьшать счет до нуля, т.е. как будто я выбрал режим WGM 0110 быстрый ШИМ 9 бит. Пробовал всякие разные комбинации. На значения COM не обращаю пока, он просто меняет момент срабатывания пина, мне нужно, чтобы я мог задавать до скольки считать, потом чтобы в ноль счетчик сбрасывался и менялось состояние пина по OCR1A.В общем принцип работы Timer2, только чтобы счет был больше. Помогите плиз :*)
      Ах да, AtMega8A микроконтроллер.
    • By Zver2011
      Всем привет! 
      Дано: Контроллер подсветки рабочей зоны кухни, реализованный на Tiny 13A.  Светодиодная лента длиной 2,3 метра, led 5050, 120 светодиодов/метр. Принципиальная схема устройства ниже:

      Код прошивки:
      #include <tiny13.h> #include <delay.h> int triggered = 0; int ontimer = 0; void main(void) { // Input/Output Ports initialization // Port B initialization // Function: Bit5=In Bit4=In Bit3=In Bit2=In Bit1=In Bit0=Out DDRB=(0<<DDB5) | (0<<DDB4) | (0<<DDB3) | (0<<DDB2) | (0<<DDB1) | (1<<DDB0); // State: Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0 PORTB=(0<<PORTB5) | (0<<PORTB4) | (0<<PORTB3) | (0<<PORTB2) | (0<<PORTB1) | (0<<PORTB0); // Timer/Counter 0 initialization // Clock source: System Clock // Clock value: 37,500 kHz // Mode: Fast PWM top=0xFF // OC0A output: Non-Inverted PWM // OC0B output: Disconnected // Timer Period: 6,8267 ms // Output Pulse(s): // OC0A Period: 6,8267 ms Width: 0 us TCCR0A=(1<<COM0A1) | (0<<COM0A0) | (0<<COM0B1) | (0<<COM0B0) | (1<<WGM01) | (1<<WGM00); TCCR0B=(0<<WGM02) | (1<<CS02) | (0<<CS01) | (0<<CS00); TCNT0=0x00; OCR0A=0x00; OCR0B=0x00; while (1) { if (PINB.1==1) { triggered = 1; ontimer = 60; }; if (ontimer > 0) { ontimer--; } else { triggered = 0; }; if (triggered) { if (OCR0A<255) { OCR0A++; }; } else { if (OCR0A>0) { OCR0A--; }; }; delay_ms(10); } } Возникшая проблема:
      Греется полевой транзистор при работе. 
      Изначально поискав информацию на данную проблему, начал прикидывать. 
      Смотрим график зависимости пропускаемого тока стока (ID )от приложенного напряжения  затвор-сток (VGS),  при температуре окруж. среды 25 градусов: ID = 14 А (2,3 метра светодиодной ленты не могут столько кушать, по крайней мере я такую не видел).

      Было предположение что частота переключения ШИМ высокая - отсюда транзистор в не определенном состоянии = нагрев. Рассчитал макс. частоту так:
      Rg = 100 Ом, Vgs = 5V
      Заряд затвора:
      Qiss = Ciss * Vgs = 1800pF * 5v = 9nC
      Скрость нарастания:
      S = Rgate * Qiss = 100Ohm * 9nC = 0.009mV*sec
      Время на открытие или закрытие транзистора:
      t=S / Vgs = 0.002mV*sec * 3.2v = 4.5uSec
      Период  - это открытие + закрытие:
      T = t + t = 4.5uSec + 4.5uSec = 9uSec
      Максимальная частота переключения:
      F < 1 / T = 1 / 9uSec = 111KHz
      Ток через затвор (G) и цифровой выход Tiny 13A:
      I = Qiss / t = 2mA
      Максимальный выходной ток GPIO у Tiny 13A 40.0mA
      2mA < 40.0mA
      Выставил частоту ШИМ на 37,5 кHz. Вуаля - при подключении 1м светодиодной ленты (тестировал на обрезке), нагрева нет. Но как только подключил все 2,3 метра - транзистор стал снова спустя время греться, аж дотронуться не возможно.  Захотел померить ток, который потребляет 1 метр ленты, проверить продавца. Потребление 1 метра ленты оказалось вместо заявленных 600 мА, все 1,85 А, причем заметил странную вещь - ток начал возрастать спустя время на сотые доли  и дошел до 1,9 А. Дальше ждать не стал. Режим амперметра в мультиметре сломался?
      Далее подумал что слишком большая мощность рассеивается на транзисторе. Если учесть то, что при открытом транзисторе, его переход можно представить в виде линейного резистора с маленькой величиной сопротивления,  можно рассчитать рассеиваемую мощность на транзисторе:
      Смотрим сопротивление транзистора в открытом состоянии при VGS = 5В : RDS(on) = 0.18 Ом
      P1 = 1,9*1,9*0,18 = 0,65 Вт. (1 метр св.ленты).
      Раз мы взяли потребление 1 метра ленты  1, 9 А, тогда 2,3 метра потребляют  = 4,4 А. (Теперь не уверен в своем мультиметре).
      P2=4.4*4.4*0.18 = 3.5 Ватт - довольно таки многовато я думаю.
      В общем: Правильно ли я делаю расчеты? Что упустил?  Как снизить нагрев транзистора, без применения вентиляторов и здоровенных радиаторов? Есть вариант замены светодиодной ленты на что нибудь поменьше жрущее (60 светодиодов/ метр например), но в будущем еще много раз придется сталкиваться с полевиками, хотелось бы разобраться .
×
×
  • Create New...