Quantcast
Channel: Рождённый с паяльником
Viewing all articles
Browse latest Browse all 2102

Кто-нибудь реализовывал AVR444?

$
0
0
Дошли в кои-то веки руки поковырять управление бесколлекторником.

Пытаюсь вкурить "классический" аппноут AVR444, но что-то не могу понять момент перехода от "слепой" раскрутки к работе по прерываниям. По отдельности раскрутку и рабочий цикл - уяснил, а вот между ними...

Что я понял из кода к аппноуту:

Изначально на этапе "слепой" раскрутки все таймерные прерывания отключены, таймер 0 гонит ШИМ аппаратно на ногу OC0B,
задержки коммутации - на опросе флага переполнения таймера 1.
После раскрутки разрешается прерывание OCIE1A, что и должно обеспечить переход к рабочему циклу (в котором прерывания по очереди разрешают друг друга):
 TCNT1 = 0;
 TIMSK1 = (1 << OCIE1A);


Но вот в чём странность - в OCR1A при этом ничего не пишется. Единственное место, где происходит запись в этот регистр - это прерывание переполнения таймера 0 (а оно на данный момент ещё запрещено).

Если ориентироваться на дефолтное значение после сброса (то есть ноль), тогда получается, что прерывание сработает только при следующем переполнении таймера 1 (и симуляция это подтвердила), но это ведь аж 65 мс (в то время как межкоммутационные интервалы при слепой раскрутке - от начального 20 мс до финального 5,5 мс).

Вот и зудит вопрос: то ли в аппноуте косяк, то ли пауза после раскрутки - это так и должно быть? Под нагрузкой затормозиться же успеть может. А если я в своём коде "по мотивам" уберу эту паузу, вставлю инициализацию OCR1A на основании последнего интервала раскрутки - никаких внезапных граблей не прилетит?

И ведь не гуглится нихрена. Или я не знаю, какие ключевые слова использовать, чтобы нужное найти вместо мусорной кучи простых упоминаний. Судя по встреченным упоминаниям AVR444 - люди как-то его реализуют (причём, довольно массово) и ничего не упоминают про такой нюанс.

Viewing all articles
Browse latest Browse all 2102

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>