Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
МУ_КП_МУИС.doc
Скачиваний:
0
Добавлен:
15.11.2019
Размер:
4.33 Mб
Скачать
    1. Формирование сигнала с помощью цап.

Пример: сформировать на выходе ЦАП периодический сигнал с заданными параметрами.

Рис.5.14 – Форма сигнала

t1, мс

t2, мс

t3, мс

Um, В

10

15

20

5

Программное обеспечение состоит из двух функций: основной системной функции main и системной функции-обработчика прерывания от Т0 – timer_0. В основной функции выполняется настройка таймера Т0 и системы прерываний, а также заполняется массив кодов ЦАП MasKodDAC[ ].

Циклически, через заданный интервал времени, будет вызываться функция timer_0, в которой будет выдаваться очередной код на ЦАП из массива кодов ЦАП.

Таким образом, задача сводится к тому, чтобы сформировать массив кодов ЦАП и обеспечить прерывание от таймера через заданный интервал времени.

Для заполнения массива кодов ЦАП выполним дискретизацию сигнала.

Аналитическое описание сигнала:

, (1)

Число уровней дискретизации N определяет размер массива кодов ЦАП и ограничено сверху объемом ОЗУ 128 байт. Примем N=100.

Массив кодов ЦАП MasKodDAC[] заполняется следующим образом:

i=0..N–1; (2)

ti=i*dt; (3)

Ui=U(ti); (4)

MasKodDAC[i]=255*Ui/Um. (5)

Период сигнала:

Т = t1+t2+t3 = 10+15+20 = 45 мс. (6)

Шаг дискретизации (интервал времени между срабатываниями Т0:

dt = T/N = 45/100 = 0,45 мс. (7)

Определим значения для перезагрузки счетных регистров таймера:

TH,TL = 65536 – dt[мкс] *7,37/12 =

65536 – 450*7,37/12 = 6526010 = FEEC16. (8)

Листинг программы на Си.

#include<reg51.h>//Подключили библиотеку с описанием SFR регистров МК 8051

//Исходные данные:

#define TH 0xFE

#define TL 0xEC

#define t1 10.0

#define t2 15.0

#define t3 20.0

#define Um 5.0

#define T 45.0

#define N 100

#define dt T/N

//Описание глобальных переменных

data unsigned char MasKodDAC[100];//Массив кодов ЦАП

data unsigned char j;//Счетчик кодов ЦАП

at 0xF000 unsigned char xdata DAC;//Адрес регистра данных ЦАП

//Функция-обработчик прерывания от таймера Т0 ******************************************

void timer_0() interrupt 1

{

TH0=TH;//Перезагрузили счетные регистры начальными значениями

TL0=TL;

DAC=MasKodDAC[j];//Выдали очередной код в ЦАП

j++;//Инкрементировали счетчик кодов ЦАП

if (j==100) j=0;//Проверка на выход за диапазон

}

//Основная системная функция **********************************************************

void main()

{

//Описание локальных переменных

float t;

float U;

unsigned char i;

TMOD=0b00000001;//Настройка таймера

ET0=1;//Разрешили прерывание от Т0

EA=1;//Общее разрешение прерываний

TH0=TH;//Загрузили в счетные регистры начальные значения

TL0=TL;

t=0;

//Цикл формирования массива кодов ЦАП

for(i=0;i<N;i++)

{

if (t<=t1) U=Um*t/t1;

if ((t>t1) && (t<=(t1+t2))) U=Um;

if (t>(t1+t2)) U=Um*(T-t)/t3;

MasKodDAC[i]=255*U/Um;

t=t+dt;

}

TR0=1;//Запуск Т0

while(1);

}

На рис.4 приведены результаты имитационного моделирования работы программы в Proteus.

Рис.5.15 - Осциллограмма выходного напряжения ЦАП