Устройство, измеряющие скорость движущегося объекта используются для разных целей

Введение………………………………………………...…………………….. 6

  1. Реализация измерителя скорости……............………………………....... 7
  2. Проектирование цифровой части устройства.......... …………………... 9
  3. Проектирование аналоговой части устройства....................................... 15
  4. Создание печатного узла........................................................................... 20

Заключение....................................................................................................... 22

Приложение...................................................................................................... 23

Список используемой литературы…………………………………………...28


Введение

Устройства, измеряющие скорость движущегося объекта используются для разных целей. Данный прибор создается для измерения скорости пули. Используя полученный результат можно узнать кинетическую энергию, а впоследствии КПД.

Реализовать, данное устройство, можно на микроконтроллере. Захват объекта осуществляется двумя фотоэлементами. Микроконтроллер считает пройденное время и выводит информацию на индикатор.

Точность данного устройства будет зависеть от тактовой частоты микроконтроллера и размера константы в счетчике, чем она выше, тем точнее будут измерения.


1. Реализация измерителя скорости

Мне нужно реализовать измеритель скорости в пределах от 0 до 300 м/c с точностью до 0.5 м/с. Для этого я выбрал микроконтроллер компании Atmel AVR tiny 2313. Характеристики:

Устройство будет состоять из печатной платы с М.К., вывод информации происходит на семисигментные индикаторы, а фиксирование объекта с помощью оптопар. Для универсальности, выводимой информацией будет время а не скорость, так как скорость высчитывается из расстояния между оптопарами, следовательно нужно жестко фиксировать это расстояние или потом производить перепрограммирование М.К. В случае счета времени устройство может мерить более высокие скорости без изменения программы.

В случае, когда измеренное время будет иметь более двух разрядов, на индикаторы выводится «ER», что является сигналом об ошибке. Каждое измерение будет сопровождаться звуковым сигналом с низкочастотного генератора - мультивибратора.

Программа реализует счетчик. Изначально программа в цикле ждет вектора прерывания, сигнала с первой оптопары. Далее начинается подпрограмма, которая считает количество переполнения таймера, инкриментируя переменную TIKS. Считает до тех пор пока не прейдет сигнал со второй оптопары, выходим из подпрограммы и пересчитываем значение переменной во время. Сравниваем полученное значение с 99, если больше то выводим сигнал об ошибке, нет тогда время.

Вывод информации на семисигментные индикаторы происходит по очереди, но с большой частотой не заметной человеческому глазу. Так реализуется динамическая индикация, по очереди подается логический 0 на катоды сегментов, что является землей. Коды цифр записаны в отдельном файле с константами «GaussSpeed.h».

Проектирование

Основной задачей данного курсового проекта является проектирование данного устройства в программной среде от отладки работы микроконтроллера до создания печатной платы. Для этого буду использовать программы:

  1. Splan70
  2. Proteus 8 Professional
  3. Atmel Studio 6.0
  4. Microsoft Visual C++ 6.0


Для создания принципиальной схемы использую программу Splan70. Составление программы лучше вести в программе производителя микроконтроллера: Atmel Studio 6.0. После написания провожу компиляцию и получаю бинарный код программы для выбранного М.К. «GaussSpeed.hex». Далее составляю схему устройства в Proteus 8 Professional, провожу отладку его работы, составляю печатную плату и снимаю характеристики.

Рис 1. Схема устройства созданная в среде Splan.

Для отладки работы измерителя я выбрал программную среду моделирования Proteus.

На данном этапе произвожу отладку работы микроконтроллера с семисегментными индикаторами:

Рис.2 Модель устройства в Proteus 8 Professional

2. Проектирование цифровой части устройства

Начало симуляции:

Отладка работы по шагам, величина 10мС. Вывод двух средних сегментов указывает на ожидание старта счета.

Рис.3 Ожидание смены уровня на порте PD3

Сигнал с первой оптопары:

Рис.4 Начало счета

В данном положении устройство производит счет, одновременно с этим по очереди мигают средние сегменты, регистрируя такты счета.

Сигнал со второй оптопары:

Рис.5 Конец счета

Рис.6 Вывод информации

Микроконтроллер вышел из подпрограммы счета, пересчитал константу счета во время и выводит ее на порт “B”, если значение не превышает заданную величину. Время счета 70 мс.

Динамическая индикация, первая цифра:

У двух индикаторов выводы сегментов A,B…G запараллелены, в данный момент происходит вывод первой цифры.

Рис. 7 Динамическая индикация, первая цифра.

Код цифры семь выводится на PB0…PB6, и подается логический ноль на землю первого индикатора.

Рис. 8 Динамическая индикация, вторая цифра.

Вывод ошибки:

Константа счета больше максимального значения, в следствии чего происходит вывод кода ошибки:

Рис. 9 Вывод ошибки

Снятие осциллограмм с помощью логического анализатора в среде Proteus 8.

Выводы индикатора A,B…G подключены соответственно к A0,A1…A6, A14 и A15 фиксируют наличие логического нуля на индикаторе.

Рис. 10 Осцилограмма сегментов индикатора, вывод кода ошибки

При выводе кода ошибки, меняются уровни на сегментах B,С и D, что соответствует входам А1,A2 и А3 логического анализатора. Выводимый код при нуле А15: 1,1,1,0,1,1,1. Данный код соответствует букве “R” второго индикатора. Код при нуле А14: 1,0,0,1,1,1,1, соответствует букве “Е”.

Рис.11 Обозначение сегментов индикатора

Симуляция работы измерителя скорости с использованием генераторов прямоугольных импульсов:

Рис. 12 Схема устройства с генераторами импульса.


С начала запуска симуляции происходит вывод «--» на индикаторы, следовательно время нарастания импульса нужно выбрать таким чтобы микроконтроллер не успел заметить первой смены уровня на входном порте PD2, выбираем 1n. Для обеспечения времени между следованиями изменения уровня на портах PD2, PD3 на первом генераторе выставляю коэффициент заполнения 10%, на втором 60% и разное значение максимального напряжения.

Рис. 13 Меню параметров генераторов

Результат счета 10 мС, проверяем значения с помощью аналогового анализатора:

Рис. 14 Осциллограмма сигналов с выходов генераторов импульса Pulse 1 и Pulse 2.

Результат измерений подтверждает верный счет времени, 12мС – 2мС = 10мС.


3. Проектирование аналоговой части устройства.

Проектирование мультивибратора:

Рис. 15 Схема устройства с Н.Ч. генеротором

После каждого цикла измерения происходит звуковой сигнал. Для этого происходит вывод логической единицы на порт PB7. Далее транзистор VT 1 замыкает контактное реле. Он нужен для увеличения входного сопротивления схемы коммутации, и увеличения напряжения с 5 до 12 вольт.

Снятие осциллограмм в среде Proteus 8.

После проектирование мультивибратора необходима отладка его работы. Для этого использую цифровой осциллограф и подключаю каналы А и В к выходам схемы, на коллекторы транзисторов.

Для изначальной индикации работы схемы использую активный светодиод и конденсаторы. Эти элементы в ходе работы схемы показывают, как текут токи в ветвях.


Снятие осциллограмм:

Рис. 16 Осциллограмы сигнала на коллекторах транзисторов

Частота выходного сигнала мультивибратора 52 Гц, величина напряжения питания 15 вольт.

Снятие характеристики на большом времени:

Рис.17 Переходной процесс, установление колебаний


Снятие характеристик, используя аналоговый анализ:

Рис.18 Осцилограмма выходного сигнала

Исследование зависимости изменения частоты колебаний от изменения напряжения.

Чтобы построить данную характеристику требуется создать источник линейно изменяющегося напряжения, причем он должен обеспечить установление колебаний. Для этого я использовал генератор импульса со следующими параметрами:

Рис. 19 Параметры генератора линейно изменяющегося напряжения.

Рис. 20 Осциллограмма генератора линейно изменяющегося напряжения.

Схема измерения:

Рис.21 Схема для снятия зависимости частоты от питающего напряжения.

Исследуемую характеристику снимаю с коллектора транзистора VT2.

Рис. 22 Осциллограмма колебаний мультивибратора с линейно изменяющимся питающим напряжением.


Из-за изменения напряжения питания частота генерируемых импульсов практически не меняется, но происходит постепенное изменение формы сигнала:

Рис.23 Форма сигнала при напряжении питания мультивибратора 2.5 В и 12 В.

В следствии чего изменяется спектр сигнала:

Рис.24 Спектр сигнала при напряжении питания мультивибратора 2.5 В и 12В.

Анализ схемы на переменном токе «AC sweep», проводим изменяя емкость конденсатора С2. Значения емкости: 10u, 8.2u, 6.4u, 4.6u, 2.8u, 1u.

Рис.25 Значения констант в анализе на переменном токе.

Рис.26 Семейство характеристик при анализе на переменном токе, меняется емкость.

Создание печатной платы:

После отладки работы устройства производят разводку печатной платы. Программная среда Proteus 8 позволяет использовать функцию автотрассировки печатной платы. Используя подпрограмму ARES рисуем контур печатной платы и размещаем компоненты, так чтобы обеспечить максимально короткую длину дорожек. Данное устройство является измерительным, токи в ветвях не превышают 100-200 мА. Разводку делаем в два слоя. Это позволит упростить дальнейшее изготовление печатной платы.


Рис.27 Модель дорожек печатной платы, вид сверху.

Рис.28 3D модель устройства, вид сверху.

Рис.29 3D модель устройства, вид снизу.

Заключение

В данной курсовой работе был спроектирован измеритель скорости с использованием микроконтроллера. Данный способ проектирования, в среде ISIS Proteus очень удобен так как позволяет производить отладку схемы до ее сборки. Следовательно, имеется возможность включить в состав устройства дополнительные функции, например звуковой сигнал. Также имеется возможность составить эксплуатационные параметры, и снять необходимые характеристики сигналов. Автотрассировка печатной платы и 3D модель выполнены в среде ARES Proteus. Имеется возможность доработки устройства с целью повысить удобство считывания показаний, выводить не время, а сразу скорость объекта. Для этого необходимо изготовить насадку на ствол, с точными прорезанными отверстиями для оптопар. В таком случае будет утрачена возможность изменения расстояния между ними и как следствие диапазон измеряемых скоростей. Аналоговую часть можно доработать, ограничив время работы контактного реле. Для этого достаточно включить в схему транзистор в базе, которого имеется емкость. Базовый ток будет протекать, пока не зарядится конденсатор, а разряд обеспечить резистором.


Приложение

В данном Приложении представлены: текст программы для МК, Принципиальная электрическая схема устройства по ГОСТ и карта деталей.

Программа на языке С++:

/*

* GaussSpeed.c

*

* Author: Ilia

*/

#include "GaussSpeed.h"

volatile uint32_t ticks = 0;

volatile uint8_t is_started = FALSE;

volatile uint8_t is_stoped = FALSE;

int main(void)

{

init_io();

init_interupts();

sei();

for (int i = 0; i < INDICATORS; i++)

{

PORTD &= ~set(PINS[i]);

}

PORTB = MINUS;

while(!is_started);

for (int i = 0; i < INDICATORS; i++)

{

PORTD |= ~set(PINS[i]);

}

while(!is_stoped)

{

for (int i = 0; i < INDICATORS; i++)

{

PORTD &= ~set(PINS[i]);

_delay_ms(BLINK_DELAY);

PORTD |= set(PINS[i]);

_delay_ms(BLINK_DELAY);

}

}

while(TRUE);

return 0;

}

ISR(INT0_vect)

{

start();

}

ISR(INT1_vect)

{

stop();

}

ISR(TIMER0_OVF_vect)

{

ticks++;

}

uint8_t set(uint8_t bit)

{

return (uint8_t)(1 << bit);

}

void init_io(void)

{

for (int i = 0; i < INDICATORS; i++)

{

DDRD |= set(PINS[i]); // Порт D ввод

PORTD |= set(PINS[i]);

}

DDRB = ~set(7); //Настраиваем на вывод порт B

}

void init_interupts(void)

{

MCUCR = set(ISC00) | set(ISC10); // Настраиваем прерывания

GIMSK = set(INT1) | set(INT0);

TCCR0B = set(CS00);

}

void start(void)

{

TIMSK |= set(TOIE0); // Зачищаем все лишнее в регистре флагов и таймер-счетчика, //разрешаем прерывания

TIFR = 0x00;

TCNT0 = 0x00;

is_started = TRUE; Флаг

}

void stop(void)

{

TIMSK &= ~set(TOIE0);

is_stoped = TRUE; // запрещаем прерывания по пер. таймера

display(); //бесконечн. Вывод инф

}

void display(void)

{

// ВЕСЬ ИНДИКАТОР ЭТО МИНУС, , СЕГМЕНТ -- ПЛЮС

for (int i = 0; i < INDICATORS; i++)

{

PORTD |= ~set(PINS[i]);

}

uint16_t timer = (double) ticks / (F_CPU / TIMER0_BUFFER / MS_IN_S);

if (timer > MAX_NUMBER)

{

uint8_t digit = 0;

while (1)

{

PORTD &= ~set(PINS[digit]);

switch (digit)

{

case 0:

PORTB = Dr;

break;

case 1:

PORTB = DE;

break;

case 2:

case 3:

PORTB = 0x00;

break;

}

_delay_ms(UPDATE_DELAY);

PORTD |= set(PINS[digit]);

if (digit < INDICATORS - 1)

{

digit++;

}

else

{

digit = 0;

}

_delay_ms(UPDATE_DELAY);

}

}

uint8_t digit = 0;

while (1)

{

PORTD &= ~set(PINS[digit]);

switch (digit)

{

case 0:

PORTB = DIGITS[timer % 10];

break;

case 1:

PORTB = DIGITS[timer / 10 % 10];

break;

case 2:

PORTB = DIGITS[timer / 100 % 10];

break;

case 3:

PORTB = DIGITS[timer / 1000];

break;

}

_delay_ms(UPDATE_DELAY);

PORTD |= set(PINS[digit]);

if (digit < INDICATORS - 1)

{

digit++;

}

else

{

digit = 0;

}

_delay_ms(UPDATE_DELAY);

}

}

Файл с константами:

/*

* GaussSpeed.h

*

* Author: Ilia

*/

#ifndef GAUSSSPEED_H_

#define GAUSSSPEED_H_

// 8 MHz

#define F_CPU 8000000

#include <avr/io.h>

#include <util/delay.h>

#include <avr/interrupt.h>

#define D1 (uint8_t) 0b10110000 //

#define D2 (uint8_t) 0b11101101 //

#define D3 (uint8_t) 0b11111001 //

#define D4 (uint8_t) 0b10110011 //

#define D5 (uint8_t) 0b11011011 //

#define D6 (uint8_t) 0b11011111 //

#define D7 (uint8_t) 0b11110000 //

#define D8 (uint8_t) 0b11111111 //

#define D9 (uint8_t) 0b11111011 //

#define D0 (uint8_t) 0b11111110 //

#define MINUS (uint8_t) 0b10000001 //

#define DE (uint8_t) 0b11001111 //

#define Dr (uint8_t) 0b10000101 //

#define OPT0 2

#define OPT1 3

#define MS_IN_S 1000

#define TIMER0_BUFFER 256

// Depending on indicators number

#define MAX_NUMBER 99

// Number of used indicators

#define INDICATORS 2

// Running mode blink delay

#define BLINK_DELAY 125

// Result display mode update delay

#define UPDATE_DELAY 5

#define TRUE 1

#define FALSE 0

const uint8_t DIGITS[] = {D0, D1, D2, D3, D4, D5, D6, D7, D8, D9};

// Indicators pins from 0 to 3 digit

const uint8_t PINS[] = {1, 0, 4, 5};

void init_interupts(void);

void init_io(void);

uint8_t set(uint8_t);

void display(void);

void stop(void);

void start(void);

#endif /* GAUSSSPEED_H_ */
Список используемой литературы:

1.Белов – «Создаем устройства на микроконтроллерах AVR» , изд. «Энергия»
Москва 2007.-304с.

2. П. Хоровиц, У. Хилл – «Искусство схемотехники», издание шестое, изд. «МИР», Москва 2003

3. Разевиг В.Д. Применение программ P-CAD и Pspise для схемотех-

нического моделирования на ПЭВМ: В 4 вып. Вып 2. Модели компонентов

аналоговых устройств. – М.: Радио и связь, 1992. – 64с. Норенков И.П., Маничев В.Б.

  1. Основы теории и проектирования САПР: Учеб. для втузов по спец. "Выч. маш., компл., сист. и сети".– М.: Высш. шк., 1990. – 335 с.
  2. Сарафанов А.В., Трегубов С.И. Автоматизация проектирования РЭС: Учебное пособие. – Красноярск: КГТУ, 1999. – 183 с.

PAGE \* MERGEFORMAT 1

Устройство, измеряющие скорость движущегося объекта используются для разных целей