Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
разное / Проектирование ЦИУ (Михайлов, Родионов).doc
Скачиваний:
266
Добавлен:
15.06.2014
Размер:
5.81 Mб
Скачать

10.4. Примеры применения микроконтроллеров 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

;т.е. 2563 тактов

dec

temp

;повторяем TIME3 раз задержку по t1

brne

DELAY3

;т.е. всего (TIME32563 + TIME33) тактов

rjmp

START

;переходим к началу главного цикла

END