Мікропроцесорний локатор для сліпих
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. Блок-схема роботи мікропроцесорного локатора для сліпих