Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая Мамаев Богоченков измеритель скорости.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
1.46 Mб
Скачать

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

После отладки работы устройства производят разводку печатной платы. Программная среда 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);

}

}