Мікропроцесорний локатор для сліпих

дипломная работа

3.2.4 Підключення вузла сигналізування про перешкоду

Вузол сигналізування про перешкоду включений в схемі двотактового емітерного повторювача. Він складається з двох транзисторів BC547, конденсатора та динаміка 0,25 ГДШ-7.

Рис. 3.12. Вузол сигналізування про перешкоду

Для визначення ємності конденсатора скористаємось формулою:

F=1/(2*3.14*R*C) (3.1)

де F- мін.частота,вона становить 400Гц ,

R- опір навантаження = 8 Ом ,

С- необхідна ємність в фарадах.

В формулу підставляємо значення і отримуємо С= 700мкФ.

Вузол сигналізування про перешкоду підключається до виходу напругиPWM1.

Рис.3.13. Фрагмент схеми електричної принципової. Підключення вузла сигналізування про перешкоду

3.3 Розробка програми функціонування мікропроцесорного локатора для сліпих

Для початку роботи з мікроконтролером, необхідно його ініціалізувати. Під ініціалізацією розуміється встановлення дозволів переривань, налаштування режиму роботи, частоти синхронізації. Для виконання цієї задачі у програмі є функція voidinitializeChip():

voidinitializeChip() { // ініціалізація мікроконтролера

T3CON=0x083; // дозволи переривань, та інші параметри

T3FD= 0x02D;

SCON = 0x052;

EA = 1;

EADC = 1;

CCONV = 1;

}

Окрім, задання початкових параметрів мікроконтролера, необхідно ініціалізувати додаткові вузли. Функції initialize ADCiinitialize PWM відповідають за задання параметрів функціонування вузлів АЦП та ШИМ.

void initializeADC() // ініц ацп

{

ADCCON1 = 0x0AC; // встановлення частоти

ADCCON2 = CHAN ; // вибір каналу

}

void initPWM() { // ініт pwm1 та 2

//Configure the baud rate 9600

SCON = 0x52;

//Configure Time Interval Counter

TIMECON = 0x13; // configure the Time Interval Counter to count a single period in miliseconds // вибір інтервалу

INTVAL = 0x1; // 1 second // встановлення значення для інтервалу

//Configure External Interrupt

IEIP2 = 0xA4; // enable TIC interrupt // // дозвіл переривань таймера

EA = 1; // enable interrupts // дозвіл переривать загалом

}

Для генерації інфрачервоного сигналу з заданими параметрами використовується світло діод, підєднаний до pwm виходу. Цей вихід генерує переривання з заданною частототою:

void TIC_int () interrupt 10 { // переривання - викликається при проходженні часу, в нашому випадку - 1 сек

TIMECON =0x13; // запустити таймер заново

LED1 ^= 1; // змінити значення на виході

}

При завершуванні зчитування наступної порції інформації АДЦ генерує переривання. Функція void adc_int викликається при генерації переривань від АЦП. Ця функція необхідна для буферизації сигналу, що генерується АЦП. Крім того, ця функція виконує опрацювання цього сигналу.

void adc_int() interrupt 6 {

short data = ADCDATAH; // старша частина (4 біти - номер каналу; 4 біти - значення сигналу)

data = ( data << 8 ) | ADCDATAL; // молодша частина (8 біт значення сигналу)

EnterCriticalSection( &gCS ); // вхід у критичну секцію

gSignal[ gCount++ ] = data; // додаємо отримане значення до буферу

if ( SIGNAL_LENGTH_LENG < gSignal.count ) { // перевіряємо чи достатня кількість значень для обрахунку площі

int IMX[ SIGNAL_LENGTH ];

std::fill_n(IMX, SIGNAL_LENGTH, 0); // заповнюємо масив 0

FFT( &gSignal, &IMX, SIGNAL_LENGTH ); // викликаємо функцію швидкого перетворення фур"є. Значення повертаються в змінні gSignal, IMX

int areaSize = getAreaSize( ); // отримуємо площу сигналу

if (( MIN_AREA_SIZE > areaSize ) // перевіряємо чи вона у допустимих межах

|| ( MAX_AREA_SIZE < areaSize )) {

Send Signal ( signal State. BARRIER ); // попереду перешкода, надсилаємо відповідний сигнал

}

else {

sendSignal( signalState.OK ); // попереду все ок

}

std::fill_n(gSignal, gCount, 0); // очищаємо буфер

gCount = 0;

}

LeaveCriticalSection( &gCS ); // виходимо з критичної секції

}

Після обробки сигналу, починає виконання функція sendSignal, яка відповідає за сповіщення користувача про наявність перешкоди, та у разі необхідності надсилає сигнал тривоги.

void sendSignal( int aState ) { // визначення чи є попереду перешкода

switch( aState ) {

case ignalState.OK: // перешкода є, програти сигнал

playSound();

break;

case ignalState.BARRIER: //перешкоди немає, припинити програвання сигналу.

stopSound();

break;

default:

// error occure // відбулася якась помилка// цей рядок можна видалити

}

}

void playSound() {

LED2 = 1; // встановлюємо значення на виході в 1 - програти сигнал

}

void stopSound() {

LED2 = 0; // встановлюємо значення на виході в 0 - зупинити програвання

}

Блок-схема роботи мікропроцесорного локатора для сліпих приведена на рис.3.14.

Рис.3.14. Блок-схема роботи мікропроцесорного локатора для сліпих

Делись добром ;)