Обработка аналоговых сигналов на основе МК C8051F064

Автор: Пользователь скрыл имя, 13 Декабря 2012 в 09:08, курсовая работа

Описание работы

Цель курсовой работы – получение навыков программирования аппаратных комплексов, включающих взаимодействующие между собой различные 8- или 32-разрядные микроконтроллерные системы (МК-системы) и персональные компьютеры (РС), на языках Ассемблеров, С – для микроконтроллеров (МК) и языке С++ для РС с платформой Windows.

Содержание

1. Постановка задачи 6
1.1. Стандартное задание 6
1.2. Индивидуальное задание 6
2. Техническое задание 7
3. Описание аппаратных и программных средств лабораторного комплекса 8
3.1. Структура аппаратных средств 8
3.1.1. Структурная схема лабораторного комплекса 8
3.1.2. Плата МК – системы 9
3.1.2.1. Конфигурируемые узлы МК C8051F064 11
3.1.2.2. Внешняя память XRAM 16
3.1.2.3. Входные усилители 17
3.1.2.4. Микросхема моста UART-USB 18
3.1.2.5. Сопряжение платы с PC 20
3.1.2.6. Питание платы 21
3.1.3. Требования к PC 21
3.1.4. ОСЦИГЕН 21
3.2. Перечень программных средств лабораторного комплекса 22
3.2.1. Средства программирования и отладки МК-системы 22
3.2.1.1. Интегрированная среда разработки фирмы SiLabs IDE 2.0 22
3.2.1.2. Ассемблер, компилятор и линкер интегрированной среды разработки Keil 23
3.2.2. Средства разработки Windows-приложений 24
3.2.2.1. Среда разработки 24
3.2.2.2. Библиотека WIN32 API функций 24
3.2.3. Приложения для ОСЦИГЕНа. 25
3.2.3.1. Драйвер конфигурируемого выносного блока 25
3.2.3.2. Windows-приложение OGView 25
3.2.4. Драйвер виртуального COM-порта фирмы SiLabs 26
4. Разработка программного комплекса для решения целевой задачи 26
4.1. Функциональная схема реализации функций запоминающего осциллографа 26
4.2. Состав и механизм взаимодействия приложений программного комплекса 27
4.2.1. Схема программного комплекса 27
4.2.2. Протокол обмена между PC-приложением и МК-приложением 27
4.2.3. Таблица допустимых команд 27
4.2.4. Размещение в памяти значений выборок сигнала со стороны МК и ПК 28
4.3. Разработка приложения для МК-системы 29
4.3.1. Обобщенная схема алгоритма 29
4.3.2. Обоснование выбора языка программирования и среды разработки 30
4.3.3. Описание файлов проекта приложения 30
4.3.3.1. Модули приложения 30
4.3.3.2. Модули, подключаемые на этапе линкования 30
4.3.4. Структура и организация программы 30
4.3.5. Схемы алгоритмов и описание функций приложения 30
4.3.5.1. Перечень функций приложения 30
4.3.5.2. Организация бесконечного цикла встроенного приложения 31
4.3.5.3. Отключение сторожевого таймера 31
4.3.5.4. Переключение с внутреннего генератора на внешний 32
4.3.5.5. Конфигурирование портов ввода/вывода 33
4.3.5.6. Конфигурирование аналого-цифровых преобразователей ADC 32
4.3.5.7. Конфигурирование интерфейса DMA 34
4.3.5.8. Инициализация последовательного интерфейса UART 35
4.3.5.9. Выбор и инициализация таймера для установки скорости обмена данными по последовательному каналу 36
4.3.5.10. Инициализация таймера для установки времени дискретизации входного сигнала 36
4.3.5.11. Выбор режимов работы внешней памяти XRAM и ее интерфейса 36
4.3.5.12. Инициализация прерываний 37
4.3.5.13. Формирование цифровых отсчетов и их сохранение во внешней памяти XRAM 37
4.3.5.14. Передача данных на PC 37
4.3.5.15. Прием данных с PC 37
4.3.5.16. Другие используемые функции 38
4.3.5.17. Конфигурирование узлов МК с учетом данных, пришедших с PC 38
4.4. Разработка Windows-приложения 39
4.4.1. Особенности использования среды разработки 39
4.4.2. Описание файлов проекта 39
4.4.3. Обобщенная схема алгоритма многопоточного приложения 40
4.4.4. Внешний вид и описание графического интерфейса, принципы построения программы 40
4.4.5. Описание структуры и организация программы 41
4.4.5.1. Назначение подключаемых файлов 41
4.4.5.2. Описание прототипов функций 41
4.4.5.3. Функция WinMain() 42
4.4.5.4. Функция главного окна 42
4.4.5.5. Организация дополнительных потоков, их назначение 43
4.4.5.6. Рабочие функции дополнительных потоков 43
4.4.5.7. Синхронизация потоков 43
4.4.5.8. Особенности обработки сообщений Windows в программе 43
4.4.5.9. Функция рисования графика восстановленного сигнала 45
4.4.5.10. Разметка осей графика 45
4.4.5.11. Использование контекстуальной памяти для рисования графика 45
4.4.6. Работа с COM-портом, описание WinAPI-функций и структур данных 46
4.4.6.1. Инициализация COM-порта, обоснование выбора режима (синхронный, асинхронный), объема буфера приема/передачи данных 46
4.4.6.2. Организация настроек COM¬-порта в графическом интерфейсе 48
4.4.6.3. Использование функций WaitCommEvent(), WaitForSingleObject(), WaitForMultiplyObject() 49
4.4.7. Работа оператора с приложением 49
4.4.7.1. Последовательность запуска приложения на МК и ПК в лаборатории 49
4.4.7.2. Примеры последовательности 49
4.4.7.3. Адаптация к сепктру входного сигнала 49
4.4.8. Описание протокола RS-232 49
5. Список используемых источников информации 87
6. Приложения 50
6.1. Исходные тексты модулей программы для МК 50
6.2. Фрагменты листингов файлов МК-приложения, полученные в результате трансляций: MAP-file и др 56
6.3. Исходные тексты файлов Windows-приложения 58
6.4. Алгоритмы 72
6.4.1. Обобщенный алгоритм программы для МК 72
6.4.2. Дополнительные алгоритмы программы для МК 73
6.4.2.1. Алгоритм процедуры отключения WDT 73
6.4.2.2. Алгоритм функции SYSCLK_Init 74
6.4.2.3. Алгоритм функции Port_Init 75
6.4.2.4. Алгоритм функции ADCInit 76
6.4.2.5. Алгоритм функции DMAInit 77
6.4.2.6. Алгоритм работы функции UART0_Init 79
6.4.2.7. Алгоритм функции Timer3_Init 80
6.4.2.8. Алгоритм функции main 81
6.4.2.9. Алгоритм функции Config 82
6.4.2.10. Алгоритм функции SendData 83
6.4.2.11. Алгоритм функции ReceiveData 84
6.4.3. Обобщенный алгоритм программы Windows-приложения 85
6.4.3.1. Алгоритм работы функции рисования графика 85
6.4.3.2. Алгоритм обработки сообщений 86

Работа содержит 1 файл

Обобщенная пояснительная записка.doc

— 5.12 Мб (Скачать)

 

Бит 7: WEAKPUD -  бит отключения слаботоковых подтяжек портов вводы/вывода

0 – слаботоковые подтяжки включены

1 -  слаботоковые подтяжки отключены

Бит 6: XBARE – бит включения матрицы

0 – матрица отключена,  все выводы портов P0, P1, P2 и P3 настроены на вход

1  - матрица включена

Бит 5: зарезервирован. Читается как 0b. Запись не оказывает никакого влияния.

Бит 4: T4EXE – бит подключения входа T4EX

0 – T4EX не соединены с выводом порта

1 – T4EX соединен с выводом порта

Бит 3: T4E -  бит подключения входа T4

0 – T4 не соединены с выводом порта

1 – T4 соединен с выводом порта

Бит 2: UART1E – бит подключения входов/выходов УАПП1

0 – входы/выходы УАПП1 не соединены  с выводами порта

1 – TX1 и RX1 соединены с двумя выводами порта

Биты 1-0: зарезервированы

Конфигурирование портов ввода  – вывода происходит в функции Port_Init().

Приоритетный декодер матрицы, или «матрица», распределяет и назначает  выводы портов цифровым периферийным модулям МК, используя приоритеты. Матрица назначает выводы портов периферийным модулям, если соответствующие биты подключения в регистрах конфигурации матрицы XBR0, XBR1, XBR2 и XBR3 установлены в 1.

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

1. Для разрешения работы УАППа  необходимо установить в ‘1’  2-ый бит (UART0EN) регистра XBR0 (запись значения b00000100 или 0x04 в XBR0).

2. Также необходимо установить  в '1' бит глобального разрешения цифрового коммутатора 6-ой бит (XBARE) регистра XBR2 (запись значения b01000000 или 0x40 в XBR2).

Следующий код функции Port_Init(void) иллюстрирует вышеописанную процедуру:

XBR0=0x04;      // Enable UART0 on crossbar

XBR1=0x00; 

XBR2=0x40;    // Enable crossbar and weak pull-ups

Помимо этого необходимо запрограммировать  работу выходных драйверов.

Регистр PхMDOUT:

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Значение при сбросе:

00000000

               

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0


 

Биты 7-0: PхMDOUT – биты настройки выходного драйвера порта х

0 – соответствующий вывод P0.n настроен как выход с открытым  стоком

1 – соответствующий вывод P0.n настроен как цифровой двухтактный  выход

По умолчанию  после RESETа каждая линия порта ввода/вывода запрограммирована для работы в режиме OPEN_DRAIN. В нашей работе необходимо перепрограммировать выходные драйвера Port0  и Port1 на работу в режиме PUSH_PULL.

P0MDOUT=0xFF;  // enable Port0 outputs as push-pull

P1MDOUT |= 0x40;       // enable Port1 Pin 6 output as Push-Pull

        1. Конфигурирование аналого-цифровых преобразователей ADC

Регистр ADC0CN:

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Значение при сбросе:

00000000

AD0EN

AD0TM

AD0INT

AD0BUSY

AD0CM1

AD0CM0

AD0WINT

-

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0


 

Бит 7: AD0EN -  бит включения АЦП0

0 – АЦП0 отключен, находится  в режиме пониженного энергопотребления

1 -  АЦП0 включен, находится  в активном режиме и готов  к преобразованию 

данных или калибровке

Бит 6: AD0TM – бит установки режима слежения АЦП0

0 – когда АЦП0 включен, слежение осуществляется всегда, за исключением

момента преобразования

1  - режим слежения определяется  битами AD0CM1-0

Бит 5: AD0INT – флаг прерывания от АЦП0 (устанавливается при завершении преобразования). Этот флаг должен быть сброшен программно.

0 – АЦП0 не закончил преобразование  данных

1  - АЦП0 закончил преобразование  данных

Бит 4: AD0BUSY – бит занятости АЦП0

Чтение:

0 – преобразование данных завершено  или в данный момент не осуществляется

1  - идет процесс преобразования  данных

Запись:

0 – не оказывает никакого  влияния

1  - инициирует запуск преобразования  АЦП0, если биты ADC0CM1-0 = 00b

Биты 3-2: AD0CM1-0 – биты выбора режима запуска преобразования АЦП0

Если AD0TM = 0

00 – запуск преобразования осуществляется  установкой в 1 бита AD0BUSY

01  - запуск преобразования осуществляется  при переполнении Таймера 3

10 - запуск преобразования осуществляется  нарастающим фронтом сигнала  CNVSTR0

11  - запуск преобразования осуществляется  при переполнении Таймера 2

Если AD0TM = 1

00 – слежение (выборка) начинается в момент установки в 1 бита AD0BUSY, после

истечения периода слежения начинается преобразование данных

01 - слежение (выборка) начинается  при переполнении Таймера 3, после  истечения 

периода слежения начинается преобразование данных

10 – преобразование АЦП0 запускается  нарастающим фронтом сигнала  CNVSTR0

11  - слежение (выборка) начинается  при переполнении Таймера 2, после  истечения 

периода слежения начинается преобразование данных

Бит 1: AD0WINT - флаг прерывания от детектора диапазона АЦП0 (сбрасывается программно)

0 – не зафиксировано соответствия  преобразованных данных заданному  диапазону

1  - зафиксировано соответствия  преобразованных данных заданному  диапазону

Бит 0: зарезервирован. Необходимо записать 0b.

Регистр REF0CN:

R/W

R/W

R/W

R/W

R/W

R/W

R/W

R/W

Значение при сбросе:

00000000

-

-

-

-

-

-

BIASE0

REFBE0

Бит 7

Бит 6

Бит 5

Бит 4

Бит 3

Бит 2

Бит 1

Бит 0


 

Бит 7-2: зарезервированы, читаются как b000000, необходимо записать b000000.

Бит 1: BIASE0 – бит включения генератора напряжения смещения АЦП0 (если АЦП используется, то этот бит должен быть установлен в 1)

0 – внутренний генератор напряжения  смещения отключен

1 - внутренний генератор напряжения  смещения включен 

Бит 0: REFBE0 – бит включения внутреннего буферного усилителя АЦП0

0 - внутренний буферный усилитель  АЦП0 отключен

1 - внутренний буферный усилитель  АЦП0 включен

Конфигурирование  АЦП происходит в функции ADC_Init() по следующему алгоритму:

  1. Запись значения 0xC4 (b11000100) в регистр ADC0CN – включение ADC0, режим слежения определяется битами 01, т.е. запуск преобразования осуществляется при переполнении Таймера3;
  2. Запись значения 0x03 (b00000011) в регистр REF0CN – включение генератора напряжения смещения ADC0 и включение внутреннего буферного усилителя, внутреннее опорное напряжение подается на вывод VREF0;
  3. Задержка для стабилизации генератора опорного напряжения
  4. Запись значения 0x00 в регистр ADC0CF – установка в качестве периода преобразования АЦП0 Tconv = 21*TSYSCLK
  5. Запись значения 0x00 в регистр AMX0SL – выбор однофазного режима работы ADC0;
  6. Проверка переменной ADC_Mode, если выбран дифференциальный режим работы АЦП, то повторить пп.1-4 для соответствующих регистров ADC1, а также записать значение 0x40(b1000000) в регистры AMX0SL и AMX1SL (установка в '1' бита DIFFSEL – выбор дифференциального режима работы).

Описанный алгоритм иллюстрирует следующий  код:

ADC0CN = 0xC4;  // ADC0 Enabled, Timer3 start-of-conversion

// track 16 SAR clocks before data conversion

// upon Timer3 OV.  DMA will enable ADC as needed

 

REF0CN = 0x03; // ADC0: turn on bias generator and internal reference

for(i=0;i<10000;i++); // Wait for Vref to settle

ADC0CF = 0x00;  // Setting Conversion Clock Period Bits

// (ADC0SC[3..0]=0000, Tcon= 21*SYSCLK)

//ADC mode (ADC0 / DIFF)

if (ADC_Mode == 's')

AMX0SL = 0x00;  // Single-ended mode, ADC0

else if (ADC_Mode=='d')

{

AMX0SL = 0x40;  // Differential mode

SFRPAGE = ADC1_PAGE; // Switch to ADC1 Page

ADC1CN = 0xC4;  // ADC1 Enabled, Timer3 start-of-conversion

// track 16 SAR clocks before data conversion

// upon Timer3 OV.  DMA will enable ADC as needed

REF1CN = 0x03; // ADC1: turn on bias generator and internal reference

 for(i=0;i<10000;i++); // Wait for Vref to settle

ADC1CF = 0x00;  // Setting Conversion Clock Period Bits

}

 

        1.  Конфигурирование интерфейса DMA

Конфигурирование интерфейса DMA происходит в функции DMA0_Init()по следующему алгоритму:

  1. Запись значения 0x00 в регистр DMA0CN – отключаем DMA
  2. Запись 16-битной переменной XRAM_START_ADD в 16-битный регистр DMA0DA – установка начального адреса данных
  3. Запись значения переменной NumSamp (количество выборок) в регистр счетчика повторений DMA0CT
  4. Запись значения 0x00 (начальный адрес команд) в регистр адреса команд DMA0IPT;
  5. В зависимости от переменной ADC_Mode (режим работы АЦП) в регистр данных команд DMA0IDT записываем либо значение 0x10 (b00010000) (получение данных с ADC0 в однофазном режиме), либо значение 0x40 (b01000000) (получение данных с ADC0 в дифференциальном режиме)
  6. Запись значения 0x00 в регистр данных команд DMA0IDT – команда «Конец операции»;
  7. Запись значения 0x00 в регистр границы команд DMA0BND (адрес, с которого начинается выполнение команд);
  8. Запись значения 0xA0 (b10100000) в регистр DMA0CN – включение DMA в 1-ом режиме.

Описанный алгоритм иллюстрирует следующий  код:

DMA0CN = 0x00;    // Disable DMA interface

DMA0DA = XRAM_START_ADD;  // Starting Point for XRAM addressing

DMA0CT = NUM_SAMPLES;   // Get NUM_SAMPLES samples

DMA0IPT = 0x00;    // Start writing at location 0

// Push instructions onto stack in order they will be executed

if (ADC_Mode == 's')

DMA0IDT = DMA0_GET_ADC0; // Retrieve data from ADC0

else   DMA0IDT = DMA0_GET_DIFF;//Retrieve differential data from ADC0-ADC1

DMA0IDT = DMA0_END_OF_OP; // End of operations

DMA0BND = 0x00;   // Begin instruction executions at address 0

DMA0CN = 0x20;   // switch DMA0 to mode 1

 

        1. Инициализация последовательного интерфейса UART

Инициализация последовательного  порта UART происходит в функции UART0_Init().

Инициализация последовательного  порта UART проходит по следующему алгоритму:

  1. Запись значения 0x50 (b01010000) в регистр управления UART0 SCON, значения 0x10 (b00010000) в регистр состояния и выбора источника тактирования UART0 SSTA0 (установка УАППа в 1-ый режим работы – стандартный асинхронный полный дуплексный обмен данными с использованием 10 бит для передачи 1 байта данных, данные передаются через внешний вывод TX0 и принимаются через RX0, скорость обмена данными обеспечивается с помощью таймера T1)
  2. Инициализация таймера T1 с помощью регистров TMOD (0x20 – режим 2, т.е. 8-разрядный автоперезагружаемый таймер-счетчик), CKCON (0x10 – таймер T1 тактируется системным тактовым сигналом) и задание значений переполнения таймера (TH1 =  -(SYSCLK / BAUDRATE)/16) и начального значения таймера (TL1 =  -(SYSCLK / BAUDRATE)/16).

Информация о работе Обработка аналоговых сигналов на основе МК C8051F064