вот занимаюсь проектом) цель, собрать устройство, которое находит направление источника звука.
схема работы таков:
звук двигается волной, и первый сигнал принимает 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. но единственное что правильно работает, это он находит с права сигнал или с слева.
может быть проблема в микросхеме? что мк не успевает делать каун каждый микросекунд. проблема в мк?






 
 

