Дошли в кои-то веки руки поковырять управление бесколлекторником.
Пытаюсь вкурить "классический" аппноут AVR444, но что-то не могу понять момент перехода от "слепой" раскрутки к работе по прерываниям. По отдельности раскрутку и рабочий цикл - уяснил, а вот между ними...
Что я понял из кода к аппноуту:
Изначально на этапе "слепой" раскрутки все таймерные прерывания отключены, таймер 0 гонит ШИМ аппаратно на ногу OC0B,
задержки коммутации - на опросе флага переполнения таймера 1.
После раскрутки разрешается прерывание OCIE1A, что и должно обеспечить переход к рабочему циклу (в котором прерывания по очереди разрешают друг друга):
Но вот в чём странность - в OCR1A при этом ничего не пишется. Единственное место, где происходит запись в этот регистр - это прерывание переполнения таймера 0 (а оно на данный момент ещё запрещено).
Если ориентироваться на дефолтное значение после сброса (то есть ноль), тогда получается, что прерывание сработает только при следующем переполнении таймера 1 (и симуляция это подтвердила), но это ведь аж 65 мс (в то время как межкоммутационные интервалы при слепой раскрутке - от начального 20 мс до финального 5,5 мс).
Вот и зудит вопрос: то ли в аппноуте косяк, то ли пауза после раскрутки - это так и должно быть? Под нагрузкой затормозиться же успеть может. А если я в своём коде "по мотивам" уберу эту паузу, вставлю инициализацию OCR1A на основании последнего интервала раскрутки - никаких внезапных граблей не прилетит?
И ведь не гуглится нихрена. Или я не знаю, какие ключевые слова использовать, чтобы нужное найти вместо мусорной кучи простых упоминаний. Судя по встреченным упоминаниям AVR444 - люди как-то его реализуют (причём, довольно массово) и ничего не упоминают про такой нюанс.
Пытаюсь вкурить "классический" аппноут AVR444, но что-то не могу понять момент перехода от "слепой" раскрутки к работе по прерываниям. По отдельности раскрутку и рабочий цикл - уяснил, а вот между ними...
Что я понял из кода к аппноуту:
Изначально на этапе "слепой" раскрутки все таймерные прерывания отключены, таймер 0 гонит ШИМ аппаратно на ногу OC0B,
задержки коммутации - на опросе флага переполнения таймера 1.
После раскрутки разрешается прерывание OCIE1A, что и должно обеспечить переход к рабочему циклу (в котором прерывания по очереди разрешают друг друга):
TCNT1 = 0; TIMSK1 = (1 << OCIE1A);
Но вот в чём странность - в OCR1A при этом ничего не пишется. Единственное место, где происходит запись в этот регистр - это прерывание переполнения таймера 0 (а оно на данный момент ещё запрещено).
Если ориентироваться на дефолтное значение после сброса (то есть ноль), тогда получается, что прерывание сработает только при следующем переполнении таймера 1 (и симуляция это подтвердила), но это ведь аж 65 мс (в то время как межкоммутационные интервалы при слепой раскрутке - от начального 20 мс до финального 5,5 мс).
Вот и зудит вопрос: то ли в аппноуте косяк, то ли пауза после раскрутки - это так и должно быть? Под нагрузкой затормозиться же успеть может. А если я в своём коде "по мотивам" уберу эту паузу, вставлю инициализацию OCR1A на основании последнего интервала раскрутки - никаких внезапных граблей не прилетит?
И ведь не гуглится нихрена. Или я не знаю, какие ключевые слова использовать, чтобы нужное найти вместо мусорной кучи простых упоминаний. Судя по встреченным упоминаниям AVR444 - люди как-то его реализуют (причём, довольно массово) и ничего не упоминают про такой нюанс.