double arrow

Примеры применения микроконтроллеров AVR

10.4.1. ИК дальномер

Точное дистанционное измерение расстояния, например, до цели, всегда являлось одной из востребованных задач. Поэтому в качестве примера использования МК AVR рассмотрим ИК дальномер. Принципиальная схема ИК дальномера, выполненная на базе МК ATtiny12L, приведена на рис. 10.6.

В данной схеме ИК излучатель (LED1) – любой светодиод, работающий в ИК диапазоне, желательно ближе к 950 нм.

Светодиод управляется сигналом от контроллера по линии РВ4. Если светодиод имеет прямой ток до 20 мА, то можно включить его прямо на выход МК; если же нет, то, как и в нашем случае, следует поставить транзистор (V1) в качестве ключа. Какой именно транзистор – не важно, лишь бы он был n-p-n типа и был рассчитан на тот же ток, что и выбранный вами светодиод. Резистор R2 надо поставить таким, чтобы ток через светодиод не превышал допустимый для данной модели.

ИК приемник (IF1) – TSOP1736. Сигнал с него поступает непосредственно на вход МК (линия РВ3). В отсутствие подходящего ИК сигнала на выходе приемника присутствует высокий логический уровень, а при появлении сигнала проходит импульс низкого уровня.

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

Индикатором в нашем случае служит "обычный" светодиод LED2, подключенный на линию РВ0 контроллера последовательно с токоограничивающим резистором.

Разъем J1 используется для подключения программатора. Питание +5 В подается на клемму VCC и "землю".

Рис. 10.6. Принципиальная схема ИК дальномера

 

Ниже приводится текст программы управления ИК дальномером.

 

;******************************************************************;

* ИК-локатор: ИК-светодиод на PB4 дает пачки импульсов с частотой;

* около 36 кГц, а TSOP1736 на PB3 их отслеживает;

*;

* MCU: ATtiny12@1MHz (c) RoboClub 2003;******************************************************************

.include "tn12def.inc"  
rjmp RESET ;ручной сброс
;* Объявление переменных
.def t1 = r1 ;счетчик для "длинных" задержек
.def temp = r19 ;счетчик времени задержки
.def count = r20 ;счетчик числа импульсов в пачке
;* Определения  
.equ led = 0 ;LED на PB0
.equ tsop = 3 ;TSOP на PB3
.equ ir_led = 4 ;IR LED на PB4
     
;* Начало кода  
RESET:    
sbi DDRB, led ;подключаем LED на выход PORTB линия 5
sbi DDRB, ir_led ;подключаем IR LED на выход PORTB линия 3
cbi DDRB, tsop ;подключаем TSOP на вход PORTB линия 2
sbi PORTB,tsop ;включаем "подтяжку"
;* Задание значений  
.equ TIME1 = 4 ;длительность импульса
.equ TIME2 = 5 ;задержка между импульсами
.equ TIME3 = 20 ;задержка между пачками импульсов
.equ COUNT = 10 ;число импульсов в пачке
; Главный цикл программы
;******************************************************************;
START:    
Ldi count, COUNT ;загружаем в счетчик число импульсов в пачке
; Цикл выдачи пачки импульсов
FLASH:    
cbi PORTB, ir_led ;зажигаем IR LED
ldi temp, TIME1 ;загружаем в temp длительность импульса
DELAY1:    
dec temp ;уменьшаем на единицу temp, пока
brne DELAY1 ;не станет равным 0
sbi PORTB, ir_led ;гасим IR LED
ldi temp, TIME2 ;загружаем в temp длительность паузы между
  импульсами
DELAY2:    
dec temp ;уменьшаем на единицу temp, пока
brne DELAY2 ;не станет равным 0
dec count ;уменьшаем на 1 счетчик числа импульсов
brne FLASH ;если не 0, то посылаем следующий импульс
    ;когда пачка импульсов выдана - проверяем,
есть ли сигнал от TSOP
sbis PINB, tsop ;если уровень на выходе TSOP низкий
(т.е. сигнал есть),
rjmp LEDON ;то идем зажигать LED,
cbi PORTB, led ;иначе гасим LED
rjmp WAIT_NEXT ;и переходим к ожиданию следующей пачки
LEDON:    
sbi PORTB, led ;гасим LED
; Задержка перед следующей пачкой импульсов
WAIT_NEXT:  
clr t1 ;сбрасываем t1 (т.е. t1=0 или, что то же: t1=256)
ldi temp, TIME3 ;устанавливаем число задержек
DELAY3:    
dec t1 ;задержка по счетчику t1 от 256 до 0
brne DELAY3 ;т.е. 256×3 тактов
dec temp ;повторяем TIME3 раз задержку по t1
brne DELAY3 ;т.е. всего (TIME3×256×3 + TIME3×3) тактов
rjmp START ;переходим к началу главного цикла
END    


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



Сейчас читают про: