Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение периода сигнала
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
SasaVitebsk
Пытаюсь мерить период сигнала на MSP430f6736. Процессор затактирован от 32768 с умножителем 610.
Сигнал измеряю захватом таймера 3. К сигналу претензий нет. Получается разброс ~ 3%. Вроде как сам таймер примитивный до ужаса и никаких не вижу подводных камней. Кто может что подсказать? Возможно ли что у меня как-то тактовая плавает? Потому, что погрешность при измерении сигнала разной частоты в процентном соотношении сопоставима.
PS: Инициализирую так. (Нашёл в примерах)
CODE
// Выбор источников тактового сигнала и настройка PLL
#if DCOCLK <= 8000 //Set VCore = 0 for 8MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 0);
#elif DCOCLK <= 12000 //Set VCore = 1 for 12MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 1);
#elif DCOCLK <= 20000 //Set VCore = 2 for 20MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 1);
#else //Set VCore = 3 for 25MHz clock
PMM_setVCore(__MSP430_BASEADDRESS_PMM__, 3);
#endif
//Initializes the XT1 crystal oscillator with no timeout
UCS_LFXT1Start(__MSP430_BASEADDRESS_UCS__, UCS_XT1_DRIVE0, UCS_XCAP_3);
//Set DCO FLL reference = REFO
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_FLLREF, 0, UCS_CLOCK_DIVIDER_1);
//Set ACLK = REFO
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_ACLK, 0, UCS_CLOCK_DIVIDER_1);
//Set Ratio and Desired MCLK Frequency and initialize DCO
UCS_initFLLSettle(__MSP430_BASEADDRESS_UCS__, DCOCLK, MPLL);
//Set MCLK = REF3 (DCO)
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_MCLK, 3, UCS_CLOCK_DIVIDER_1);
//Set SMCLK = REF3 (DCO)
UCS_clockSignalInit(__MSP430_BASEADDRESS_UCS__, UCS_SMCLK, 3, UCS_CLOCK_DIVIDER_1);
// Enable global oscillator fault flag
SFR_enableInterrupt(__MSP430_BASEADDRESS_SFR__, SFR_OSCILLATOR_FAULT_INTERRUPT);
// Enable global interrupt


PPS: Может кто-нибудь приведёт пример инициализации, гарантировано работающей в принципе на любой частоте порядка 20 МГц? (14-24)
rezident
Цитата(SasaVitebsk @ Apr 16 2014, 12:34) *
Возможно ли что у меня как-то тактовая плавает? Потому, что погрешность при измерении сигнала разной частоты в процентном соотношении сопоставима.

Конечно плавает. Точнее в тактовой частоте присутствует большой джиттер. Связано это с особенностями функционированием DCO и FLL. Если хочется стабильности, то следует тактировать таймер от встроенного или внешнего кварцевого генератора напрямую, без использования FLL.
SasaVitebsk
Спасибо большое за ответ.
Уважаемый rezident, поясните мне пожалуйста несколько моментов, если не затруднит. А то я читаю, но пока в голове тёмный лес. Изделие работает, остался лишь этот хомут.
В моём процессоре, насколько я видел, нет возможности установить обычный кварц. Поэтому этот момент отпадает. Из остальных источников остался только DCO, насколько я понимаю.
А там таже FLL. И как выйти из этого положения?
Если Вы говорите, что причина лишь в джитере, то могу ли я умножить частоту значительно больше, а потом поделить, например на 4?
Либо мне запускать чистый DCO. Другой таймер запустить от кварца и расчитывать текущую частоту DCO относительно частоты кварца. И это значение применять в расчётах?
Заранее благодарю за ответ. tort.gif
rezident
Цитата(SasaVitebsk @ Apr 16 2014, 16:10) *
В моём процессоре, насколько я видел, нет возможности установить обычный кварц. Поэтому этот момент отпадает.

Можно поставить внешний кварцевый генератор (осциллятор) и подать частоту с него на вход TAxCLK. Для целей энергосбережения нужно использовать осциллятор с входом выключения генератора.
Цитата(SasaVitebsk @ Apr 16 2014, 16:10) *
Если Вы говорите, что причина лишь в джитере, то могу ли я умножить частоту значительно больше, а потом поделить, например на 4?
Либо мне запускать чистый DCO.

Причина не в частоте DCO, а принципе работы его модулятора. Модулятор работает пропуская/вставляя импульсы тактовой DCO. Отсюда и возникает джиттер, величина которого определяется длительностью вставленных/пропущенных тактовых импульсов DCO. См. раздел 5.2 UCS Operation в MSP430x5xx and MSP430x6xx Family User's Guide (Rev. M)
Цитата
The five MOD bits switch between the frequency selected by the DCO bits and the next-higher
frequency set by {DCO + 1}. When DCO = {31}, the MOD bits have no effect, because the DCO is
already at the highest setting for the selected DCORSEL range.

Чтобы избежать джиттера нужно работать только на крайних значениях модулятора (max в регистре модулятора) DCO. Синхронизацию FLL от внешнего источника (32кГц) по этой же причине (изменение значения регистра модулятора DCO для/при синхронизации) использовать нельзя.
SasaVitebsk
Цитата(rezident @ Apr 16 2014, 14:44) *
Чтобы избежать джиттера нужно работать только на крайних значениях модулятора (max в регистре модулятора) DCO. Синхронизацию FLL от внешнего источника (32кГц) по этой же причине (изменение значения регистра модулятора DCO для/при синхронизации) использовать нельзя.

В доке на свой контроллер я нашёл необходимые значения для нужной мне частоты. Я думаю что я запущу один таймер на ACLK который запрограммирую от часового кварца (XTAL1CLK), а остальные частоты пущу от DCO CLK (3,31). В фоновом режиме буду рассчитывать частоту DCO относительно моего часового кварца. Рассчитанное значение буду использовать в расчётах.
Читаю читаю - весь мозг уже сломал. Не могу въехать как мне запрограммировать UCS. Не въезжаю как. Как мне запустить DCO без синхронизации от XTAL1CLK?

Может подскажете, будете так любезны.
rezident
Цитата(SasaVitebsk @ Apr 16 2014, 17:52) *
Читаю читаю - весь мозг уже сломал. Не могу въехать как мне запрограммировать UCS. Не въезжаю как. Как мне запустить DCO без синхронизации от XTAL1CLK?

Аппаратное управление FLL регистра модулятора UCSCTL0 отключается установкой бита DISMOD в регистре UCSCTL1. При этом регистр модулятора DCO (UCSCTL0) будет управляться только программно.
Только еще раз повторяю, что это вам не сильно поможет, если бы будете для модулятора использовать значения отличающиеся от MOD = 0x1F. Подстройка частоты генерации только с помощью DCORSEL (UCSCTL1) дает изменение частоты DCOCLK примерно вдвое. Подстройка с помощью битов DCO (UCSCTL0) изменяет частоту DCOCLK примерно на 10%. Если вас такая точность устроит, то пробуйте.
SasaVitebsk
В принципе меня это устроит. Мне не надо менять частоту. Мне надо просто знать эту частоту, для того чтобы рассчитывать относительно неё другие параметры. Например частоту измеряемого сигнала и частоту USART.
За ответы Вам спасибо. Возникли также проблемы со встроенным ADC SD24B. При прогоне в термошкафе наблюдается инструментальная погрешность. Причём линейность не уходит, а плывёт ноль, как я понимаю. Поскольку это лишь одно из группы изделий, а мы находимся накануне сертификации, то решено остановить данную разработку. Все остальные изделия на базе stm32f. Так получилось, что на этих изделиях никаких проблем не вылезло.
Думаю, что сказалось незнание мной процессора MSP и отсутствие опыта работы с ним. С наскока, увы, не получилось ... Впрочем, как обычно ... ))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.