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 |
|
|