Chào tất cả các bác ghé qua luồng của em. Nhờ mọi người chỉ giúp em mấy vấn đề sau:
1. Em dùng con PIC 16F876 để đọc giá trị analog (analog: chân AN0, Vref: chân AN3): Khi chạy mạch thực thì em đã viết code lấy giá trị trung bình của 30 lần đo rồi mới hiển thị kết quả lên led 7 thanh mà sao kết quả nó cứ bị nhảy linh tinh với sai số là khoảng 5% - em dùng ADC 8 bit của PIC. Hỏi các bác hướng khắc phục để đạt được kết quả ổn định hơn.(Em lấy khoảng cách thời gian của mỗi lần lấy mẫu là 10ms có hợp lý ko vậy? theo kinh nghiệm của các bác thì khoảng thời gian lấy mẫu là bao nhiêu là hợp lý nhất, lấy giá trị trung bình bao nhiêu lần là được) và có thuật toán nào để lấy giá trị trung bình ổn định hơn ko ah?
2. Kết quả đó em gửi lên Hyper teminal thì ko vấn đề, tuy nhiên khi gửi lên VB thì nó bị sai ký tự. Ví dụ: kết quả trên led 7 thanh là 1234 thì trên màn hình VB nó lại là các ký tự khác, cho dù e đã thiết lập tốc độ truyền trên VB là đúng rồi. trên VB em cho hiện thị trên một Text. Với lệnh là Text1.Text=MSComm.Input
Code của em rút gọn (bỏ phần hiện thị lên led 7 thanh đây). Mong các bác chỉ giúp:
#include "16F876.h"
#define <16f876.h>
#device adc=8
#use delay(clock=16000000)
#fuses HS, NOWDT, NOPROTECT,NOLVP, NOPUT,NODEBUG,NOCPD
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
unsigned char ketqua[30];
float trung_binh;
unsigned int16 lam_tron,dien_ap;
main()
{
int8 x;
set_tris_b(0b00000000);
set_tris_c(0b00000000);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF); // Cho RA0: analog, RA3:Vref
setup_adc(ADC_CLOCK_INTERNAL); // Dung xung noi cho ADC
set_adc_channel(0); // Set ket AN0
enable_interrupts(GLOBAL); // Thiet lap ngat toan cuc
enable_interrupts(INT_RDA); // Thiet lap ngat truyen thong
while(true)
{
for(x=0;x<30;x++)
{
ketqua[x]=read_adc();
delay_ms(10);
}
trung_binh = ((ketqua[0]+ketqua[1]+ketqua[2]+ketqua[3]+ketqua[4]+ketqua[5]+ketqua[6]+ketqua[7]+ketqua[8]+ketqua[9]+ketqua[10]+ketqua[11]+ketqua[12]+ketqua[13]+ketqua[14]+ketqua[15]+ketqua[16]+ketqua[17]+ketqua[18]+ketqua[19]+ketqua[20]+ketqua[21]+ketqua[22]+ketqua[23]+ketqua[24]+ketqua[25]+ketqua[26]+ketqua[27]+ketqua[28]+ketqua[29])/30); // Tinh trung binh cua 30 lan do.
lam_tron=trung_binh*10;
dien_ap=(lam_tron*1000)/2550; // 0V tuong ung voi gia tri 0, 5V tuong ung voi gia tri 1000;
printf("%lu",dien_ap);
}
}
Mong các bác chỉ giúp.!!!
1. Em dùng con PIC 16F876 để đọc giá trị analog (analog: chân AN0, Vref: chân AN3): Khi chạy mạch thực thì em đã viết code lấy giá trị trung bình của 30 lần đo rồi mới hiển thị kết quả lên led 7 thanh mà sao kết quả nó cứ bị nhảy linh tinh với sai số là khoảng 5% - em dùng ADC 8 bit của PIC. Hỏi các bác hướng khắc phục để đạt được kết quả ổn định hơn.(Em lấy khoảng cách thời gian của mỗi lần lấy mẫu là 10ms có hợp lý ko vậy? theo kinh nghiệm của các bác thì khoảng thời gian lấy mẫu là bao nhiêu là hợp lý nhất, lấy giá trị trung bình bao nhiêu lần là được) và có thuật toán nào để lấy giá trị trung bình ổn định hơn ko ah?
2. Kết quả đó em gửi lên Hyper teminal thì ko vấn đề, tuy nhiên khi gửi lên VB thì nó bị sai ký tự. Ví dụ: kết quả trên led 7 thanh là 1234 thì trên màn hình VB nó lại là các ký tự khác, cho dù e đã thiết lập tốc độ truyền trên VB là đúng rồi. trên VB em cho hiện thị trên một Text. Với lệnh là Text1.Text=MSComm.Input
Code của em rút gọn (bỏ phần hiện thị lên led 7 thanh đây). Mong các bác chỉ giúp:
#include "16F876.h"
#define <16f876.h>
#device adc=8
#use delay(clock=16000000)
#fuses HS, NOWDT, NOPROTECT,NOLVP, NOPUT,NODEBUG,NOCPD
#use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7,bi ts=8)
unsigned char ketqua[30];
float trung_binh;
unsigned int16 lam_tron,dien_ap;
main()
{
int8 x;
set_tris_b(0b00000000);
set_tris_c(0b00000000);
setup_adc_ports(RA0_RA1_ANALOG_RA3_REF); // Cho RA0: analog, RA3:Vref
setup_adc(ADC_CLOCK_INTERNAL); // Dung xung noi cho ADC
set_adc_channel(0); // Set ket AN0
enable_interrupts(GLOBAL); // Thiet lap ngat toan cuc
enable_interrupts(INT_RDA); // Thiet lap ngat truyen thong
while(true)
{
for(x=0;x<30;x++)
{
ketqua[x]=read_adc();
delay_ms(10);
}
trung_binh = ((ketqua[0]+ketqua[1]+ketqua[2]+ketqua[3]+ketqua[4]+ketqua[5]+ketqua[6]+ketqua[7]+ketqua[8]+ketqua[9]+ketqua[10]+ketqua[11]+ketqua[12]+ketqua[13]+ketqua[14]+ketqua[15]+ketqua[16]+ketqua[17]+ketqua[18]+ketqua[19]+ketqua[20]+ketqua[21]+ketqua[22]+ketqua[23]+ketqua[24]+ketqua[25]+ketqua[26]+ketqua[27]+ketqua[28]+ketqua[29])/30); // Tinh trung binh cua 30 lan do.
lam_tron=trung_binh*10;
dien_ap=(lam_tron*1000)/2550; // 0V tuong ung voi gia tri 0, 5V tuong ung voi gia tri 1000;
printf("%lu",dien_ap);
}
}
Mong các bác chỉ giúp.!!!
Comment