Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
kursovaya_3.doc
Скачиваний:
16
Добавлен:
06.09.2019
Размер:
1.36 Mб
Скачать

Глава 4. Реализация системы сбора данных

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

4.1. Плата сбора данных

Данное устройство реализовано на микроконтроллере ATmega8L. Он имеет 6-и канальный 10-и разрядный АЦП, время преобразования которого позволяет делать выборки до 15 kSPS (что соответствует диапазону частот входных сигналов 0 ÷ 7500 Гц). Также на борту этого котроллера имеется 1 Кбайт внутренней оперативной памяти и 512 байт EEPROM. Это позволяет делать выборку длинной серии, что в свою очередь снижает погрешность измерения входного сигнала.

На плате данного устройства (Рис. 6) собран LC-фильтр нижних частот (L1, C4) для стабилизации питания АЦП микроконтроллера, а также поставлен конденсатор, шунтирующий источник опорного напряжения АЦП (С3). Это включение является стандартным для данного микроконтроллера и обеспечивает минимальную ошибку при оцифровывании входного сигнала, составляющую ±2 LSB. Обратная сторона двустороннего текстолита является общим проводом аналоговой части и соединена с общим проводом цифровой части устройства в единственной точке. Это тоже является мерой подавления лишних шумов, наводящихся на аналоговые входы АЦП [2,3,6].

Также на плате имеется:

  • разъём SPI для внутрисхемного программирования;

  • разъём для подключения контроллера к персональному компьютеру по интерфейсу USART;

  • 4 кнопки управления.

Дублированные PORTD и PORTB, аналоговые входы АЦП и разъём приёмопередатчика выполнены в виде PLS штыревых вилок.

Рисунок 6. Принципиальная схема ПСД

Входной сигнал поступает на канал АЦП ADC0. Управляющая программа микроконтроллера предусматривает работу устройства в режиме ручного запуска, осуществляемого с помощью кнопки PD2. Входной сигнал после одной выборки-преобразования представляет собой 1 байт информации, помещаемый в SRAM. По заполнению 128 ячеек (128 выборок), массив данных из оперативной памяти микроконтроллера передаётся на персональный компьютер через приёмопередатчик USART по интерфейсу RS-232. Настройка приёмопередатчика: 9600 бод, 8 бит данных, без проверки на чётность, 1 стоповый бит.

Рисунок 7. Алгоритм работы управляющей программы для микроконтроллера

Листинг управляющей программы для контроллера ПСД.

.include "m8def.inc"

.def temp1 = r16

.def temp2 = r17

.def count = r20

.def loop1 = r22

.def loop2 = r23

.equ Nexp = 128

;настройки для USART

.equ Clock = 8000000

.equ baud = 9600

.equ Speed = (Clock/(16*baud))-1

.dseg

.org 0x0070

CaptBuf: .byte Nexp

.cseg

.org 0

reset:

rjmp start

.org 0x0E

rjmp ADCIRQ

.org 0x0013

start:

;инициализация стека

ldi temp1, low(RAMEND)

out spl, temp1

ldi temp1, high(RAMEND)

out sph, temp1

;настройка USART

ldi temp1, Speed

out UBRRL, temp1

;получить адрес для буфера АЦП

ldi zl, low(CaptBuf)

ldi zh, high(CaptBuf)

ldi count, 0

;настройка ацп(опорное=питание, выравнивание по левому краю, канал 0)

ldi temp1, 0b01100000

out ADMUX, temp1

ldi temp1, 0b11101110

out ADCSR, temp1

main1:

ldi temp1, 0 ;PORTD на вывод

out ddrd, temp1

ldi temp1, 0xff

out portd, temp1

;читать PD2

in temp1, pind

sbrc temp1, 2

rjmp main1

;задержка

ldi temp1, 3

wt: rcall wait

dec temp1

brne wt

sei ;включить глобальные прерывания

main:

;сравнить счётчик с 128

cpi count, 128

brne main

cli ;приостановить глобальные прерывания

;выключение АЦП

ldi temp1, 0b01101110

out ADCSR, temp1

;двоично-инверсная перестановка

;используется X регистр адрес передатчика, Y регистр адрес приёмника

ldi count, 0

ldi adrptr, 0

ldi xl, low(CaptBuf)

ldi xh, high(Captbuf)

binv:

ldi adrptr, 0

ld temp2, x+

;вычисление указателя адреса переставленного элемента во втором буфере

mov adrptr, count

bst count, 6

bld adrptr, 0

bst count, 5

bld adrptr, 1

bst count, 4

bld adrptr, 2

bst count, 2

bld adrptr, 4

bst count, 1

bld adrptr, 5

bst count, 0

bld adrptr, 6

ldi yl, low(Bfly)

ldi yh, high(Bfly)

add yl, adrptr

adc yh, zero

st y, temp2

inc count

cpi count, 128

brne binv

;Включение USART на передачу: UDRIEE = 1, TxEN = 1

ldi temp1, 0x28

out UCSRB, temp1

ldi count, 0

ldi zl, low(CaptBuf)

ldi zh, high(CaptBuf)

;передача 256 ячеек данных по готовности буфера передатчика

transmit:

ld temp1, Z+

t1:

sbis UCSRA, UDRE

rjmp t1

out UDR, temp1

cpi count, 255

breq outtx

inc count

rjmp transmit

outtx:

;выключение USART

ldi temp1, 0

out UCSRB, temp1

;обнуление параметров

ldi count , 0

ldi zl, low(CaptBuf)

ldi zh, high(CaptBuf)

;включить АЦП

ldi temp1, 0b11101110

out ADCSR, temp1

ldi temp1, 0 ;PORTD на вывод

out ddrd, temp1

ldi temp1, 0xff

out portd, temp1

;читать PD2

main2:

in temp1, pind

sbrs temp1, 2

rjmp main2

;задержка

ldi temp1, 15

wt0: rcall wait

dec temp1

brne wt0

rjmp main1

;подпрограмма для обработки прерывания АЦП (используется 8 разрядов)

ADCIRQ:

;читаются только старшие 8 бит 10-и разрядного слова

in temp2, ADCH

st Z+, temp2

inc count

reti

;подпрограмма задержки

wait:

ldi loop2, 256

wt1: dec loop2

breq wt3

ldi loop1, 256

wt2:

dec loop1

brne wt2

rjmp wt1

wt3:

ret

Особенностью использования АЦП в моей программе является то, что результатом преобразования является двоичное 8 разрядное число. Использование неполной разрядности АЦП обусловлено неидеальным источником опорного напряжения и погрешностью, заявленной производителем: ± 2 LSB (less significant bit – младший значащий бит). Как следствие, последние два разряда содержат ошибку измерения и в дальнейших расчётах не участвуют [6, 10-12].

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]