- •Курсовая работа Система сбора данных на микроконтроллере aTtiny13a
- •Введение
- •Глава 1. Автономная система сбора данных
- •1.1. Роль компьютера
- •1.2. Роль интерфейсных устройств
- •1.3. Роль программного обеспечения
- •Глава 2. Ацп микроконтроллера aTmega8l
- •2.1. Основные характеристики
- •2.2. Принцип работы
- •Глава 3. Спектральный анализ сигналов
- •3.1. Быстрое преобразование Фурье
- •3.2. Обобщение метода бпф
- •3.3. Метод сортировки
- •Глава 4. Реализация системы сбора данных
- •4.1. Плата сбора данных
- •4.2. Схема сопряжения микроконтроллер-компьютер
- •4.3. Программное обеспечение персонального компьютера
- •Заключение
- •Литература
- •Приложение 1.
Глава 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].