вот занимаюсь проектом) цель, собрать устройство, которое находит направление источника звука.
схема работы таков:
звук двигается волной, и первый сигнал принимает PINA.3, затем ждет на какой микрофон попадет следующим, в нашем случае, принял сигнал вторым PINA.1, и программой считаем время до попадания на второй микрофон, и находим t. и что бы найти s,мы находим v*t, где у нас v=300м/с. теперь cos(beta) = s/l, где l мы знаем (расстояние между микрофонами PINA.1 и PINA.0) в моем случае 97см.
ведь должно же так работать?
вот код:
- Код: Выделить всё • Развернуть
/*****************************************************
Chip type : ATmega32
Program type : Application
AVR Core Clock frequency: 16,000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 512
*****************************************************/
#include <mega32.h>
#include <stdlib.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#include <lcd.h>
#define F_CPU 16000000;
#asm
.equ __lcd_port=0x12; PORTB
#endasm
void main(void){
unsigned char ch1[20];
int t = 0;
float beta1;
float beta;
PORTA=0xFF;
DDRA=0x00;
PORTB=0x00;
DDRB=0x00;
PORTC = 0x00;
DDRC = 0xFF;
lcd_init(16);
while (1){
if(PINA.3 == 0){
t = 0;
while(PINA.0 != 0 && PINA.1 != 0){}
if(PINA.0 == 0){
PORTC = 0b00000000;
PORTC.1 = 1;
while(PINA.1 != 0){
t++;
delay_us(1);
}
beta1 = 0.3*t/970;
beta = beta1*180.0/3.14;
sprintf( ch1,"beta= %u", beta );
lcd_gotoxy(0,1);
lcd_puts(ch1);
lcd_gotoxy(0,0);
lcd_puts("in the right");
delay_ms(2000);
PORTC = 0b00000000;
lcd_clear();
}
if(PINA.1 == 0){
PORTC = 0b00000000;
PORTC.0 = 1;
while(PINA.0 != 0){
t++;
delay_us(10);
}
beta1 = 0.3*t/970;
beta = beta1*180.0/3.14;
sprintf( ch1,"beta= %u", beta );
lcd_gotoxy(0,1);
lcd_puts(ch1);
lcd_gotoxy(0,0);
lcd_puts("in the left");
delay_ms(2000);
PORTC = 0b00000000;
lcd_clear();
}
lcd_gotoxy(0,0);
lcd_puts("in IF");
}
PORTC = 0b11110000;
lcd_gotoxy(0,0);
lcd_puts("out IF");
}
}
и при тестировании значение k начинает гнать, то есть показывать 20мкс и в следующий раз может показать 100000мкс. бывает даже когда показывает 0. но единственное что правильно работает, это он находит с права сигнал или с слева.
может быть проблема в микросхеме? что мк не успевает делать каун каждый микросекунд. проблема в мк?