В данной курсовой работе был спроектирован измеритель скорости с использованием микроконтроллера. Данный способ проектирования, в среде 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с. Норенков И.П., Маничев В.Б.
- Основы теории и проектирования САПР: Учеб. для втузов по спец. "Выч. маш., компл., сист. и сети".– М.: Высш. шк., 1990. – 335 с.
- Сарафанов А.В., Трегубов С.И. Автоматизация проектирования РЭС: Учебное пособие. – Красноярск: КГТУ, 1999. – 183 с.