Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Электроника в приборостроении.doc
Скачиваний:
219
Добавлен:
02.05.2014
Размер:
8.49 Mб
Скачать

11.4. Примеры применения микроконтроллеров avr

11.4.1. Ик дальномер

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

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

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

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

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

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

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

Рис. 11.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