Заключение

В данной курсовой работе был спроектирован измеритель скорости с использованием микроконтроллера. Данный способ проектирования, в среде 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 с.

Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: