avatar_mr.Dream

Делаю себе контроллер BLDC на Arduino )

Автор mr.Dream, 19 Июль 2016 в 17:58

« назад - далее »

0 Пользователи и 1 гость просматривают эту тему.

495

#108
Цитата: Pawel от 21 Сен. 2016 в 02:51
Чтобы не было торможения двигателем при открывании газа на скорости, разрешение шунтирования диодов ключами можно выдавать при превышении фазного тока какого-то малого значения (к примеру 7А).  При таком малом токе диоды ещё не будут греться (если они не зашунтированы), и так же этот порог является защитным интервалом для предотвращения ложных срабатываний разрешений шунтирования при нулевом или отрицательном фазном токе, когда газ открыт меньше реальной скорости движения.
Я знаком только с msp430f247 . В нём есть компаратор с коммутатором на 8 входов . Схему я только обдумал , не делал в железе . На входе коммутатора стоит защитная цепочка из двух последовательных диодов к минусу и резистора к плюсу процессора . От входа коммутатора , с диодами и резистором  , идёт диод к нижнему транзистору (D MOSFETа) той фазы которая не синхронный выпрямитель , а замыкает ток через обмотки на минус . Падение напряжения на открытом транзисторе даёт фазный ток , при закрытом транзисторе на диоде обратное смещение . Схема должна хорошо работать при спаде тока через транзистор , при нарастании тока через транзистор есть ограничение по току через резистор , что приводит к ограничению скорости нарастания напряжения .  Прерывание уложится в 16 тактов (1 мкс) записать байт из регистра процессора в регистр таймера ,на ассемблере как минимум . По опорному напряжению , копия схемы , но диод к минусу (S MOSFETа). Если написал непонятно , нарисую гифку .
  Паралельно MOSFETам я всегда ставлю диоды Шоттки . Если это делают в силовых модулях , то почему не делают в контроллерх ? Диоды MOSFETов не оптимизируют , они паразитная структура в MOSFETе .

mr.Dream

Разобрался с внешними прерываниями. Положение ротора определяется корректно (тест на мониторе порта)
Читаю датчики по прерыванию изменения порта В, нужные пины выделил маской. Фазами буду крутить через порт D, как раз 6 "лишних" пинов имеет, ибо два первых - TXи RX (их трогать не стал). Bxxxxxx00 - еще не определил окончательно комбинацию фаз, посмотрю, как удобней будет при разводке :)
#include <avr/interrupt.h>
void setup(){
  cli();
  DDRD = DDRD | B11111100;
  PORTD = PORTD & B00000011;
  PCICR |= B00000001;
  PCMSK0 |= B00011100;
  sei();
}
void loop(){
 
}
ISR(PCINT0_vect){
  if ((PINB & 1<<2) and (~PINB & 1<<3) and (~PINB & 1<<4)){  //100
    PORTD = PORTD & B00000011;
    PORTD = PORTD | Bxxxxxx00;
  }
  else if ((PINB & 1<<2) and (PINB & 1<<3) and (~PINB & 1<<4)){  //110
    PORTD = PORTD & B00000011;
    PORTD = PORTD | Bxxxxxx00;
  }
  else if ((~PINB & 1<<2) and (PINB & 1<<3) and (~PINB & 1<<4)){  //010
    PORTD = PORTD & B00000011;
    PORTD = PORTD | Bxxxxxx00;
  }
  else if ((~PINB & 1<<2) and (PINB & 1<<3) and (PINB & 1<<4)){  //011
    PORTD = PORTD & B00000011;
    PORTD = PORTD | Bxxxxxx00;
  }
  else if ((~PINB & 1<<2) and (~PINB & 1<<3) and (PINB & 1<<4)){  //001
    PORTD = PORTD & B00000011;
    PORTD = PORTD | Bxxxxxx00;
  }
  else if ((PINB & 1<<2) and (~PINB & 1<<3) and (PINB & 1<<4)){  //101
    PORTD = PORTD & B00000011;
    PORTD = PORTD | Bxxxxxx00;
  }
  else{
    PORTD = PORTD & B00000011; //err
  }
}

clawham

#110
мой вариант обработчика прерывания холлов

#define H1 PIND.3
#define H2 PIND.4
#define H3 PIND.5



    HallBits=0;
   
    HallBits      = H3;
    HallBits    <<=1;
    HallBits     |= H2;
    HallBits    <<=1;
    HallBits     |= H1;
   
    HallBits ^= 0b00000111;

    if(HallBits<8)
    {
        res = HallState[HallBits];       
    }
else
    {
        res=0;
        HallError=1;
    }
   
    if(OutEn)   
        SetOut(res);
    else
        PORTC = 0;


Вместо тысячи условий я сделал табличку HallState который репрезентует все состояния холлов и соответствующее им состояние выходов
char HallState[8] =  {0b00000000,
                      0b00001100,
                      0b00010001,
                      0b00010100,
                      0b00100010,
                      0b00001010,
                      0b00100001,
                      0b00000000};


вывод в порт простое
void SetOut(unsigned char Bits)
{
    PORTC = 0;
   
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
    #asm("nop");
   
    PORTC = Bits&0b00111111;
}
1)8FUN SWXK 250w24V@17A48V 13S4P LGD1, China kontr
3)MXUS 3000 @90A80V LiFePo 20Ah 25S, Nucular 12F
Telegram @clawham

mr.Dream

Цитата: clawham от 23 Сен. 2016 в 19:42
Вместо тысячи условий я сделал табличку HallState который репрезентует все состояния холлов и соответствующее им состояние выходов
char HallState[8] =  {0b00000000,
                      0b00001100,
                      0b00010001,
                      0b00010100,
                      0b00100010,
                      0b00001010,
                      0b00100001,
                      0b00000000};

если 7-й или 8-й бит изменится? Тогда состояние фаз останется прежним? А в моем случае даже два пина не использовать - расточительство :) А на portc же АЦП висит. Туда буду мерять напругу, ток, акселератор - уже не получится мне)

clawham

вы не поняли!
внутри массива - состояния ВЫходов.

а комбинация входов - это есть номер записи в массиве! и там есть маска и нули для ошибочных комбинаций!

главное - сколько тактов у меня уходит на это!и да оставшиеся 2 ноги можно использовать - просто писать через лог или а сбрасывать через лог И. зато тактов меньше быть не может! и всеравно не работает на высокой частоте!
1)8FUN SWXK 250w24V@17A48V 13S4P LGD1, China kontr
3)MXUS 3000 @90A80V LiFePo 20Ah 25S, Nucular 12F
Telegram @clawham

mr.Dream

#113
Не удержался, очень интересно было))) питание 7В от блока питания роутера )))))) вместо драйверов - оптопары с резисторами, в качестве питания оптопар верхних ключей - три свинцовых аккума  :laugh:
Закрутилось!
https://www.youtube.com/watch?v=Zb9Yk1U7_sQ
пока что тупо эмулятор коллектора. все остальное управление уже буду допиливать, как соберу рабочий вариант платы.

https://www.youtube.com/watch?v=6BN8_3bDzaw

nicomunet123

Уже крутится? Ооочень быстро.  :wow:
Кстати, а как контроллеры работают без холлов? Микруха эмуляции холлов?
Надо уже плату разрабатывать и заказывать у китайцев. Силовая часть работает, а программную можно и на плате допилить.
И тогда будет народный "инфенеон" с плавным регеном и исходным кодом!

Кстати, можете выложить весь исходный код?
E-TWOW Eco -> Kugoo -> Ninebot ES1 -> Ninebot ES-Trash

clawham

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

Да и зачем - никто не спорит что в 20 мегагерц 8 бит можно это воткнуть но увы - опережение уже не получается - не хватает памяти на таблицы, не хватает частоты на ненакладывание прерываний, не хватает дисмпетчера прерываний с приоритетностью. Да блин элементарно пока она бедняга щелкая в фоне прерываниями на пределе пересчитает новый угол через флоаты - уже вечность пройдёт и данные эти будут устаревшими. а на целочислоеддной арифметике сложно выбрать правильную размерность чтоб и на низах не переполнилось и на ВЧ шаг чтоб не пол оборота был.

Кароче пока пока ничего ни выдающегося ни полезного ни сверхъестественного лично я не вижу. Это делается за вечер под бутылку пива. Вы кстати зря верхними взялись рулить - бутстрепная технология - отличный вариант сильно упростить себе жизнь. просто надо не забывать верхними шимить.ну а на макс оборотах уже и шимить не надо - заряду конденсатора в 10 мкф хватает на пол секунды удержания в открытом состоянии фетов! вы ж не забыли что феты по управлению просто конденсатор и потребляют только в момент открытия - при закрытии их ёмкость на нагрев ключей драйвера уходит. А в постоянно открытом состоянии там потребление мизерное - например у моих драйвером пол милиампера. И когда на буте напруга падает ниже 10 вольт - феты ещё не начнут входить в линейный режим а драйвер уже сам принудительно закроет их так что ничем это не грозит!
Ещё с чем реально столкнулся - на больших фазных токах ШИМка лезет в холлы!в момент переключения 0-1 в холах тоже наводится фальшивый сигнал! Так пришлось игнорировать некоторое время после открытия верхнего полевика 10 мкс любые данные с холлов и не выпадать в ошибку от того что все холлы в нуле внезапно стали...это опять таки добавляет времени обработки и уменьшает точность
1)8FUN SWXK 250w24V@17A48V 13S4P LGD1, China kontr
3)MXUS 3000 @90A80V LiFePo 20Ah 25S, Nucular 12F
Telegram @clawham

mr.Dream

[user]clawham[/user], как то вы пессимистично относитесь ко всему этому :) инфинеон нормальный контроллер? Половина форума его хвалят. И чего в нем такого особенного? Надежность и простота :) Понимаю, что для вычисления правильного синуса понадобится процессор помощней.  Но для опережения флоаты - это жирно :) Опережение это не баснословные градусы, а временная констатнта - реакция индуктивности током на поданное напряжение. Если она будет стабильной, то на низах она почти не будет влиять, а на сверхвысоких оборотах может на целый такт сместиться. Вот только не знаю (пока не разбирался), как используя один таймер генерировать три прерывания по совпадению.

zap

Инфинеон хоть и 8-битный МК, но там есть встроенный аппаратный драйвер трёхфазного двигателя. Он по-моему вообще от процессора независимо может работать, сам Холлы читает и сам крутит ШИМы как надо. Надо только настройку таймеров сделать и всё. Именно поэтому в Инфинеонах, в отличие от других китайских контроллеров, холлы эмулируют внешней микрухой (для бездатчикового режима).
С уважением,
Андрей

Поражаю масштабностью некопмпетентность (ц) из лички

clawham

Я просто прошел это дело пол года назад
потратил на это месяц по вечерам(при том что с нуля собрал крутящий абыкак редукторник за пол дня) - опережение не работает на атмеге нормально и легко. получается хуже чем без него. Просто крутить как инфинеон и сместить таблицу на один шаг датчика холла - да пожалуйста так можно но феты будут гореть на старте на низкоомных моторах всеравно, греться будет аки утюг всеравно и шуметь всеравно будет изза джиттера. какая цель синуса? бесшумность - если синус не попадает - падает момент и шум ещё хуже чем от блочного режима.опережение какой имеет смысл? развить больше оборотов чем можно на блочнике? аналогично - ехать быстрее на 20% не будет - проверено на миникро и кромоторе 3 витковом - не едет.

тоесть если и делать то на том что успевать может.

ну ок не надо флоатов - ну давайте пересчитайте мне +10градусов опережение по данным - с прошлого шага холла прошло 2000000 тактов на 20 мегагерцах - через сколько тактов надо выдать на выход нужную комутацию?

а теперь не меняя ничего - пересчитайте это при данных - -15% при этом между двумя прошлыми тактами холла прошло 6667 тактов гненератора на 20 мегагерцах клоцающего. Через целочисленную арифметику или на высоких чатсотах шаг выйдет 10-20-30% или на низах упрешся в лимит лонгинта  - 2147418112 - большего числа не записать. попробуй пересчитать в екселе с округлением до целых и поймёш что это сложно чтоб не допускать колебаний реального опережения +-5% ибо это уже слышно

А это ж фигня - это текущая задача которую надо 32 раза за один оборот колеса считать - ещё нужна прога где считается собственно какое нужно в данных условиях опережение - там я считаю по упрощенному квадратичному закону нарастание тока в катушке и решаю через дискриминанту это примитивное двадратичное уравнение. оно и дает на выходе необходимое опережение. оно на низких частотах шумит ибо холлы неравномерно шагают - приходится оконный фильтр применять а он задерживает сигнал на 6 тактов +- как итог - я уже уперся в камушек а контроллер так и молотит с опережением хотя уже надо бы уменьшить время - не успел просчитать - получаются колебания на границе переключений соседних состояних холов - генерация на уровне 500 герц. затупил влияние оконника - получилось что на статике работает красиво но на разгоне - запаздывают результаты - запаздывает и "опережение" и наоборот - на горке вместо сделать позже зажигание - вылезает опережение - момент падает и поехало - я в итоге заипался подбирать коэффициенты и длины окон - плюнул - процу тупо не хватает времени! данные о необходимом в текущих условиях опережению тупо приходят поздно когда они уже устарели...и чем больше оборотов тем позже ибо он тупо не успевает из прерываний выходить тока туда-сюда и скачет.

потому и надо чтоб это все опережение клацалось через ДМА напрямую между куском памяти и выходными регистрами таймера аппаратного чтоб проц вообще на это не отвлекался - так можно у многих армов. ну и 32 бита это я вам скажу сильное преимущество против 8-ми бит. ну а 72 мегагерца это вообще фаталити :)

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

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

Вот такое вот кино :)

И да - инфинеоновский контроллер - там в проце реально аппаратный таймер и спецпрерывание на 12 состояний для комутации холов и отработки проблемных комутаций. там же контроль допустимости последжовательности - он вырубоается аппаратно в нули если нарушается последовательность с холлов.

ну а проц там по факту ничем не занимается - с ацп читает ток и ограничивает через заполнение шима ток в батарею и через математику примитивную - фазный
1)8FUN SWXK 250w24V@17A48V 13S4P LGD1, China kontr
3)MXUS 3000 @90A80V LiFePo 20Ah 25S, Nucular 12F
Telegram @clawham

mr.Dream

[user]clawham[/user], короче ясно. Вашего текста в моей теме больше, чем моего ) ничего по сути - только одно недовольство. Я делаю себе, не на продажу, то этому буду делать так, как хочу я.  Все ;-) Ну не охота мне отдавать 250 бакинских за контроллер, который мне в 100 обойдется, плюс еще опыта наберусь. А синусник под мой двигатель вообще 450 уе стоит.

on4ip

Правильный подход. Надо делать если интересно. Только вот я не разделяю увлечений этих садо мазо с ардуинами=)
В жизни все не так, как на самом деле.

clawham

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

Можно сделать! Будет крутиться.
Но это и получится обычный тупой китайский крутик на блочке и на холах.

Я вам по сути подсказал красивое быстрое решение выборки выхода от состояний входов - вы проигнорировали :) ну и в путь вам :) Я только буду БОЛЕТЬ за то чтоб ваш контр работал и получился. И если появятся проблемы и желание получить помощь - я могу попробовать помочь.

кстати после 300 об/мин уже нет разницы синус или блочка :) эт так идея оптимизашка ;)
1)8FUN SWXK 250w24V@17A48V 13S4P LGD1, China kontr
3)MXUS 3000 @90A80V LiFePo 20Ah 25S, Nucular 12F
Telegram @clawham

mr.Dream

[user]on4ip[/user], Ну для кого садомазо, а для кого - увлечение. Многие здесь делают самоделки, я бы сказал даже - почти все )) кто то раму сам варит, кто то вилку, кто то асинхронник под ПМ переделывает. Это хобби.  А ардуину я написал почему выбрал - просто есть несколько штук в запасе во первых, во вторых - удобство подключения (МК уже распаян) программирования. Видел даже извраты, когда датчики опрашивались в цикле метдом digitalRead и порты записывались write-ом, и не смотря на то, что эти комманды занмают больше 1000 мкс, оно работало). Для меня дуинка стала началом аппаратного программирования. До этого программил только на PHP и MySQL (есть проекты, сделанные с нуля в блокноте и успешно годами используются на предприятиях).
Касательно контроллера. Да, мог взять аппаратный микроконтроллер, заточенный под вращение синхронного двигателя со всей необходимой периферией, но хочу иметь гибкость, которую смогу в любое время реализовать. Тот же псевдо-синус реализовать на атмеге не составит труда. Или токовое управление, что очень важно на больших мощностях. Такое реализовал был на прошлом контроллере для коллекторника, очень понравилось. )) Плюс защиты всякие, к примеру от выхода ручки газа из строя или пропадания контакта или замыкания. Вот щас катаюсь на китай-контроллере, в процессе езды отвалился минус из разьема - если бы не кнопка выключения на руле, куда то бы вже влетел, ибо тормозами остановить не мог.

on4ip

ДА это ради бога=) Взялиб PIC или STM под привод и все. Но если хобби то значит только хард кор=)
В жизни все не так, как на самом деле.

mr.Dream

Цитата: clawham от 24 Сен. 2016 в 16:20
кстати после 300 об/мин уже нет разницы синус или блочка :) эт так идея оптимизашка ;)
вот именно. А у меня мотор 5 тыс  об/мин. Мне бы на низах убрать ступенчатую коммутацию, ибо шумит. А на скорости никто не услышит. Да и индуктивность многое прощает. )

batson

автору респект, если будет аналог китай-контроллера с открытыми исходниками - будет всеобщее счастье.
только пока не поздно надо переезжать на STM, конфигурировать его немного сложнее чем аврки, но тоже не представляет сложности, а в остальном только плюсы.
Самоходный аппарат из нержавейки: нержавеющий чоботар, инфинеон 12, MXUS 1000