SapegoAL 0 16 апреля, 2014 Опубликовано 16 апреля, 2014 · Жалоба Пытаюсь мерить период сигнала на 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) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 апреля, 2014 Опубликовано 16 апреля, 2014 · Жалоба Возможно ли что у меня как-то тактовая плавает? Потому, что погрешность при измерении сигнала разной частоты в процентном соотношении сопоставима. Конечно плавает. Точнее в тактовой частоте присутствует большой джиттер. Связано это с особенностями функционированием DCO и FLL. Если хочется стабильности, то следует тактировать таймер от встроенного или внешнего кварцевого генератора напрямую, без использования FLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 16 апреля, 2014 Опубликовано 16 апреля, 2014 · Жалоба Спасибо большое за ответ. Уважаемый rezident, поясните мне пожалуйста несколько моментов, если не затруднит. А то я читаю, но пока в голове тёмный лес. Изделие работает, остался лишь этот хомут. В моём процессоре, насколько я видел, нет возможности установить обычный кварц. Поэтому этот момент отпадает. Из остальных источников остался только DCO, насколько я понимаю. А там таже FLL. И как выйти из этого положения? Если Вы говорите, что причина лишь в джитере, то могу ли я умножить частоту значительно больше, а потом поделить, например на 4? Либо мне запускать чистый DCO. Другой таймер запустить от кварца и расчитывать текущую частоту DCO относительно частоты кварца. И это значение применять в расчётах? Заранее благодарю за ответ. :tort: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 апреля, 2014 Опубликовано 16 апреля, 2014 · Жалоба В моём процессоре, насколько я видел, нет возможности установить обычный кварц. Поэтому этот момент отпадает. Можно поставить внешний кварцевый генератор (осциллятор) и подать частоту с него на вход 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 для/при синхронизации) использовать нельзя. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 16 апреля, 2014 Опубликовано 16 апреля, 2014 · Жалоба Чтобы избежать джиттера нужно работать только на крайних значениях модулятора (max в регистре модулятора) DCO. Синхронизацию FLL от внешнего источника (32кГц) по этой же причине (изменение значения регистра модулятора DCO для/при синхронизации) использовать нельзя. В доке на свой контроллер я нашёл необходимые значения для нужной мне частоты. Я думаю что я запущу один таймер на ACLK который запрограммирую от часового кварца (XTAL1CLK), а остальные частоты пущу от DCO CLK (3,31). В фоновом режиме буду рассчитывать частоту DCO относительно моего часового кварца. Рассчитанное значение буду использовать в расчётах. Читаю читаю - весь мозг уже сломал. Не могу въехать как мне запрограммировать UCS. Не въезжаю как. Как мне запустить DCO без синхронизации от XTAL1CLK? Может подскажете, будете так любезны. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
rezident 0 16 апреля, 2014 Опубликовано 16 апреля, 2014 · Жалоба Читаю читаю - весь мозг уже сломал. Не могу въехать как мне запрограммировать UCS. Не въезжаю как. Как мне запустить DCO без синхронизации от XTAL1CLK? Аппаратное управление FLL регистра модулятора UCSCTL0 отключается установкой бита DISMOD в регистре UCSCTL1. При этом регистр модулятора DCO (UCSCTL0) будет управляться только программно. Только еще раз повторяю, что это вам не сильно поможет, если бы будете для модулятора использовать значения отличающиеся от MOD = 0x1F. Подстройка частоты генерации только с помощью DCORSEL (UCSCTL1) дает изменение частоты DCOCLK примерно вдвое. Подстройка с помощью битов DCO (UCSCTL0) изменяет частоту DCOCLK примерно на 10%. Если вас такая точность устроит, то пробуйте. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SapegoAL 0 17 апреля, 2014 Опубликовано 17 апреля, 2014 · Жалоба В принципе меня это устроит. Мне не надо менять частоту. Мне надо просто знать эту частоту, для того чтобы рассчитывать относительно неё другие параметры. Например частоту измеряемого сигнала и частоту USART. За ответы Вам спасибо. Возникли также проблемы со встроенным ADC SD24B. При прогоне в термошкафе наблюдается инструментальная погрешность. Причём линейность не уходит, а плывёт ноль, как я понимаю. Поскольку это лишь одно из группы изделий, а мы находимся накануне сертификации, то решено остановить данную разработку. Все остальные изделия на базе stm32f. Так получилось, что на этих изделиях никаких проблем не вылезло. Думаю, что сказалось незнание мной процессора MSP и отсутствие опыта работы с ним. С наскока, увы, не получилось ... Впрочем, как обычно ... )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться