Перейти к содержанию
    

Измерение периода сигнала

Пытаюсь мерить период сигнала на MSP430f6736. Процессор затактирован от 32768 с умножителем 610.

Сигнал измеряю захватом таймера 3. К сигналу претензий нет. Получается разброс ~ 3%. Вроде как сам таймер примитивный до ужаса и никаких не вижу подводных камней. Кто может что подсказать? Возможно ли что у меня как-то тактовая плавает? Потому, что погрешность при измерении сигнала разной частоты в процентном соотношении сопоставима.

PS: Инициализирую так. (Нашёл в примерах)

  // Выбор источников тактового сигнала и настройка 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)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Возможно ли что у меня как-то тактовая плавает? Потому, что погрешность при измерении сигнала разной частоты в процентном соотношении сопоставима.

Конечно плавает. Точнее в тактовой частоте присутствует большой джиттер. Связано это с особенностями функционированием DCO и FLL. Если хочется стабильности, то следует тактировать таймер от встроенного или внешнего кварцевого генератора напрямую, без использования FLL.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Спасибо большое за ответ.

Уважаемый rezident, поясните мне пожалуйста несколько моментов, если не затруднит. А то я читаю, но пока в голове тёмный лес. Изделие работает, остался лишь этот хомут.

В моём процессоре, насколько я видел, нет возможности установить обычный кварц. Поэтому этот момент отпадает. Из остальных источников остался только DCO, насколько я понимаю.

А там таже FLL. И как выйти из этого положения?

Если Вы говорите, что причина лишь в джитере, то могу ли я умножить частоту значительно больше, а потом поделить, например на 4?

Либо мне запускать чистый DCO. Другой таймер запустить от кварца и расчитывать текущую частоту DCO относительно частоты кварца. И это значение применять в расчётах?

Заранее благодарю за ответ. :tort:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В моём процессоре, насколько я видел, нет возможности установить обычный кварц. Поэтому этот момент отпадает.

Можно поставить внешний кварцевый генератор (осциллятор) и подать частоту с него на вход TAxCLK. Для целей энергосбережения нужно использовать осциллятор с входом выключения генератора.

Если Вы говорите, что причина лишь в джитере, то могу ли я умножить частоту значительно больше, а потом поделить, например на 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 для/при синхронизации) использовать нельзя.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Чтобы избежать джиттера нужно работать только на крайних значениях модулятора (max в регистре модулятора) DCO. Синхронизацию FLL от внешнего источника (32кГц) по этой же причине (изменение значения регистра модулятора DCO для/при синхронизации) использовать нельзя.

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

Читаю читаю - весь мозг уже сломал. Не могу въехать как мне запрограммировать UCS. Не въезжаю как. Как мне запустить DCO без синхронизации от XTAL1CLK?

 

Может подскажете, будете так любезны.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Читаю читаю - весь мозг уже сломал. Не могу въехать как мне запрограммировать UCS. Не въезжаю как. Как мне запустить DCO без синхронизации от XTAL1CLK?

Аппаратное управление FLL регистра модулятора UCSCTL0 отключается установкой бита DISMOD в регистре UCSCTL1. При этом регистр модулятора DCO (UCSCTL0) будет управляться только программно.

Только еще раз повторяю, что это вам не сильно поможет, если бы будете для модулятора использовать значения отличающиеся от MOD = 0x1F. Подстройка частоты генерации только с помощью DCORSEL (UCSCTL1) дает изменение частоты DCOCLK примерно вдвое. Подстройка с помощью битов DCO (UCSCTL0) изменяет частоту DCOCLK примерно на 10%. Если вас такая точность устроит, то пробуйте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В принципе меня это устроит. Мне не надо менять частоту. Мне надо просто знать эту частоту, для того чтобы рассчитывать относительно неё другие параметры. Например частоту измеряемого сигнала и частоту USART.

За ответы Вам спасибо. Возникли также проблемы со встроенным ADC SD24B. При прогоне в термошкафе наблюдается инструментальная погрешность. Причём линейность не уходит, а плывёт ноль, как я понимаю. Поскольку это лишь одно из группы изделий, а мы находимся накануне сертификации, то решено остановить данную разработку. Все остальные изделия на базе stm32f. Так получилось, что на этих изделиях никаких проблем не вылезло.

Думаю, что сказалось незнание мной процессора MSP и отсутствие опыта работы с ним. С наскока, увы, не получилось ... Впрочем, как обычно ... ))

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...