Управление 3-х фазным sensorless BLDC
Добавлено: 18 июл 2015, 19:49
Решил на будущий возможный проект сделать себе драйвер, беглое гугление кроме готовых модельных драйверов привело меня к микросхеме LB11880, которую удалось заказать и попробовать. В принципе, я ожидал, что она будет не слишком мощная, но в реальности все хуже, двигатель от винчестера при 12В разгоняется почти до 10К об/мин, но даже при легком нажиме обороты падают на треть, а микросхема начинает довольно быстро греться. Больше разогнать не получится (мне, скорее всего, надо будет 30К макс, но почти без нагрузки), так как максимальное напряжение у нее 13В, а двигатель с меньшей индуктивностью (и соотв. бОльшими токами) быстро нагревает микру.
Тут вспомнил про аппноуты от микрочипа, в которых драйверы были. Таки да, и достаточно разнообразные. Имеющиеся детали были под схему из AN1175, схему я почти не менял, только полевики поставил поновее (немного мощнее и с чуть меньшей емкостью затвора), поставил стабилизатор для МК вместо стабилитрона, да поставил в базу биполярников драйвера верхних ключей резисторы по 1К, что бы можно было испытывать работу при питании от программатора простым замыканием общего эмиттерного резистора, получилось вот что:
Для компилирования проекта пришлось узнавать чем и как скомпилить С, для тестов оказалось проще поставить XC8 для MPLABX. После исправления пары мелочей проект скомпилился, а плата заработала. Но не все так радужно, увы. МК позволяет регулировать частоту изменением PWM заполнения нижних ключей, дак вот, при частоте вращения выше определенной (примерно 160Гц коммутации, или 2400 об/мин) начинается "троттлинг", или затягивание текущего шага. Это хорошо видно на осциллограммах (сигналы для верхних ключей, на нижних - PWM) - на первой все хорошо, на второй после поднятия частоты вращения. Такая фигня приводит к жутким вибрациям, ограничению частоты, и повышенному току. Хотя при снижении оборотов нагрузкой ниже какого-то порога все нормально, да и мощность не в пример LB11880. В общем, если бы не эта фигня, почти идеальная схема для меня.
Я попробовал разобраться в программе, но хоть алгоритм достаточно хорошо описан в АН, С я не знаю совсем. Максимум что я добился, это незначительного повышения порога "срыва" примерно до 6К об/мин уменьшением значения PR2_INIT в main.h с 0x7F до 0x50.
В общем, у меня 3 выхода: дальше ковырять программу (подучив хотя бы основы С), забить на нее и написать свою на асме, благо алгоритм описан в АН, или собрать схему по AN1305, правда для нее у меня нет МК. Собственно вопрос: быть может кто-то, знающий С, глянет код, стоит над ним работать или лучше сразу настроиться на написание собственной программы? Проект для MPLABX : ПС: Подумал, что так происходит из-за не оптимального кода компилятора, немного погуглив на эту тему нашел статейку, в которой наглядно показали, как фри версия XC8 портит код - для перемещения данных там, где можно было бы переместить без использования регистра RAM, он вставляет 2 команды операции в регистр и регистр-W: например, константа -> порт/регистр конфига становится константа -> RAM -> W -> нужный регистр конфига, или организация сдвигов регистров через циклы, даже 1, добавление nop'ов и прочее. Поэтому попробовал поставить компилятор MikroC, он таки скомпилил код после нескольких часов исправлений (а-ля GIE=1 нельзя, надо INTCON.GIE=1), но программа от него не заработала вообще, хотя ошибок больше не выдает.
Тут вспомнил про аппноуты от микрочипа, в которых драйверы были. Таки да, и достаточно разнообразные. Имеющиеся детали были под схему из AN1175, схему я почти не менял, только полевики поставил поновее (немного мощнее и с чуть меньшей емкостью затвора), поставил стабилизатор для МК вместо стабилитрона, да поставил в базу биполярников драйвера верхних ключей резисторы по 1К, что бы можно было испытывать работу при питании от программатора простым замыканием общего эмиттерного резистора, получилось вот что:
Для компилирования проекта пришлось узнавать чем и как скомпилить С, для тестов оказалось проще поставить XC8 для MPLABX. После исправления пары мелочей проект скомпилился, а плата заработала. Но не все так радужно, увы. МК позволяет регулировать частоту изменением PWM заполнения нижних ключей, дак вот, при частоте вращения выше определенной (примерно 160Гц коммутации, или 2400 об/мин) начинается "троттлинг", или затягивание текущего шага. Это хорошо видно на осциллограммах (сигналы для верхних ключей, на нижних - PWM) - на первой все хорошо, на второй после поднятия частоты вращения. Такая фигня приводит к жутким вибрациям, ограничению частоты, и повышенному току. Хотя при снижении оборотов нагрузкой ниже какого-то порога все нормально, да и мощность не в пример LB11880. В общем, если бы не эта фигня, почти идеальная схема для меня.
Я попробовал разобраться в программе, но хоть алгоритм достаточно хорошо описан в АН, С я не знаю совсем. Максимум что я добился, это незначительного повышения порога "срыва" примерно до 6К об/мин уменьшением значения PR2_INIT в main.h с 0x7F до 0x50.
В общем, у меня 3 выхода: дальше ковырять программу (подучив хотя бы основы С), забить на нее и написать свою на асме, благо алгоритм описан в АН, или собрать схему по AN1305, правда для нее у меня нет МК. Собственно вопрос: быть может кто-то, знающий С, глянет код, стоит над ним работать или лучше сразу настроиться на написание собственной программы? Проект для MPLABX : ПС: Подумал, что так происходит из-за не оптимального кода компилятора, немного погуглив на эту тему нашел статейку, в которой наглядно показали, как фри версия XC8 портит код - для перемещения данных там, где можно было бы переместить без использования регистра RAM, он вставляет 2 команды операции в регистр и регистр-W: например, константа -> порт/регистр конфига становится константа -> RAM -> W -> нужный регистр конфига, или организация сдвигов регистров через циклы, даже 1, добавление nop'ов и прочее. Поэтому попробовал поставить компилятор MikroC, он таки скомпилил код после нескольких часов исправлений (а-ля GIE=1 нельзя, надо INTCON.GIE=1), но программа от него не заработала вообще, хотя ошибок больше не выдает.