[cần giúp đỡ] cách lấy mẫu ADC

darknight2804

Trứng gà
Chào các anh chị và các bạn.

Mình là thành viên mới, và mình mong nhận được sự giúp đỡ rất nhiều từ các bạn. Hiện tại mình đang làm đề tài lấy tín hiệu ADC để hiển thị & vẽ đồ thị lên điện thoại di động.

Mình có đọc thử 1 số tài liệu thì họ bảo để vẽ được cần phải lấy mẫu ADC. Mình gặp vấn đề lớn tại chỗ này vì mình ko hiểu và ko biết cách code thế nào. Hiện tại kết quả mình đạt được chỉ là hiển thi được ADC lên điện thoại thông qua UART.

Code C mình viết bằng CCS Compile PWD chỉ dừng lại là read_adc() mà thôi :
Code:
#include <16F887.h>
#device pic16f887*=16 ADC=10
#fuses NOWDT, PUT, HS, NOPROTECT,NODEBUG,NOBROWNOUT,NOLVP,NOCPD,NOWRT
#Use delay(clock = 20000000)
#use rs232 (baud=9600 , parity=n , xmit=pin_C6 , rcv=pin_C7)
 
int value;
void main()
{   
      set_tris_d(0x00);
      ENABLE_INTERRUPTS(GLOBAL);
      setup_adc_ports(ALL_ANALOG);
      setup_ADC(ADC_CLOCK_DIV_32); 
      set_adc_channel(0);
 
      while(1)
      {
      int t;
      delay_ms(500);
      value=read_adc();
      t = 35 + value*0.02745098039;
      printf("%d\n\r",t);
     
      }
}
trong code C mình phải thêm những yêu cầu lấy mẫu thế nào, và đối với phần nhận là điện thoại thì yêu cầu đặt ra phải làm là gì. Mình thực sự rất cần sự giúp đỡ của mọi ng.

Mình mới tìm hiểu về ADC, mong các bạn chỉ giáo cho mình nhiều. Cảm ơn mọi ng
 

40701002

Thành Viên PIF
Mình không biết bạn hiểu thế nào về chu kỳ lấy mẫu. Mình có vài ý kiến để bạn tham khảo.
Nếu bạn có một tín hiệu có tần số cắt wb, thì bạn nên chọn tần số lấy mẫu gấp 10 lần tần số cắt của nó, nhằm ko làm méo dạng tín hiệu sau khi đọc ADC.
Trong điều khiển, chu kỳ lấy mẫu là khoảng thời gian cố định giữa hai lần bạn lấy dữ liệu từ một đối tượng bạn muốn điều khiển.Đối với lò nhiệt là từ 1s đến 2s. Đối với động cơ là từ 10ms đến 30ms.Ví dụ đối tượng là lò nhiệt, bạn có thể sau 2s, ra đọc ADC một lần, sau đó đem mẫu dữ liệu này đi xử lý. Tuy nhiên, nếu bạn sợ trong khoảng 2s, có nhiều nhiễu tác động thì bạn có thể chọn 1ms bạn đọc ADC một lần, sau đó tính trung bình, nhưng phải đủ 2s bạn mới đem mẫu dữ liệu đó đi xử lý. Vì vậy, để tạo chu kỳ lấy mẫu đúng, bạn nên viết code trong ngắt timer với định thời bằng với chu kỳ lấy mẫu.
 

trungtruc0512

Trứng gà
bạn có thể tham khảo cách này:
Code:
ketqua[k]=read_adc();
k++;
if(k>9)k=0;//lay 10 mau de chia trung binh
adc_aver=0;
for(i=0;i<10;i++)
adc_aver+=ketqua[i];[/I]
[I]adc_aver=adc_aver/10;[/I]
 
[I]
=> dua adc_aver ra tinh toan va hien thi[/I]
 
Top