Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: PIC18F4431. Регулирование бесколлекторного эл. двигателя (BLDC)
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Все остальные микроконтроллеры > PIC
d_dr
Доброго всем времени суток!

Пытаюсь сделать регулирование частоты вращения бесколлекторного эл. двигателя (BLDC) на "PIC18F4431". Двигатель имеет датчики положения (Холла) для коммутации. В принципе, все как описано в "AN899", тот же "source code" (с минимальными изменениями).
Текущая задача заключается в измерении времени таймером "Timer5" между событиями (изменениями состояний датчиков) в диапазоне до 16-и бит, для последующего вычисления частоты вращения с соответствующим 16-битным разрешением, используя аппаратные возможности uC - "Input Capture" (on state change) модуля "Motion Feedback".
Конкретно моя проблема состоит в том, что по приходу события, из таймера в буфер записывается только нижний байт - "CAPxBUFL", верхний же байт таймера ("Timer5_H") и буфера ("CAPxBUFH") остаются равны нулю. Т.е. при переполнении нижнего байта таймера НЕ происходит переноса в верхний байт. Таким образом значительно сокращается снизу диапазон измерения частоты вращения...
Желаемые 16 бит дает переодическое зачитывание значения верхнего байта таймера в "ручном режиме" по примеру:
Код
        movf    TMR5H, w
        movwf   Timer5_H
        movf    TMR5L, w
        movwf   Timer5_L

но необходимость вводить это зачитывание в процедуру обработки прерываний доставляет неудобства, как "эстетического" так и функционального характера. Да и разобраться охота - модуль "Motion Feedback" ведь для того и нужен, чтобы считать до 16-и бит автоматически!!?
Или я чего-то недопонял???

С уважением!
volodya
TMR5H заполняется после чтения TMR5L на аппаратном уровне. В вашем случае возможно не корректное считывание значения TMR5 регистра. Вернее будет изменить порядок
Код
        movf    TMR5L, w
        movwf   Timer5_L
        movf    TMR5H, w
        movwf   Timer5_H
d_dr
Спасибо за ответ!

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

НО! это все как раз и есть программное ("ручное") зачитывание значений таймера, я же хочу заставить работать надлежащим образом аппаратную запись этого значения в буфер "CAPхBUF" - то есть так, как обещает "datasheet" на 18F4431, (конкретно "Motion Feedback Module (MFM)" раздел "17.1.4 INPUT CAPTURE ON STATE CHANGE")! Т.е. при каждом изменении состояний входов "CAPх" значение таймера (оба байта) записываются в соотв. буфер CAPхBUF (high & low), таймер обнуляется и считает заново - и все это аппаратно!

Как уже сказано, исходный код с минимальными переделками (просто выбросил коммуникацию с внешним "терминалом") дает такой же результат: верхний байт "CAPхBUFH" все время равен нулю - хотя дальнейшая программа предусматривает мат. операции с 16-ю битами..??? - Что это? Разводка программиста исходника (врядли)??? Мое кардинальное недопонимание работы процессора? Или где-то чего-то недочитал в datasheet-е???
Может кто-то сталкивался уже?

Спасибо за внимание!

PS

Читал тут на форуме, что MPLAB может неправильно отображать состояния - проверка "в железе" показывает, что MPLAB работает штатно...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.