Генератор-частотомер на msp430

Генератор-частотомер на MSP430

Хочу предложить несложный, но очень полезный в радиолюбительской практике прибор. Он сочетает в себе генератор и частотомер.

Прибор имеет следующие характеристики:

Генератор: генерируемая частота в низкочастотном диапазоне 0-15000 Гц с дискретностью 0.0005 Гц генерируемая частота в высокочастотном диапазоне 0-4000000 Гц с дискретностью 0.03 Гц амплитуда выходного сигнала 3В Максимальный выходной ток 300мА

форма сигнала: синус треугольник меандр.

Частотомер:
измеряемый диапазон 0.01Гц-25МГц.
точность измерения в диапазоне 1Гц-1МГц 0.01Гц
точность измерения в диапазоне 1МГц-25МГц 1Гц
чувствительность не хуже 500мВ

В качестве ядра прибора выступает микроконтроллер MSP430F147 (может быть без проблем и изменения кода заменен на любой из следующих микроконтроллеров MSP430F133 MSP430F135 MSP430F148 MSP430F149). В качестве экрана используется экран от Nokia 1202 с программной реализацией интерфейса SPI.

В роли генератора используется широко известный генератор прямого цифрового синтеза AD9833 от Analog Device. Контроллер использует два источника тактирования: от высокочастотного кварца на 8МГц и часового кварца 32768Гц.

Благодаря возможности буферизирования тактовых частот на ногах ввода-вывода появляется возможность переключения тактовой частоты генератора AD9833, что позволяет получить низкочастотный генератор в высокой разрешающей способностью, так и высокочастотный генератор.

Для увеличения выходной мощности генератора и увеличения амплитуды выходного сигнала используется операционный усилитель AD8397. Схема устройства приведена на рисунке.

Частотомер до 1МГц выполнен на хорошо себя зарекомендовавшем принципе временных ворот в котором начало и конец временных ворот формируются фронтами измеряемого сигнала. Точность в этом случае определяется точностью тактовой частоты. Наличие асинхронного таймера в контроллере позволяет измерять частоты выше тактовой.

Хотя в даташите на микроконтроллер и указана максимальная частота на входе INCLK таймера 10МГц это дает основание предположить, что частота на входной ноге INCLK может быть асинхронна и выше тактовой. Дальнейшая проверка это подтвердила. Если в методе временных ворот частота оказалась выше 1МГЦ, то частотомер автоматически переключается на метод подсчета измеряемых импульсов за 1с.

На экране это видно по обнуленным разрядам измеряемой частоты после запятой.

На рисунке показан принцип измерения частоты методом временных ворот формируемых входной частотой.

В микроконтроллере настраиваются два таймера. Один тактируется от высокочастотного кварца 8МГц, а второй тактируется от внешнего входа INCLK. Оба находятся в режиме стоп. На первом этапе программа стоит пока на ножке INCLK высокий уровень.

На втором этапе как только он сменяется низким уровнем то программ опять останавливается до появления фронта сигнала.

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

В прерываниях инкрементируются переменные для расширения разрядности счетчиков. После включения таймеров стартует задержка на 1 секунду. (величина задержки не критична, но естественно влияет на точность измерения)

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

Измеряемая частота находится по формуле число импульсов измеряемой частоты*тактовую частоту/число импульсов тактовой частоты насчитанных за время задержки.

Так как мы ловили фронты входного измеряемого сигнала то их число за период измерения всегда целое, а точность определяется точностью тактовой частоты. Этот принцип позволяет мерить как низкочастотные так и высокочастотные сигналы.

Захватывать фронт входного сигнала можно несколькими способами: 1. Использовать прерывание по фронту входного сигнала и в прерывании стартовать и останавливать таймеры. Погрешность вноситься за счет того что требуется время на вход в прерывание.

Так же возможна ситуация, что прерывание вызовется в момент переполнения счетчика таймера измеряемой частоты, что также приведет к дополнительной ошибке измерения. 2. Использовать режим захвата при котором фронт входного сигнала приводит к захвату текущего значения таймера, переносу его в регистр захвата и вызову прерывания.

Ошибка измерения может быть вызвана теми же причинами, что и в пункте 1. 3. Программный опрос входного сигнала на предмет обнаружения фронта.

В процессе реализации прибора были опробованы все три метода и наибольшую точность показал метод номер 3.

В качестве входного каскада используется транзисторный каскад, лучше я ни чего не придумал и это открывает простор для творчества желающим улучшить конструкцию.Более того с одного из входом измеряемая частота идет резистор в 100 Ом на вход контроллера, для подачи измеряемой частоты ТТЛ уровня.

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

В качестве разъема входа в частотомер применен джек с переключающимися входами. При неиспользуемом входе частотомера его вход подключен к выходу генератора.

Управление прибором осуществляется от четырех кнопок. Кнопки осуществляют передвижение курсора по экрану. Кнопки вверх и вниз осуществляют изменение соответствующей позиции на которой установлен курсор. Текущий элемент выделяется инвертированным цветом.

Частотный диапазон генератора переключается когда курсор стоит на символе LF (в случае низкочастотного генератора) или меняется на HF (в случае высокочастотного сигнала).

Форма генерируемого сигнала меняется при нахождении курсора на символе меандра вверху справа (меняется на символ синуса или треугольника).

Важно помнить, что хотя все позиции в выбираемой частоте генератора являются числами от 0 до 9, частота в режиме низкой частоты не может превышать 15кГц и 4МГц в режиме высокой частоты, что определяется требованиями генератора AD9833.

Настройка прибора заключается в следующем:
Так как величина частоты генератора AD9833 рассчитывается относительно тактовой и точность измерения частотомера тоже зависит от тактовой частоты, то необходимо измерить частоту высшего высокочастотного кварца и низкочастотного кварца на любом частотомере. Частоту можно взять с ножки тактирования генератора AD9833 в режиме генератора HF и LF. Эти частоты необходимо записать в программе.

Важно в опциях проекта IAR при компилировании выставить следующие настройки оптимизации

Также требуется настройка переменными резисторами величины смещения входа операционного усилителя и коэффициента усиления.

Для регулировки необходимо подключить выход генератора к осциллографу и наблюдая форму выходного сигнала генератора в режиме синусоиды, отрегулировать максимальную амплитуду выходного сигнала при отсутствии искажения его формы (обрезание верхней или нижней полуволны).  Выходной сигнал смещен относительно 0 на 1.5В вверх.

Плата на одностороннем текстолите. Плата для экрана тоже и распаяна на шлейф экрана.

Список радиоэлементов

Скачать список элементов (PDF)

Прикрепленные файлы:

  • FmetGenAD9833.zip (67 Кб)
  • GF.lay (78 Кб)
  • Nokia1202.lay (9 Кб)

Источник: http://cxem.net/izmer/izmer125.php

бЛог инженера

Итак, насколько точные часы (тактовый сигнал) нужны для работы УАПП (UART)? Сперва посмотрим на идеальную пару часов, которые работают на одной и той же частоте.

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

Быстрые часы аналогично будут спешить, пока не посчитаем один и тот же бит дважды. Заранее неизвестно, спешат часы или отстают, имеет смысл считывать значение бита в середине такта, это даст немного времени до того, как возникнет ошибка.

Посмотрим на график слева, изображающий часы, которые отличаются всего на 6%, легко заметить, когда появится первая проблема — полностью пропущен бит 9! Используя эти часы, мы не сможем переслать даже один кадр данных! (Кстати, этот тип ошибки передачи данных классифицируется как ошибка ошибка кадра!).

Мой выбор 6% для этого графика неслучаен; такие ошибки указаны в характеристиках msp430 для калиброванной тактовой частоты (заметьте, калиброванной, а не просто основной!), плюс возможное отклонение 3% при воздействии температуры и других возможных факторов (сильно влияет напряжение питания и его стабильность. прим.перев.

) Если мы будем использовать калиброванный тактовый сигнал в качестве часов для отправителя и получателя, мы могли бы получить реальную ошибку в 6%, что сделало бы нашу передачу по УАПП (UART) абсолютно ненадёжной!

На самом деле не всё так печально, так как этот случай — наихудший сценарий, и вероятно, что часы в вашем компьютере (если вы хотите его использовать для общения его вместо другого msp430) более точны.

В общей сложности отклонения в 5% между часами в среднем приводят к ошибке кадра на 11 бите, 4% отклонения — на 13 бите, так что у нас пока отклонение вполне допустимо для того, чтобы в короткий промежуток между кадрами можно было «синхронизироваться» для продолжения общения по протоколу.

Обратите внимание, это означает, что мы ограничены размером буфера для надёжной связи, и наша фактическая скорость передачи данных будет намного меньше, так как нам нужно будет восстановление между кадрами. Если вы хотите быструю связь, — необходимы очень точные часы!

Кварцевые генераторы

Лучший вариант повысить точность часов — использование кристаллов (кварцевых резонаторов, или просто кварцев).

Часовой кристалл (кварц), который поставляется с лончпадом, достаточно точный в широком диапазоне температуры, до 20ppm (0,002%)! Однако есть у него и определённые недостатки — кристаллу нужно некоторое время, чтобы стабилизироваться, так же он потребляет некоторое количество энергии.

Кроме того, на частоте 32 768 Гц мы не сможем достичь высокой скорости передачи. Обычно нам нужно около 16 тактов на бит, чтобы точно определить стартовый бит и начать отбор битов точно в середине каждого.

Используя это правило, самая высокая скорость передачи, которую мы могли бы достичь с часовым кристаллом (кварцем) — это 2048 бод. Большие микроконтроллеры msp430 позволяют установку высокочастотных кварцевых резонаторов, но несовместимы с Launchpad серий G2xx. Однако, если мы будем аккуратны, вполне возможно получить скорость  передачи данных до 9600 бод и с часовым кварцем.

Пайка кристалла к вашему launchpad может показаться сложной задачей, однако это на самом деле не так уж и трудно сделать. Немного терпения (и небольшого кусочка липкой ленты — скотча) — это всё что нужно.

Ну это кроме паяльника и припоя, конечно. Если вы ещё не установили кристалл на ваш launchpad и хотите это сделать, то есть ряд хороших демонстраций техники пайки кристаллов на плату, доступных на YouTube.

На данный момент я буду считать, что вы уже успешно припаяли кристалл.

Вы могли заметить несколько пустых мест около кристалла для конденсаторов. Для кристалла (кварца) чтобы работать на правильной частоте необходима определённая ёмкость на землю. Если ёмкости не будет, колебания могут не работать, или кристалл не заработает вообще.

Кристалл (кварц), включённый в комплект launchpad, требует ёмкость 12,5 пФ. На входах msp430 для кристалла уже есть конденсаторы, которые можно выбирать самостоятельно. Пользователь может выбрать из 1, 6, 10 и 12,5 пФ, в зависимости от указанной на кристалле ёмкости. (По умолчанию включены 6пФ).

Выбор ёмкости осуществляется установкой двух битов XCAPx регистра BCSCTL3.

Если по каким-то причинам вам нужны ёмкости кроме одной из этих, вы можете припаять другие конденсаторы к контактным площадкам на внешней стороне. К сожалению это не так просто, как установить конденсаторы 12,5пФ; параллельно с конденсаторами будет ещё и сам чип. Формула для расчёта правильной ёмкости нагрузочных конденсаторов: C1 = C2 = 2 * C_Load — (Cp + Ci), где

C_Load — ёмкость, обозначенная на кристалле (кварце),

Cp — любые паразитные ёмкости (например дорожек платы),

Ci — внутренняя ёмкость msp430.

Последние два слагаемых могут быть установлены битами XCAPx. Так, кристалл, который требует 18пФ, придётся установить на плату конденсаторы ёмкостью 30пФ (используя внутреннюю ёмкость по-умолчанию на 6пФ).

В большинстве случаев использования кристаллов устанавливают значения по-умолчанию в модуле BCS+. Чтобы использовать поддерживаемый кристалл, вам реально нужно только две строчки:
BCSCTL3 | = XCAP_3 // 12,5 пФ для кварца LaunchPad

__delay_cycles (55000) // задержка для стабилизации колебаний кварца

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

Как долго на самом деле необходимо ждать? Обычно нужно несколько сотен миллисекунд. В приведённом примере задержка — 55000 тактов; по умолчанию тактовый генератор работает на частоте около 1,1Мгц — это составляет примерно 50 миллисекунд.

В зависимости от вашего приложения при необходимости можно сделать задержку больше.

Самокалибровка внутреннего генератора

Если вы обратили внимание, то возможно заметили ещё одну проблему при использовании часового кварца: Какой частоты сигнал тактового генератора может быть получен от кристалла? 9600 бод — это 3,41 тактовых циклов.

1200 бод использует больше тактов, поэтому эта скорость более надёжна, но она по-прежнему составляет 27,31 тактов. Ближайший делитель — это 27 тактов, которое соответствовало бы 1213,6 бод с погрешностью 1,1%.

Кажется, что мы потеряли в точности, используя кварцевый резонатор! Существуют резонаторы, делители для которых составляют отличные стандартные скорости. Для 7,3728МГц кристалл, например, выходит 768 на бит для 9600 бод.

Если вы используете контроллер msp430 с высокочастотным кварцевым резонатором, это отличный выбор для соединения по последовательному интерфейсу на стандартных скоростях. Другой вариант — это использование внутреннего тактового генератора.

Но, погодите-ка, мы ведь утверждали, что погрешность калиброванных значений внутреннего тактового генератора слишком высока,чтобы её применять? Да, это так, но в определённых случаях мы можем сделать её меньше.

С одной стороны, погрешности, указанные в технической документации, охватывают весь диапазон температуры, при котором msp430 может работать, а это — от -40°С до +85, и весь диапазон напряжений, при которых сохраняется стабильная работа, — это от 1,8 до 3,6В. Как правило, мы не будем достигать таких крайностей.

Даже если и так, то пока температура и напряжение питания достаточно стабильны и не собираются меняться слишком сильно во время работы, то можно откалибровать внутренний тактовый генератор в этой конкретной конфигурации! В итоге погрешность генератора будет намного лучше, чем указанные 3%; В даташите указано, что уже при диапазоне температур от 0 до 85°, калибровка соответствует 0,5% отклонений при питании от 3В.  (Очевидно, что стабильное напряжение питания — это ключ к стабильности тактового генератора).

Калибровка внутреннего тактового генератора достаточно проста, но процесс требует точных часов для сравнения частоты, это как раз работа для кварцевого резонатора. Идея очень проста — использовать резонатор для задания точного временного интервала (к примеру — 1 с).

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

Тогда мы сохраним значения для DCOCTL и BCSCTL, и у нас будет точная калибровка наших часов! Вот как происходит такое волшебство:
void Set_DCO(unsigned int Delta) { // Установка DCO на выбранную частоту unsigned int Compare, Oldcapture = 0; BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8 TACCTL0 = CM_1 + CCIS_1 + CAP; // CAP, ACLK TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, режим непрерывного счёта, очистка while (1) { while (!(CCIFG & TACCTL0)); // Ждём захвата TACCTL0 &= ~CCIFG; // Захват произошёл, сброс флага Compare = TACCR0; // получение текущего значения SMCLK Compare = Compare – Oldcapture; // разница SMCLK Oldcapture = TACCR0; // Сохраняем текущее значение SMCLK if (Delta == Compare) break ; // Если совпадают, – выходим “while(1)” else if (Delta < Compare) { DCOCTL--; // DCO слишком быстр, уменьшаем if (DCOCTL == 0xFF) if (BCSCTL1 & 0x0f) BCSCTL1--; // уменьшаем RSEL } else { DCOCTL++; // DCO слишком медленный, увеличиваем if (DCOCTL == 0x00) if ((BCSCTL1 & 0x0f) != 0x0f) BCSCTL1++; // Увеличиваем RSEL } } TACCTL0 = 0; // Останавливаем TACCR0 TACTL = 0; // Остановка таймера_A BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK }

Этот код пришёл из dco_flashcal.c — пример кода, имеющегося на большинстве девайсов msp430. Файла примера кода для устройств g2xx1 кажется не было, поэтому я скопировал его из примеров для серии F21x2, изменив TACCTL2 на TACCTL0 для совместимости с launchpad.

Это немного кода для разбора, но всё оказывается очень просто. ACLK настраивается на использование часового кварца, с делителем на 8 — это 4096Гц. Таймер устанавливается в режим захвата, срабатывая по отпусканию CCI0B. (Из документации на G2231 или G2211 это соответствует ACLK).

Если это условие кажется запутанным, посмотрите урок по измерителю ёмкости, в котором использовался режим захвата.) Таймер работает SMCLK, источником для него — внутренний тактовый генератор (DCO). Если мы хотим откалибровать 2МГц, то в один тактовый цикл ACLK мы ожидаем, что получим 2МГц / 4096 = 488,3Гц (циклов).

Мы передаём значение 488 процедуре, которая запускает часы и таймер. Когда происходит захват, она проверяет, больше или меньше количество циклов SMCLK прошло, и соответственно регулирует DCO и RSEL регистры. Эта процедура повторяется, пока не найдётся конфигурация, которая возвращает только 488 циклов в интервале времени.

Значения в регистрах DCO и RSEL, которые затем получаются калибровочными, и мы хотим сохранить, мы просто берём из регистров DCO и BCSCTL1, сохраняя их значения для дальнейшего использования.

Эта процедура используется в примере DCOcalibrate.c Попробуйте его (конечно же, с припаянным кристаллом), и посмотрите, какие значения получаются для DCOCTL, BCSCTL1, для каждой частоты при калибровке. Если вам посчастливилось иметь осциллограф, измерьте их на выходе P1.4, чтобы убедиться в их верности.

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

) Вы можете сохранить их для следующих уроков, в следующий раз мы кратко рассмотрим, как записать во флэш-память msp430, так чтобы потом можно было это использовать.

Упражнение для читателя:

  • Насколько хорошо выполнена калибровка на заводе? Измените код программы, чтобы найти калибровочные значения для частоты 1МГц. Как они соотносятся со значениями, хранящимися в CALDCO_1MHZ и CALBC1_1MHZ? Похоже, что у многих читателей калибровка на 1МГц с завода, по крайней мере для ранних экземпляров msp430, ближе к 980 кГц.
  • Насколько сильно изменение температуры влияет на результат? Поместите launchpad на какое-то время в тёплое место, или наоборот, в холодильник; лучше бы, конечно в морозильник, но есть опасность образования конденсата! Затем повторно выполните код программы. Насколько отличаются калибровочные значения?
  • Возможно ли пойти в обратном направлении калиброванную частоту, — для измерения частоты кварцевого резонатора? Проведите эксперимент, чтобы посмотреть, как настройки XCAPx могут влиять на кварц. При каких из них происходят колебания? Как изменится частота, если использовать 10пФ вместо 12,5 пФ? Не забывайте, вы можете написать программу, чтобы узнать это!

Дополнение к уроку:

Как я уже писал, я начал думать о том, как бы мне проверить мои высказывания, обсуждаемые в уроках, о необходимости точных часов в UART. Недавно я приобрёл логический анализатор, который очень быстро оказался весьма полезным моим интрументом! Вероятно я использую его в ближайшее время, пытаясь разобрать и отладить некоторые из моих проектов, над которыми буду работать в конце концов.

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

Четыре канала, показанные здесь, измеряют один и тот же сигнал, красный — в норме (9600), жёлтый — погрешность 3% (фактически — 9888 бод), зелёный — ошибка уже 6% (теоретическая ошибка с использованием двух часов с точностью +/- 3%, эффективно — 10176 бод) и синий канал — 10% ошибки (эфф. 10560 бод).

На второй картинке увеличенное изображение первого символа, на котором можно лучше видеть ошибку кадра. Точка, помещённая на каждый график, показывает в каком месте происходит семплирование каждого потока данных.

При 6% ошибке программа достаточно умна, чтобы декодировать символ, но стоп-бит оказывается пропущен из-за ненадёжной связи. На практике необходимо иметь лучше, чем 5% в сочетании для надёжной связи.

(используя одинаковые системы, каждая из которых имеет часы с точностью лучше 2,5%).

Отметим, что это верно не совсем для всех случаев; здесь я использую кодирование 8N1. Если я использовал бы кадр больше 10 бит, использумых для 8N1, к ошибке кадра могут привести гораздо меньшие ошибки часов. Если вы используете протокол для отправки данных больше 10 бит, вам необходимы более точные часы.

Это был просто интересный небольшой тест, который я провёл, чтобы испытать мой классный логический анализатор.

источник

дополнение

Источник: http://www.shelezyakin.ru/lessons-msp430-lesson-16-in-accurate-clock-clock-ge/

Проекты Altera Quartus II для плат Марсоход, Марсоход2 и Марсоход3

Давно хотел начать разговор про цифро-аналоговое и аналого-цифровое
преобразование, но данная статья не об этом.

В кратце только скажу, что одним из самых доступных для нас методов построения АЦП – промежуточное преобразование измеряемого параметра в частоту. Таким методом мы уже пытались измерять емкость конденсатора в статье “Генератор”.

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

Для отображения результатов измерений , для платы Марсоход был сделан дисплейчик:

и вот он же, снизу:

Он сделан из трех сдвоенных семисегментных индикаторов.Кроме того, для тактирования схемы и как эталон времени,

был использован кварцевый генератор на 100 MHZ.

Принципиальная схема этого шилда:

Пришлось доработать и саму плату, допаять штыречки для pt_left и pt_right, дополнительные штыречки к моторным пинам и разрезать дорожки, чтобы разделить моторные группы на две части.

Принцип работы девайса поясню на фрагменте проекта:

Поступающий на пин DP входной сигнал сразу выводится на два светодиода led[7] и led[6] в прямом и инверсном виде. Это может понадобиться для оценки сигнала, поступившего внутрь чипа.

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

Кроме того сигнал с DP поступает на три последовательно включенных делителя на 2,  и из поделенного в итоге на 8 сигнала, выделяется положительный перепад.

Поскольку наша схема работает от 100MHZ, максимальная частота, которую она может обнаруживать – 50MHZ , таким образом, максимальная частота, которую можно подавать на вход нашего прибора – 400MHZ.

Проект полностью можно посмотреть здесь

Частотомер ( 89985 bytes )

Далее в проекте, количество перепадов подсчитывается шестью декадными счетчиками в течении 8 миллисекунд, таким образом, выводимая на индикатор частота получается в килогерцах.

Для тестов прибора подобрал коллекцию генераторов:

Поскольку максимальная частота в этом наборе 125MHZ, а испытать наш приборчик хотелось на максимальной частоте, пришлось запрограммировать для этой цели отдельный девайс на Cyclone II. Имеющуюся на нем частоту 80MHZ c помощью PLL умножили на 14 и разделили на 3 – получилось 373.(3)MHZ.

Итак, приступаем к испытаниям и первым устанавливаем генератор на 14.318MHZ

Далее по порядку – 24.576MHZ, 33MHZ, 66MHZ , 125.MHZ и от внешнего девайса 373MHZ:

Все эти эксперименты выполнялись при напряжении питания -4В.
Затем мы все повторили при напряжении 2.5В – результат получился аналогичный.

Источник: https://marsohod.org/index.php/projects/104-fmeter

Реализация генератора случайных чисел на микроконтроллере MSP430

76 I компоненты микроконтроллеры

Андрей КУПЧЕНКО

andrey.kupchenko@petrointrade.ru

Введение

В семействе микроконтроллеров MSP430 низкочастотный генератор (VLO, very-low-frequency oscillator) и программно управляемый генератор (DCO, digitally controlled oscillator) являются двумя самостоятельными системами с независимыми источниками тактирования. Поскольку источники тактирования разные, то временную разницу между этими системами можно использовать для получения потока псевдослучайных бит.

Действительно, на один такт осциллятора VL мы всегда получим одинаковое количество осцилляций DC, но поскольку источники тактирования независимы друг от друга, между нарастающим и ниспадающим фронтом VLO количество тактов DCO всегда будет либо четным, либо нечетным, и это непредсказуемо.

Очень важно понимать, что четность этой величины непредсказуема, даже если известно ее предыдущее значение.

Таким образом, мы можем просто отконфигурировать Timer_A для подсчета количества тактов DCO между двумя VLO-фронтами и, выделяя младший бит результата, составить случайное значение любой длины, например 16-разрядное целое.

Итак, устанавливаем таймер 'А' (Timer_A) в режим захвата, источником же основного тактирования SMCLK определяем DCO, он же будет источником импульсов для таймера 'A'. За вспомогательное тактирование ACLK будет отвечать VLO, который одновременно послужит триггером захвата, то есть таймер 'A' считает количество тактов DCO между фронтами VLO. Количество тактов

Реализация генератора случайных чисел

на микроконтроллере MSP430

Для разработчика радиоэлектронных устройств далеко не секрет, что в приложении часто появляется необходимость генерации случайной величины. Как правило, это относится к приложениям, реализующим протоколы передачи данных или криптографические процедуры.

Строго говоря, это далеко не все случаи использования генератора случайных чисел (ГСЧ), но автор не ставит перед собой задачу раскрыть все возможные применения данного генератора.

Мы рассмотрим случай, когда речь идет не о серьезных криптографических применениях, а о необходимости получить относительно случайную величину с хорошим равномерным распределением.

Компания Texas Instruments разработала и предлагает использовать метод генерации псевдослучайных величин, основываясь на особенностях архитектуры микроконтроллеров семейства MSP430.

DCO автоматически сохраняется таймером в регистре захвата/сравнения (CCR). Младший бит регистра (CCR), посредством операции левого сдвига, сохраняем в регистре R12, и так 16 раз, пока получим 16-разрядную псевдослучайную величину.

После вышеизложенных итераций мы хоть и получим случайное число, но оно по-прежнему будет псевдослучайным. В исходном тексте примера есть некоторые особенности, которые позволяют придать нашей функции «дополнительную случайность».

В некотором смысле, мы пытаемся повысить ее энтропию.

Поступим следующим образом:

• После каждой операции выделения младшего бита регистра (CCR) мы поменяем значение регистра BCSCTL1, прибавив к его значению число пять (0x05). Это действие изменит содержимое битов RSEL регистра BCSCTL1, которые отвечают за выбор одного из внутренних резисторов DCO, то есть влияют на частоту DCO.

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

Необходимо оговориться, что для изменения битов RSELx мы могли бы прибавлять к регистру BCSCTL1 любое другое число, но, как показала практика, числа пять вполне достаточно, чтобы обеспечить необходимое отклонение частоты DCO по отношению к VLO.

• Следующий шаг заключается в динамическом изменении значения делителя основного модуля тактирования (биты DIVA). После каждой операции выделения млад-

шего бита регистра (CCR) мы применяем операцию «исключающее ИЛИ» (XOR) к двум младшим битам регистра R12 и битам DIVA, тем самым опять же динамически меняя частоту.

• И, наконец, последняя хитрость: каждый выделенный бит будем записывать в результат (случайную величину) только после пяти циклов выборки, на основании мажоритарной системы, то есть из полученных пяти битов выбираем значение, вошедшее в выборку большее количество раз. Этот ход даст нам более равномерное распределение и, как следствие, позволит данному генератору пройти проверку одним из статических тестов.

Изложенные методы увеличения энтропии действительно позволяют получить более равномерное распределение результатов, но надо понимать, что описанный способ предполагает постоянное внесение изменений в тактовую частоту, что может сильно повлиять на остальные выполняемые микроконтроллером функции. Действительно, если в системе присутствуют участки кода, критичные к времени выполнения, разработчик обязательно должен это учитывать. Несмотря на явные ограничения по использованию подобного метода в критичных ко времени приложениях, мы вполне можем позволить себе сгенерировать псевдослучайную величину или ряд величин еще до запуска основного кода. То есть в самом начале, на этапе инициализации мы генерируем ряд значений, затем сохраняем их и, перенастроив систему тактирования, передаем выполнение основному коду (рисунок).

КОМПОНЕНТЫ И ТЕХНОЛОГИИ • № 3 '2009

микроконтроллеры

Статические испытания

Поскольку известно, что при использовании детерминированных алгоритмов получаемая последовательность является не «чисто» случайной, а псевдослучайной, уместен вопрос: насколько близки эти последовательности по своему поведению к случайным? Для этого предлагалось и применялось множество разнообразных методов статистических испытаний. Один из статических тестов, рекомендованных FIPS (Federal Information Processing Standards), был включен в исходный код генератора случайных чисел. Это так называемый «покер-тест». Приведем краткое описание алгоритма данного теста.

Возьмем поток из 20 000 битов и последовательно разделим его на 5000 четырехбитных сегментов (тетрад). Так как возможно всего 16 вариантов таких сегментов, подсчитаем и запомним количество вхождений в на-

шу последовательность каждого из них и обозначим их как f(i). Применим формулу:

16

v5000у

Еіяоі

V>=o

-5000.

Тест пройден, если 2,16

Источник: https://cyberleninka.ru/article/n/realizatsiya-generatora-sluchaynyh-chisel-na-mikrokontrollere-msp430

Программирование MSP430

В предыдущей статье было приведено преобразователя цвет-частота TCS230  (рисунок 1). Для реализации законченного устройства была разработана печатная плата в основу которой лег микроконтроллер MSP430G2553, схема приведена на рисунке 2. Рисунок 1 — Датчик TCS230

Настоящая книга посвящена однокристальным микроконтроллерам со сверхнизким потреблением семейства MSP430x2xx компании Texas Instruments. Данное руководство представляет собой перевод документа «MSP43Qx2xx Family User’s Guide», выпущенного компанией в 2008 году. В руководстве подробно рассмотрена архитектура ЦПУ…

Книга прекрасного автора Семенова Б.Ю. о микроконтроллерах MSP430 Книга посвящена микроконтроллерам MSP430, которые характеризуются низким потреблением тока и высокой производительностью для разработки автономных малогабаритных приборов с низковольтным батарейным питанием. Описывается архитектура, система команд и…

Для любителей GNU Compiler и MSP430 This manual describes only the setup and basic operation of the MSP430 ™ GCC compiler and the software development environment but does not fully describe the MSP430 GCC…

В предыдущей части Я обещал рассмотреть пример управления скоростью вращения ДПТ с помощью ШИМ. В простейшем случае необходимо собрать схему состоящую из нескольких полупроводниковых элементов и непосредственно самого двигателя. Упрощено данная схема приведена на рисунке 1. Схема силовой части…

Недавно на нашем сайте стартовала серия статей по электроприводу постоянного тока. В них будут описаны основные принципы управления двигателями постоянного тока, а финалом станет создание лабораторного стенда привода постоянного тока с системой подчинённого регулирования….

После того, как мы поморгали светодиодами, разобрались с тактированием и источниками прерываний, пришло время освоить таймер контроллера MSP430G2553. Таймер – это счетный механизм, привязанный к импульсам сигнала тактового генератора. Таймер Timer_A , является 16-ти…

В предыдущей статье, о знакомстве с LaunchPad от TI, мы рассмотрели первые шаги по его программированию. И как я обещал, в этот раз мы рассмотрим систему прерываний и способы тактирования процессора, попробуем запрограммировать контроллер…

Доброго времени суток. Долгое время я завис на контроллерах семейства PIC и программировании на ассемблере. Но один мой знакомый подарил мне LaunchPad от Texas Instruments, c камешком MSP430G2553. И вы не поверите, но моя…

Источник: http://redblot.ru/archives/category/msp

Ссылка на основную публикацию
Adblock
detector
",css:{backgroundColor:"#000",opacity:.6}},container:{block:void 0,tpl:"
"},wrap:void 0,body:void 0,errors:{tpl:"
",autoclose_delay:2e3,ajax_unsuccessful_load:"Error"},openEffect:{type:"fade",speed:400},closeEffect:{type:"fade",speed:400},beforeOpen:n.noop,afterOpen:n.noop,beforeClose:n.noop,afterClose:n.noop,afterLoading:n.noop,afterLoadingOnShow:n.noop,errorLoading:n.noop},o=0,p=n([]),h={isEventOut:function(a,b){var c=!0;return n(a).each(function(){n(b.target).get(0)==n(this).get(0)&&(c=!1),0==n(b.target).closest("HTML",n(this).get(0)).length&&(c=!1)}),c}},q={getParentEl:function(a){var b=n(a);return b.data("arcticmodal")?b:(b=n(a).closest(".arcticmodal-container").data("arcticmodalParentEl"),!!b&&b)},transition:function(a,b,c,d){switch(d=null==d?n.noop:d,c.type){case"fade":"show"==b?a.fadeIn(c.speed,d):a.fadeOut(c.speed,d);break;case"none":"show"==b?a.show():a.hide(),d();}},prepare_body:function(a,b){n(".arcticmodal-close",a.body).unbind("click.arcticmodal").bind("click.arcticmodal",function(){return b.arcticmodal("close"),!1})},init_el:function(d,a){var b=d.data("arcticmodal");if(!b){if(b=a,o++,b.modalID=o,b.overlay.block=n(b.overlay.tpl),b.overlay.block.css(b.overlay.css),b.container.block=n(b.container.tpl),b.body=n(".arcticmodal-container_i2",b.container.block),a.clone?b.body.html(d.clone(!0)):(d.before("
"),b.body.html(d)),q.prepare_body(b,d),b.closeOnOverlayClick&&b.overlay.block.add(b.container.block).click(function(a){h.isEventOut(n(">*",b.body),a)&&d.arcticmodal("close")}),b.container.block.data("arcticmodalParentEl",d),d.data("arcticmodal",b),p=n.merge(p,d),n.proxy(e.show,d)(),"html"==b.type)return d;if(null!=b.ajax.beforeSend){var c=b.ajax.beforeSend;delete b.ajax.beforeSend}if(null!=b.ajax.success){var f=b.ajax.success;delete b.ajax.success}if(null!=b.ajax.error){var g=b.ajax.error;delete b.ajax.error}var j=n.extend(!0,{url:b.url,beforeSend:function(){null==c?b.body.html("
"):c(b,d)},success:function(c){d.trigger("afterLoading"),b.afterLoading(b,d,c),null==f?b.body.html(c):f(b,d,c),q.prepare_body(b,d),d.trigger("afterLoadingOnShow"),b.afterLoadingOnShow(b,d,c)},error:function(){d.trigger("errorLoading"),b.errorLoading(b,d),null==g?(b.body.html(b.errors.tpl),n(".arcticmodal-error",b.body).html(b.errors.ajax_unsuccessful_load),n(".arcticmodal-close",b.body).click(function(){return d.arcticmodal("close"),!1}),b.errors.autoclose_delay&&setTimeout(function(){d.arcticmodal("close")},b.errors.autoclose_delay)):g(b,d)}},b.ajax);b.ajax_request=n.ajax(j),d.data("arcticmodal",b)}},init:function(b){if(b=n.extend(!0,{},a,b),!n.isFunction(this))return this.each(function(){q.init_el(n(this),n.extend(!0,{},b))});if(null==b)return void n.error("jquery.arcticmodal: Uncorrect parameters");if(""==b.type)return void n.error("jquery.arcticmodal: Don't set parameter \"type\"");switch(b.type){case"html":if(""==b.content)return void n.error("jquery.arcticmodal: Don't set parameter \"content\"");var e=b.content;return b.content="",q.init_el(n(e),b);case"ajax":return""==b.url?void n.error("jquery.arcticmodal: Don't set parameter \"url\""):q.init_el(n("
"),b);}}},e={show:function(){var a=q.getParentEl(this);if(!1===a)return void n.error("jquery.arcticmodal: Uncorrect call");var b=a.data("arcticmodal");if(b.overlay.block.hide(),b.container.block.hide(),n("BODY").append(b.overlay.block),n("BODY").append(b.container.block),b.beforeOpen(b,a),a.trigger("beforeOpen"),"hidden"!=b.wrap.css("overflow")){b.wrap.data("arcticmodalOverflow",b.wrap.css("overflow"));var c=b.wrap.outerWidth(!0);b.wrap.css("overflow","hidden");var d=b.wrap.outerWidth(!0);d!=c&&b.wrap.css("marginRight",d-c+"px")}return p.not(a).each(function(){var a=n(this).data("arcticmodal");a.overlay.block.hide()}),q.transition(b.overlay.block,"show",1*")),b.overlay.block.remove(),b.container.block.remove(),a.data("arcticmodal",null),n(".arcticmodal-container").length||(b.wrap.data("arcticmodalOverflow")&&b.wrap.css("overflow",b.wrap.data("arcticmodalOverflow")),b.wrap.css("marginRight",0))}),"ajax"==b.type&&b.ajax_request.abort(),p=p.not(a))})},setDefault:function(b){n.extend(!0,a,b)}};n(function(){a.wrap=n(document.all&&!document.querySelector?"html":"body")}),n(document).bind("keyup.arcticmodal",function(d){var a=p.last();if(a.length){var b=a.data("arcticmodal");b.closeOnEsc&&27===d.keyCode&&a.arcticmodal("close")}}),n.arcticmodal=n.fn.arcticmodal=function(a){return e[a]?e[a].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof a&&a?void n.error("jquery.arcticmodal: Method "+a+" does not exist"):q.init.apply(this,arguments)}}(jQuery)}var debugMode="undefined"!=typeof debugFlatPM&&debugFlatPM,duplicateMode="undefined"!=typeof duplicateFlatPM&&duplicateFlatPM,countMode="undefined"!=typeof countFlatPM&&countFlatPM;document["wri"+"te"]=function(a){let b=document.createElement("div");jQuery(document.currentScript).after(b),flatPM_setHTML(b,a),jQuery(b).contents().unwrap()};function flatPM_sticky(c,d,e=0){function f(){if(null==a){let b=getComputedStyle(g,""),c="";for(let a=0;a=b.top-h?b.top-h{const d=c.split("=");return d[0]===a?decodeURIComponent(d[1]):b},""),c=""==b?void 0:b;return c}function flatPM_testCookie(){let a="test_56445";try{return localStorage.setItem(a,a),localStorage.removeItem(a),!0}catch(a){return!1}}function flatPM_grep(a,b,c){return jQuery.grep(a,(a,d)=>c?d==b:0==(d+1)%b)}function flatPM_random(a,b){return Math.floor(Math.random()*(b-a+1))+a}