Re: Управление 3-х фазным sensorless BLDC
Добавлено: 08 мар 2016, 13:46
Тут вспомнил на выходных про свою плату, решил еще немного подумать над программой. Если кратко, в итоге все заработало.
Как я и думал, математика у меня была правильная, логика работы и определения перехода через 0 тоже, не хватило всего лишь одного мелкого, но очень важного, как оказалось, куска кода, который в прерывании компаратора после сохранения времени ZC записывал бы обратно в таймер половину времени коммутации. Выглядит это так: То есть, независимо от момента ZC, время до следующей коммутации должно быть половину времени коммутации. Достаточно было написать T1 = -comm_time/2. Минус потому, что мы считаем, что в таймере signed int длиной 17 бит, это оказалось удобно, comm_time же содержит положительное время между коммутациями. Я почему-то решил не писать в таймер время коммутации, видимо решил, что разгон на начальной стадии будет слишком быстрый.
Но не все так радужно #1: если на двигатель нацепить массу (а-ля блин от винчестера), то старт происходит с трудом. Если двигатель с большой индуктивностью (~5мГн) и многополюсный (как у флоппика), то даже без нагрузки стартует плохо, работает нестабильно. Если индуктивность маленькая (двигатель от СД-привода, ~300мкГн), то надо поднимать минимальную частоту коммутаций, иначе ЭДС не хватает на нормальное детектирование. В общем, голая программа будет нормально работать с сильно ограниченный списком двигателей.
И не все так радужно #2: особенно это заметно, если питать от 8В и выше, то есть когда скорость вращения приличная - если тормозить пальцем так, чтобы обороты были около трети, то двигатель начинает сбрасывать состояние скорости на начальное, те как будто нет детектирования ZC, а если выше или ниже - все вроде бы нормально. Надо более точно смотреть с осциллографом. Так же, есть лимит по скорости сверху, около 15К оборотов для низкоиндуктивного движка от СД-рома. Тут уже надо решать кодом на асме и оптимизацией.
Еще надо добавить детектирование заблокированного ротора, и другую мелочевку.
Написал программу на С, так как это быстрее для отладки алгоритма (где-то пол дня ушло). Потом можно и на асм переложить.
-------------------------------------------------------
Удалил программу, так как обнаружил в ней много ошибок, из-за которых ротор вращался неравномерно от шага к шагу (странно, что он вообще заработал).
Как я и думал, математика у меня была правильная, логика работы и определения перехода через 0 тоже, не хватило всего лишь одного мелкого, но очень важного, как оказалось, куска кода, который в прерывании компаратора после сохранения времени ZC записывал бы обратно в таймер половину времени коммутации. Выглядит это так: То есть, независимо от момента ZC, время до следующей коммутации должно быть половину времени коммутации. Достаточно было написать T1 = -comm_time/2. Минус потому, что мы считаем, что в таймере signed int длиной 17 бит, это оказалось удобно, comm_time же содержит положительное время между коммутациями. Я почему-то решил не писать в таймер время коммутации, видимо решил, что разгон на начальной стадии будет слишком быстрый.
Но не все так радужно #1: если на двигатель нацепить массу (а-ля блин от винчестера), то старт происходит с трудом. Если двигатель с большой индуктивностью (~5мГн) и многополюсный (как у флоппика), то даже без нагрузки стартует плохо, работает нестабильно. Если индуктивность маленькая (двигатель от СД-привода, ~300мкГн), то надо поднимать минимальную частоту коммутаций, иначе ЭДС не хватает на нормальное детектирование. В общем, голая программа будет нормально работать с сильно ограниченный списком двигателей.
И не все так радужно #2: особенно это заметно, если питать от 8В и выше, то есть когда скорость вращения приличная - если тормозить пальцем так, чтобы обороты были около трети, то двигатель начинает сбрасывать состояние скорости на начальное, те как будто нет детектирования ZC, а если выше или ниже - все вроде бы нормально. Надо более точно смотреть с осциллографом. Так же, есть лимит по скорости сверху, около 15К оборотов для низкоиндуктивного движка от СД-рома. Тут уже надо решать кодом на асме и оптимизацией.
Еще надо добавить детектирование заблокированного ротора, и другую мелочевку.
Написал программу на С, так как это быстрее для отладки алгоритма (где-то пол дня ушло). Потом можно и на асм переложить.
-------------------------------------------------------
Удалил программу, так как обнаружил в ней много ошибок, из-за которых ротор вращался неравномерно от шага к шагу (странно, что он вообще заработал).