
- •Микропроцессорная система контроля расстояния
- •Содержание
- •Введение
- •1 Обзор источников информации
- •2 Выбор датчиков информации
- •3 Разработка алгоритма контроля и управления
- •4 Выбор семейства и типа микроконтроллера
- •5 Разработка структурной схемы устройства
- •6 Разработка принципиальной схемы устройства
- •7 Разработка алгоритма работы
- •8 Разработка и отладка программных средств
- •9 Расчет потребляемой микропроцессорным устройством мощности
- •10 Расчёт надежности спроектированного устройства
- •Заключение
- •Техническое задание
- •3.1 Требования к функциональным характеристикам
- •4 Этапы работы
- •Функциональная спецификация микропроцессорной системы управления бегущей строкой
- •Список использованных источников
Функциональная спецификация микропроцессорной системы управления бегущей строкой
1) Автоматическая система управления «ультразвуковой дальномер»должен выполнять следующие функции, обладать следующими свойствами:
1.1 Измерение расстояния;
1.2 Запись результатов измерения;
1.3 Отображение результатов;
1.4 Дружественный интерфейс.
2) Средства реализации указанных функций:
2.1 Измерение осуществляется с помощью ультразвуковых датчиков.
2.2 Запись измерения осуществляется во встроенную память. Записываются данные циклично, если память заполнена, то старые данные будут перезаписаны
2.3 Отображение осуществляется с помощью дисплея.
3) Способы взаимодействия системы и пользователя:
3.1 Инициализация измерения от кнопки;
3.2 Просмотр данных осуществляется инкрементным и декрементным методом с помощью кнопок;
3.3 Сброс памяти с помощью кнопки.
4) Входы и Выходы:
4.1 Входы:
- клавиатура;
- K входу устройства подключается принимающий ультразвуковой датчик.
4.2 Выходы:
- К выходу устройства подключается излучающий ультразвуковой датчик.
- Дисплей;
Приложение
В
(Обязательное)
Структурная схема микропроцессорной системы контроля расстояний.
Рисунок В1 - Структурная схема микропроцессорной системы управления бегущей строкой.
Эта микропроцессорная система состоит из следующих элементов:
-
МК – микроконтроллер;
-
УВ – ультразвуковые волны;
-
УС1,УС2,УС3 – Устройство сопряжения;
-
- Клавиатура – устройства управления;
-
- Приемник УЗВ – приемник ультразвуковых волн;
Принцип действия:
- При нажатий кнопки “Измерение” МК выдает сигнал “пуск”, который через УС 4 поступает на УЗВ передатчик и одновременно запускает таймер.
- Передатчик излучает УЗВ в направление препятствия. Отраженный от препятствия сигнал попадает на приемник. Приемник выделяет сигнал, которые поступает в контроллер и останавливает таймер. Контролер считывает показания таймера и через таблицу перекодировки определяет расстояния до препятствия.
- Результат измерения выводиться на дисплей, и сохраняется в памяти.
- С помощью клавиатуры можно просматривать сохраненные. измерения.
Приложение Д
(Обязательное)
Принципиальная
схема
Рисунок Г1 – Принципиальная схема
Приложение Д
(Обязательное)
Выбор элементной базы и составление перечня элементов
Таблица Д1 – Перечень элементов
Обозначение |
Наименование |
Кол |
Примечание |
|||
|
Микросхемы |
|
|
|||
DD1 |
Микросхема ATtiny2313 |
1 |
ЦПУ |
|||
HG1 |
LAY |
1 |
дисплей |
|||
BA1,BA2 |
Передатчик, приемник |
|
|
|||
|
Полупроводники |
|
|
|||
VT1-VT5 |
Транзисторы KT321A |
5 |
|
|||
VD1,VD2 |
Диод |
2 |
|
|||
|
Ключи |
|
|
|||
SB1 |
Кнопка RESET |
1 |
|
|||
SB2 |
Кнопка START |
1 |
|
|||
|
Конденсаторы |
|
|
|||
С1,С2,C3,C4,С5 |
К54 5В 0.1мкФ |
4 |
|
|||
|
Разъемы |
|
|
|||
X1 |
IDC-10MS |
1 |
|
|||
X2 |
Питания |
1 |
|
|||
|
Резисторы |
|
|
|||
R1,R4,R18, R25,R26 |
Резистор 10кОм |
5 |
|
|||
R14-R17,R23 |
Резистор 1кОм |
5 |
|
|||
R2-R3,R21 |
Резистор 20кОм |
3 |
|
|||
R22 |
Резистор 200кОм |
1 |
|
|||
R5-R13 |
Резистор 300кОм |
9 |
|
|||
|
|
|
|
Приложение Е
(Обязательное)
Листинг программы с комментариями
#include
<avr/io.h>
#include <avr/interrupt.h>
#include
<math.h>
#include <util/delay.h>
#define iter
64000UL // переполнение
= 8 мс
#define HI(x) ((x)>>8)
#define
LO(x) ((x)&0xFF)
// a f b e d dp c g
//
0 1
2 3 4 5 6
7 8 9 .
volatile unsigned char codes[] =
{0xFA,0x22,0xB9,0xAB,0x63,0xCB,0xDB,0xA2,0xFB,0xEB,0x04,0x00};
volatile
unsigned char answer[] = {0x00, 0x00, 0x00};
volatile unsigned
char flags = 0b0000000;
//
||
//
| ----- прерывание
ИНТ0
//
------ прерывание
ИНТ1
volatile unsigned int
ov_count = 0;
volatile unsigned int iteration =
0;
volatile float dist = 0;
volatile
unsigned int ans = 0;
/*
Функция перевода
числа в
коды, для
отображения
на
динамической индикации
*/
void FORMAT(unsigned int val)
{
unsigned
char a, b, c, temp = 0;
a =
val/100;
temp = val - 100*a;
b =
temp/10;
c = temp - b*10;
answer[0] = codes[a];
answer[1] = codes[b];
answer[2] = codes[c];
}
/* Функция
отображения данных
на индикаторе
*/
void DISPLAY()
{
PORTB = answer[0];
PORTD |= 0b00010000;
_delay_ms(5);
PORTD &= 0b11101111;
PORTB = answer[1];
PORTD |= 0b00100000;
_delay_ms(5);
PORTD
&= 0b11011111;
PORTB
= answer[2];
PORTD |= 0b01000000;
_delay_ms(5);
PORTD &= 0b10111111;
}
/* Функция
отправки пачки
УЗ импульсов
(10 шт) */
void SENDIMPULSE()
{
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
PORTD |= 0b00000001;
_delay_us(12.5);
PORTD &= 0b11111110;
_delay_us(12.5);
}
// Обработчие
прерывания от
таймера 1
ISR(TIMER1_COMPA_vect)
{
ov_count++;
}
// Обработчик
внешнего прерывания
INT1 (пришло эхо)
ISR(INT1_vect)
{
TCCR1B = 0b00001000; //останавливаем
таймер
flags |=
0b00000010;
}
//
Обработчик внешнего
прерывания INT0 (нажата
кнопка)
ISR(INT0_vect)
{
flags |= 0b00000001;
}
int main()
{
cli(); // запрещаем
все прерывания
DDRB = 0b11111111; // все
ноги порта
В на вывод
DDRD = 0b11110011; // все
кроме инт1
и инт0 на
вывод, те
на ввод
// даташит с
62 страницы
MCUCR &= 0b11111010; //
прерывания инт1
и инт0 по
falling edge
GIMSK = 0b11000000; //
разрешаем прерывание
инт1 и инт0
TCCR1A = 0b00000000; // выбираем
режим СТС
TCCR1B = 0b00001000; // таймер
пока остановлен
OCR1AH = HI(iter); // старший
байт
OCR1AL =
LO(iter); // младший
байт
TIMSK
= 0b01000000; // прерывание по
сравнению
sei(); // разрешаем все
прерывания
for(;;)
{
if((flags & 0b00000001) == 1) // если
взведен флаг
инт0
{
TCCR1B = 0b00001000; //
останавливаем счетчик
ov_count = 0;
// обнуляем переменную
переполнения счетчика
TCNT1H = 0;
// обнуляем
значения счетчика
TCNT1L = 0;
flags &= 0b11111110; // очищаем
флаг
TCCR1B = 0b00001001; //запускаем
счетчик
SENDIMPULSE();
//начинаем посылать
импульсы
}
if((flags & 0b00000010) == 2) // если
взведен флаг
инт1
{
cli();
// запрещаем
все прерывания
flags &= 0b11111101; // очищаем
флаг
iteration = 0;
// обнуляем
перменные
dist = 0;
ans
= 0;
iteration |=
TCNT1H;
iteration
<<= 8;
iteration |=
TCNT1L; // прочитали
значение счетчика
dist =
(iteration * 0.000125 + ov_count) * 16.5; // посчитали
расстояние в
см
ans = trunc(dist + 0.5); //
округлили
FORMAT(ans);
// софрмировали ответ
для отображения
sei();
// разрешили все
прерывания
}
DISPLAY();
// отображаем
что насчитали
}
return(0);
}