Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Уч. пос. МПТ (2.04.12).pdf
Скачиваний:
403
Добавлен:
22.03.2015
Размер:
10.95 Mб
Скачать

совпадению с порогом PWMMR0, а сбрасывать его в процедуре обработки прерываний.

Если допустить усложнение алгоритма, то можно, кроме того, измерять частоту внешнего сигнала и корректировать значения всех пороговых регистров с учетом действительной частоты. Измерение частоты рассматривается в разделе 3.17.

3.7 Формирование сигналов специальной формы с помощью ЦАП

3.7.1 Задание

Разработать программу, формирующую на выходе AOUT сигнал заданной формы (прямоугольной, синусоидальной, треугольной или пилообразной) с заданной амплитудой и частотой. Рекомендуемые параметры сигнала: амплитуда от 0,1 до 2,2 В; частота от 20 Гц до 20 кГц.

3.7.2 Основы

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

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

Рисунок 3.7.1 – Осциллограммы сигналов, различной формы, полученные с помощью ЦАП

177

На частотах порядка 500 Гц быстродействия микроконтроллера недостаточно для вычисления дискретных отсчетов синусоидального сигнала в реальном времени. То есть для вычисления одной точки синуса требуется время, превышающее . Поэтому таблица синусов вычисляется заранее. В зависимости от того меняются ли параметры сигнала в ходе работы программы или они постоянны, таблица рассчитывается либо на этапе разработки программы и «прошивается» в ПЗУ, либо рассчитывается по программе самим микроконтроллером и хранится в ОЗУ. Здесь будем рассматривать только второй случай. Если расчет таблицы выполняется микроконтроллером, то вычисление тригонометрической функции связано с существенными временными затратами. Можно рекомендовать рассчитать шаблон синусоидального сигнала фиксированной амплитуды и постоянно хранить в памяти в формате с плавающей точкой. Будем обозначать этот шаблон . В таблице 3.7.1 приведены выражения и соответствующие команды Си для расчета однополярного шаблонного сигнала разных форм в диапазоне .

Таблица 3.7.1 – Выражения для расчета шаблонных сигналов

Форма

Математическое

 

Реализация с помощью

сигнала

выражение (

)

команды Си

Меандр

 

 

u[k] = k<N/2? 0 : 2;

 

 

 

 

Пила

 

 

u[k] = k*2.0/(N-1);

 

 

 

 

Треугольник

 

 

u[k] = k<N/2 ?

 

 

k*4.0/N : 4-k*4.0/N;

 

 

 

Синус

 

 

u[k] =

 

 

sin(6.283185307*k/N)+1;

 

 

 

Всякий раз, когда необходимо изменить амплитуду, на основе шаблона путем масштабирования, смещения и округления рассчитывается цифровой сигнал . Этот сигнал должен быть представлен в формате с фиксированной точкой. Он содержит отсчеты, готовые для записи в ЦАП.

Сигнал рассчитывается на основе по общей формуле (независимо от формы):

,

(3.7.1)

где — амплитуда сигнала, В; — опорное напряжение, В.

Дадим необходимые пояснения. Множитель 511,5 выбран исходя из числа кодовых комбинаций 10-разрадного ЦАП () и при дает . Операция округления уже известна. Умножение на 64 — это сдвиг на 6 разрядов влево (см. формат регистра DACR в разделе 1.16.1).

Выражение (3.7.1) реализация на Си следующей командой.

v[k]=(int)floor(511.5*A/Vref*u[k]+0.5)<<6;

178

Для формирования временных интервалов используется таймер. В процедуру обработки прерывания помещается команда обновления ЦАП вычисленным заранее значением для очередной дискреты.

3.7.3 Алгоритм программы

Потребуется подключить директивой #include файл math.h.

На вкладке Configuration Wizard файла настройки Startup.s выбрать опцию VPBDIV Setup и VPB Clock = CPU Clock.

Впрограмме используется несколько глобальных констант и пере-

менных:

а) целочисленная константа N — число дискрет в периоде сигнала (обычно несколько десятков или сотен, но не более 500 тыс./с);

б) вещественная константа Vref, равная величине опорного напряжения (по умолчанию 2,2 В);

в) вещественные переменные A и f — амплитуда и частота сигнала, которым здесь же следует присвоить значения из задания;

г) вещественный массив отсчетов сигнала u из N элементов; д) целочисленный массив v из N элементов;

е) целочисленный счетчик .

Схема основной программы и процедуры обработки прерывания показаны на рисунке 3.7.2

Восновной программе потребуется локальная переменная — счетчик k.

 

 

 

Основная программа

 

 

 

Процедура обработки прерывания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Начало

 

 

 

 

 

Начало

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

1

 

 

 

 

 

1

 

 

 

 

 

 

 

 

K = 0

 

 

 

 

 

Запись в ЦАП v[K]

 

 

 

 

 

2

 

 

 

 

 

2

 

 

 

 

 

 

 

Настройка режима

 

 

 

 

 

K = K + 1

 

 

 

 

 

 

 

линии P0.25

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

3

 

 

Да

 

 

 

 

 

 

 

 

 

 

 

Нет

3

 

 

Да

 

 

K = N

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

k = 0; k < N; k++

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Нет

 

K = 0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6

 

 

 

 

 

Расчет u[k]

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Настройка таймера:

 

 

 

 

 

 

 

 

 

 

 

 

 

Инициализация

 

 

 

 

задание порога, вкл.

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Расчет v[k]

 

 

системы прерываний

 

 

 

сброс и запрос прерывания

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

7

Настройка системы

Конец

 

 

 

 

прерываний

 

8

Пустая команда

Рисунок 3.7.2 – Алгоритм программы функционального генератора

179

1.Присваивание нулевого начального значения счетчику K реализуется в разделе объявления.

2.Перевести линию P0.25 в режим аналогового выхода (PINSEL1).

3–5. В цикле заполнить массивы по одной из формул таблицы 3.7.1 и формуле (3.7.1)

6. Настроить таймер:

а) задать пороговое значение, обеспечивающее необходимую длительность дискреты

;

в соответствии с выражением 1.13.3 пороговое значение

;

б) включить сброс и прерывание по совпадению (T0MCR); в) включить таймер (T0TCR).

7. Настроить систему прерываний через регистры VICVectAddr0, VICVectCntl0 и VICIntEnable (раздел 1.11.5).

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

Прокомментируем алгоритм процедуры обработки прерываний.

1.Записать значение текущей дискреты в ЦАП (регистр DACR).

2.Увечить глобальный счетчик K на единицу.

3–4. Обнулить счетчик K, Если он равен N.

5. Выполнить инициализацию системы прерываний, сбросив флаг совпадения (T0IR) и обнулив VICVectAddr.

3.7.4 Повышение точности генерирования частоты

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

.

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

.

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

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

2.Цикл (блоки 3–5) дополнить командой расчета длительностей дискрет по формуле

T[k]=floor(60E6/f/N*(k+1)+0.5)-1;

3. Присвоить пороговому значению (блок 6) величину T[0].

180