РГЗ Микроконтроллеры. Измерение интенсивности света по дисциплине
Скачать 2.38 Mb.
|
МИНИСТЕРСТВО НАУКИ И ВЫСШЕГО ОБРАЗОВАНИЯ РФ ФЕДЕРАЛЬНОЕ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ ВЫСШЕГО ОБРАЗОВАНИЯ НОВОСИБИРСКИЙ ГОСУДАРСТВЕННЫЙ ТЕХНИЧЕСКИЙ УНИВЕРСИТЕТ Кафедра систем сбора и обработки данных Расчетно-графическое задание на тему: «Измерение интенсивности света» по дисциплине: «Микроконтроллеры и микропроцессоры»
Новосибирск 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 ;выход из подпрограммы Вывод: В ходе выполнения расчетно-графического задания была разработана схема подключения фоторезистора для измерения освещенности, были настроены регистры АЦП, регистры таймера для использования прерывания по переполнению, чтобы обеспечить запуск преобразования АЦП каждые несколько секунд. Также, была собрана схема для вывода показания с АЦП на семисегментные индикаторы через дешифраторы. |