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