ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 12.01.2024
Просмотров: 25
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ
ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ
НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ
Кафедра систем сбора и обработки данных
Расчетно-графическое задание
на тему: «Измерение интенсивности света»
по дисциплине: «Микроконтроллеры и микропроцессоры»
Выполнила: Кошелева Т.Ю. | Проверил: Баран Е.Д. |
Группа: АТ-93 | |
Факультет: АВТ | |
Новосибирск
2022 г.
Техническое задание:
Измерить интенсивность света с помощью фоторезистора, результат измерения вывести на семисегментный индикатор.
Основная часть:
Фоторезистор представляет собой преобразователь, чье сопротивление изменяется в зависимости от интенсивности падающего на него света.
Фоторезисторы изготавливаются из полупроводников, чтобы обеспечить им зависимые от света свойства. Принцип действия фоторезисторов основан на так называемой "фотопроводимости". В соответствии с данным принципом, с увеличением количества света, падающего на фоторезистор, его сопротивление уменьшается, а при снижении интенсивности падающего света его сопротивление увеличивается. Данные свойства во много обусловлены использованием полупроводниковых материалов для изготовления фоторезисторов. Наиболее часто фоторезисторы применяются для обнаружения наличия света или измерения его интенсивности.
Рис. 1. Схема подключения фоторезистора.
На выходе получим аналоговый сигнал, который необходимо подать на аналоговый вход микроконтроллера ATMEGA324PB, после чего с помощью АЦП микроконтроллера конвертировать аналоговый сигнал в цифровой.
Будем использовать линию 0 порта A:
Рис. 2. Распиновка микроконтроллера.
Изучив Datasheet ATMEGA324PB, выяснилось, что в микроконтроллере находится 10-битный аналого-цифровой преобразователь:
Рис. 3. Характеристики микроконтроллера.
Чтобы получить результат с датчика, в нашем случае с фоторезистора, необходимо настроить АЦП программно. Для этого нужно изучить конфигурацию регистров ADMUX и ADCSRA.
Регистр ADMUX:
Рис. 4. Описание регистра ADMUX.
REFS - биты 6,7 - выбор источника опорного напряжения. Будем использовать внешний источник опорного напряжения.
Рис. 5. Конфигурация опорного напряжения в регистре ADMUX.
ADLAR - 5 бит - конфигурирует способ записи результата преобразования АЦП в регистр ADC. При установке нуля в бит ADLAR регистра ADMUX старшие 9 и 8 биты результата преобразования будут находиться в старшем байте регистров результата ADCH, младшие 0-7 биты будут записаны в младший байт регистра результата ADCL.
Рис. 6. Запись результата преобразования при установке ADLAR = 0.
При установке единицы в бит ADLAR регистра ADMUX младшие 0 и 1 биты результата преобразования будут находиться в младшем байте регистров результата ADCL, старшие 2-9 биты будут записаны в старший байт регистра результата ADCH.
Рис. 7. Запись результата преобразования при установке ADLAR = 1.
Запишем единицу в ADLAR.
MUX - биты 0-4 - конфигурация канала, на котором будет осуществляться преобразование АЦП. Будем использовать канал ADC0, поэтому в программе в регистр ADMUX запишем в итоге 01100000.
Рис. 8. Конфигурация канала измерения АЦП в регистре ADMUX.
Регистр ADCSRA:
Рис. 9. Описание регистра ADCSRA.
ADEN - 7 бит - разрешение работы АЦП. Выставляем единицу.
ADSC - 6 бит - разрешение замерять. Выставляем единицу.
ADATE - 5 бит - многократный режим измерения (running mode). Выставляем нуль.
ADIF- 4 бит- флаг ставится, после того как АЦП производит замер, из за флага срабатывает прерывание.
ADIE- 3 бит - разрешение прерываний. Выставляем нуль.
ADPS - биты 0-2- выбор частоты преобразования. Выставляем 011.
Рис. 10. Биты ADPS.
В итоге в программе в регистр ADCSRA запишем 11000011.
При такой настройке регистров АЦП будет преобразует сигнал с датчика один раз. Чтобы производить конвертацию сигнала в цикле через промежуток времени будем использовать прерывание таймера по переполнению.
Будем использовать таймер 1, поскольку он 16-ти битный, то есть максимальное число, которое можно записать в его счетный регистр – 65536, таймер 1 обеспечит большую задержку, чем это может сделать 8-ми битный таймер 0, максимальное число счетного регистра которого – 256. Наибольшая задержка, которую может обеспечить таймер 0 – 256/1000000*1024=0.26 секунд. (1024 –предделитель, устанавливаемый регистром TCCR0B)
Используя таймер 1 можно обеспечить значительно большую задержку. Поставим задержку в несколько секунд. Для этого подберем предделитель. 65536/1000000*64=4.19 секунд.
Для настройки прерывания по переполнению таймера нужно прописать вектор прерывания, который содержит адрес на первую команду обработчика прерывания.
Рис. 11. Вектора прерываний.
Нужный вектор: 0x001E.
Следующим шагом нужно произвести конфигурацию таймера.
Выше уже был подобран преддедитель таймера. Настройка первых битов регистра нам не нужна, поэтому запишем в регистр TCCR1B 00000011, следуя рисунку 13.
Рис. 12. Описание регистра TCCR1B.
Рис. 13. Таблица предделителей таймера.
В счетный регистр запишем 0. Это значит, что счет таймера будет идти от 0 до 65536. Флаг переполнения будет подниматься каждые 65536 «тиков» таймера.
Рис. 14. Счетные регистры таймера.
Последний регистр, который необходимо настроить – TIMSK1. Он отвечает за разрешение прерываний таймера. Чтобы разрешить прерывания по переполнению, нужно установить единицу в его бит TOIE1.
Рис. 15. Регистр TIMSK1.
Итоговая схема подключения:
Для вывода значения с АЦП будут использоваться линии 0-3 портов B,C,D.
Результат с АЦП будет обрабатываться подпрограммой, вычисляющей разряды результата, затем каждый разряд будет отправлен на порт, с порта подключен к дешифратору КР514ИД2, а дешифратор подключен к семисегментному индикатору.
Результаты работы программы:
Рис. 17. Показания индикаторов при низкой освещенности.
Рис. 18. Показания индикаторов при низкой освещенности.
Листинг программы:
.CSEG
;вектора прерываний
.ORG 0x00
rjmp RESET ;вектор прерывания вызываемый по сбросу микроконтроллера
.ORG 0x1E
rjmp TIMER1_OVF ;прерывание таймера T1 по переполнению
RESET:
;инициализация вершины стека
ldi r16, low(ramend)
out SPL, r16
;разрешение линий 0-7 порта б на выход для вывода результата преобразовая с ацп
ldi r16, 255
out DDRB,r16
ldi r16, 0b01100000
sts ADMUX, r16 ;настройка ацп
sts TCNT1H,r16 ;настройка таймера для измерения ацп
sts TCNT1L,r16
ldi r16, 0x03
sts TCCR1B,r16 ;частота синхронизации Timer1 = Fosc/64;
ldi r16,0x01 ; разрешить прерывания по переполнению
sts TIMSK1,r16
sei ;поднятие флага I для глобального разрешения прерываний
rjmp PC
TIMER1_OVF:
in r16, SREG
push r16 ;сохранение флагов процессора
ADC_Conversion:
ldi r16, 0b11000011
sts ADCSRA, r16 ;настройка ацп
lds r18, ADCH
out PORTB, r18 ;выводим результат с ацп на порт б
rcall output ;вызов подпрограммы вывода значения с аца на индикаторы
pop r16
out SREG, r16 ;восстановление флагов
reti ;конец обработчика прерывания
output: ;подпрограмма вычисляет разряды 8-разрядного числа
in r16, portb ;сохраняем значение с порта б в регистр
DIGITS8:
CLR R26
CLR R27
CLR R28
CLR R29
CLR R30
LDI r17,100
DIG8_1:
CP r16, r17
BRLO DIG8_2
SUB r16, r17
; сотни
INC R26
RJMP DIG8_1
DIG8_2:
LDI r17,10
DIG8_3:
CP r16, r17
BRLO DIG8_4
SUB r16, r17
; тысячи
INC R27
RJMP DIG8_3
DIG8_4:
; в Temp1 остались только единицы
MOV r18, r16
MOV r16, R26
MOV r17, R27
Clr r20
Out PORTB, r20
ldi r20, 0x0F
out DDRB, r20 ;линии 0-3 порта b хранят разряд единиц результата преобразования
out PORTB,r16
ldi r20, 0x0F
out DDRC, r20 ;линии 0-3 порта c хранят разряд десятков результата преобразования
out PORTC,r17
ldi r20, 0x0F
out DDRD, r20 ;линии 0-3 порта d хранят разряд сотен результата преобразования
out PORTD, r18
ret ;выход из подпрограммы
Вывод:
В ходе выполнения расчетно-графического задания была разработана схема подключения фоторезистора для измерения освещенности, были настроены регистры АЦП, регистры таймера для использования прерывания по переполнению, чтобы обеспечить запуск преобразования АЦП каждые несколько секунд. Также, была собрана схема для вывода показания с АЦП на семисегментные индикаторы через дешифраторы.