Em đang làm project đo k/c dùng sóng siêu âm với 2 con thu, phát siêu âm. Em định dùng timer 2 để tạo xung 40Khz (25uS) và dùng Input capture của timer 1 để nhận tín hiệu phản hồi Từ đó tính ra thời gian. Các bước em làm như sau:
1. Dùng timer 2 tạo xung (chế đọ Fast PWM) f= 1Mhz (ko hệ số). với TCNt2= 230 và OCR2 = 245
2. Dùng ngắt khi tràn bộ đệm của timer 2 để khởi tạo lại giá trị TCNT2
3. Dùng chế độ Input Capture của timer 1 và gặp xung lên thì ngắt .
4. Trong chương trình ngắt Input Capture . Em cho biến timer = ICR1. Tắt timer 1, 2. Delay khoảng 100 ms. Sau đó bật lại timer 1, 2.
5. Trong hàm main em xuất ra LCD gá trị thời gian.
Các bác xem em làm vậy có ổn không ? Đây là code của em. Em dùng At8. f= 1Mhz. timer ko có hệ số
Các bác cho em hỏi là code viết vậy đã ổn chưa ?(do hiện giờ em chưa có sensor nên chưa test được,đành viết code trước thôi ).
Nếu làm mạch thì nên khuyếch đại thu và phát như thế nào ? (em định dùng LM324 cho cả thu và phát).
Thank các bác nhiều
1. Dùng timer 2 tạo xung (chế đọ Fast PWM) f= 1Mhz (ko hệ số). với TCNt2= 230 và OCR2 = 245
2. Dùng ngắt khi tràn bộ đệm của timer 2 để khởi tạo lại giá trị TCNT2
3. Dùng chế độ Input Capture của timer 1 và gặp xung lên thì ngắt .
4. Trong chương trình ngắt Input Capture . Em cho biến timer = ICR1. Tắt timer 1, 2. Delay khoảng 100 ms. Sau đó bật lại timer 1, 2.
5. Trong hàm main em xuất ra LCD gá trị thời gian.
Các bác xem em làm vậy có ổn không ? Đây là code của em. Em dùng At8. f= 1Mhz. timer ko có hệ số
Code:
#include <mega8.h> #include <delay.h> volatile unsigned int time; interrupt [TIM1_CAPT] void timer1_capt_isr(void) { time =(unsigned int) ICR1H*256+ICR1L; //Tat timer 1,2 TCCR2=0; TCCR1B=0; delay_ms(100); //Bat lai timer 2 TCCR2=0x69; TCNT2=0xE6; //Bat lai timer 1 TCCR1B=0xC1; TCNT1H=0x00; TCNT1L=0x00; } interrupt [TIM2_OVF] void timer2_ovf_isr(void) { TCNT2=0xE6;} void main(void) { PORTB=0x08; // PB3 (OC2) is Output DDRB=0x08; // Timer/Counter 1 initialization // Clock source: System Clock // Clock value: 1000.000 kHz // Mode: Normal top=FFFFh // Noise Canceler: On // Input Capture on Rising Edge // Input Capture Interrupt: On TCCR1A=0x00; TCCR1B=0xC1; // 1100 0001 ICNC1= ICES1=1 (raising edge). CS10=1 (NO prescale) TCNT1H=0x00;TCNT1L=0x00;ICR1H=0x00;ICR1L=0x00;OCR1AH=0x00;OCR1AL=0x00;OCR1BH=0x00;OCR1BL=0x00; // Timer/Counter 2 initialization // Clock value: 1000.000 kHz // Mode: Fast PWM top=FFh // OC2 output: Non-Inverted PWM ASSR=0x00; TCCR2=0x69; // 0110 1001 WGM20 = COM21 = WGM21 = CS20 = 1 (Fast PWM & NO prescale) TCNT2=0xE6; // T = 230 -> 255 ( 25uS) OCR2=0xF5; // duty cycle = 230 -> 245 (15uS) // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x60; // 0110 0000 TOIE2 = TICIE1 = 1 (cho phep ngat input capture & ngat tran timer 2) ACSR=0x80; SFIOR=0x00; // Global enable interrupts #asm("sei") while (1) { }; }
Nếu làm mạch thì nên khuyếch đại thu và phát như thế nào ? (em định dùng LM324 cho cả thu và phát).
Thank các bác nhiều
Comment