mình đang dùng atmega8 để đọc adc về, nhưng mình muốn đọc về 10 lần và lấy trung bình để chống nhiễu, vậy xin hỏi có ai đã từng làm về cái này rồi thì cho mình xin đoạn code nhe.thank
Thông báo
Collapse
No announcement yet.
chống nhiễu ADC bằng software
Collapse
X
-
ATmega8 có chế độ chống nhiễu ADC đấy , bạn xem trong phần Analog-to-Digital Converter phần ADC Noise Canceler . Mình cũng chưa làm thử bao giờ cả . Nếu bạn muốn dùng software để chông nhiễu , tức là lấy giá trị trung bình thì trong CodeVision bạn khai báo biến kiểu volatile vào trỏ đến giá trị adc. Biến kiểu volatile chỉ thay đổi theo phần cứng chứ ko thay đôi theo phần mềm , từ đó bạn rút ra đc 10 giá trị adc khác nhau. Phần này mình mới học thôi , chưa làm bao h cả . Nếu có sai mong bác bỏ quá .Cái gì người khác làm được , mình cũng làm được !
-
Cách tính giá trị trung bình như sau:
main
{
unsigned int count=0;
double sum=0;
....
....
if(count++<10)
{
sum += adc_data[..];
}
else
{
count=0;
adc_val=sum/10;// gia trị trung bình
sum=0;
}
.....
....
}
Nếu trường hợp giá trị trung bình vẫn chưa tốt trong điều kiện khắc khe ( chống nhiễu từ nguồn phát RF cao tần chẳng hạn...) thì bạn dùng thêm bộ digital filter như sau:
main
{
unsigned int count=0;
double sum=0;
float buff[2];
....
....
if(count++<10)
{
sum += adc_data[..];
}
else
{
count=0;
adc_val=sum/10;// gia trị trung bình
sum=0;
buff[1]=buff[0];
buff[0]=adc_val;
adc_val= adc_val -(adc_val-buff[0])*a0 -(adc_val-buff[1]) *a1;// digital filter.
}
delay_ms(...);//giá trị delay ảnh hưởng đến sự trễ pha..
}
Giải thích đơn giản cho digital filter là: giá trị lấy mẫu hiện tại thứ n không chỉ phụ thuộc vào thời điểm hiện tại mà còn phụ thuộc vào thời điểm n-1, n-2,.....Ví dụ ở thời điểm thứ n có nhiễu đột biến thi thành phần thứ n-1 và thứ n-2 trong biểu thức sẽ cân bằng lại ko cho nó tăng quá lớn, giảm nhiễu
Giá trị a0 va a1 bạn phải làm thực nghiệm ( 0<a0,a1<1)> Lưu ý là các phương pháp chống nhiễu như giá trị trung bình hay digital filter đều gây ra trễ pha (đáp ứng chậm hơn so với giá trị thưc tế)
Comment
-
Bác cho em hỏi về cái lấy mẫu adc_data là MCU lấy mẫu theo từng xung clock ạ . Vậy mất bao nhiêu thời gian để lấy mẫu 1 xung vào . Em đọc trong datasheet có dòng này
A normal conversion takes 13 ADC clock cycles. The first conversion after the ADC is switched on (ADEN in ADCSRA is set) takes 25 ADC clock cycles in order to initialize the analog circuitry.Cái gì người khác làm được , mình cũng làm được !
Comment
-
ADC cũng như các loại ngoại vi khác, cần có clock để có thể hoạt động.
Câu trích trên của bạn dịch ra rất rõ nghĩa mà. Mỗi lần chuyển đổi sẽ mất 13 chu kỳ clock. Tuy nhiên lần chuyển đổi đầu tiên sẽ mất 25 chu kỳ clock, lâu hơn vì cần thời gian để khởi tạo và ổn định các mạch điện bên trong ngay sau khi ADC được cho phép hoạt động (turn on, hay có thể coi là cấp nguồn) bằng cách đặt bit ADEN trong thanh ghi ADCSRA lên 1.
Việc delay giữa các lần lấy mẫu là do thuật toán của bạn, tức là bạn muốn lấy mẫu nhanh hay chậm, còn bản thân một chu kỳ chuyển đổi của ADC được tự động tính toán xử lý (người ta gọi là "timing") bên trong nó, khi xong việc sẽ báo ra cờ bên ngoài. Trong suốt quá trình chuyển đổi, CPU (hay chính bạn) làm gì tùy thích.
Thân mến,
blackmoon.
Comment
-
mình định dùng giá trị adc để điều khiển thời gian trễ được không các bạn nhỉ, tại mình chưa làm vậy bao jờ nên không biết lệnh sau có hợp lệ không!
delay_ms(adc_data[0]);
hoặc delay_ms(a);
các bạn júp mình nhéThiết kế chế tạo các loại máy xoáy nắp, chiết rót định lượng dùng trong dược phẩm và thực phẩm.
Comment
-
Nguyên văn bởi Le Thi Bich Xem bài viếtmình định dùng giá trị adc để điều khiển thời gian trễ được không các bạn nhỉ, tại mình chưa làm vậy bao jờ nên không biết lệnh sau có hợp lệ không!
delay_ms(adc_data[0]);
hoặc delay_ms(a);
các bạn júp mình nhé
Nếu bạn ko lấy trực tiếp giá trị của adc_data[0]:
while(1)
{
..
a=f(adc_data[0]);
delay_ms(a);
}
Như thế thì được.
Comment
-
Có một cách chống nhiễu nữa là dùng Runge-Kutta filter để lọc tín hiệu :
Đây là đoạn code mẫu mình viết dùng C :
for (i=0; i < 6; i++)
{
adc_filter_buffer[current_buf][i] = ADC16Ptr[i];
}
for (i=0; i < 6; i++)
{
adc_buf[i] = (adc_filter_buffer[current_buf][i]/6 +
adc_filter_buffer[(current_buf+1)%4][i]/6 +
adc_filter_buffer[(current_buf+2)%4][i]/3 +
adc_filter_buffer[(current_buf+3)%4][i]/3);
}
current_buf = (current_buf+1) % 4;The goal of power electronics is control the flow of energy from an electrical source to an electrical load with high efficiency, high availability, high reliability, light weight and low cost.
Comment
Bài viết mới nhất
Collapse
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Vâng bác, mạch điện cũng dạng như vậy, và vấn đề của nước mình chính là cái khó bó cái khôn, không thể cạnh tranh được với hàng ngoại.
Thực ra mạch em vẽ từ sản phẩm thực tế ở #54 là họ cải tiến từ mạch Boost áp...-
Channel: Điện tử công suất
Hôm qua, 13:58 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi mèomướpDạ thấy chú dinh... có vẻ mặn nồng với đèn sự cố nên cháu rình lúc chị hàng xóm đi vắng bắc thang trèo lên chụp mấy cái đèn nhà chị ấy ạ. Tầm vài trăm cái dùng tuýp led 220v bình thường ấy ạ. Dùng chiếu sáng thay bóng tuýp luôn Hơn...
-
Channel: Điện tử công suất
07-02-2025, 22:38 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi bqvietTheo sơ đồ bạn đã vẽ thì đây chỉ là mạch nguồn flyback không cách ly, phản hồi cả dòng lẫn áp thôi mà. Một dạng nguồn CC-CV thông dụng. Kiếm con chip tốt làm là được, nếu chịu chạy dãy LED có cách ly thì càng tốt.
Vấn đề...-
Channel: Điện tử công suất
07-02-2025, 21:56 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi dinhthuong80Phật có dạy là CHÁNH NIỆM (hay CHÍNH gì ấy, ĐT bị... rối loạn ngôn ngữ và trí nhớ, mong lượng thứ!) - CHÁNH NGỮ - CHÁNH HÀNH ĐỘNG, đó là đường hướng tới CHÁNH ĐẠO.
ĐT ngu muội nên cứ áp dụng vào điện tử: phải cố...-
Channel: Điện tử công suất
06-02-2025, 06:16 -
-
Trả lời cho [HELP] mạch cầu H inverter 100vdc to 100v ?bởi ngoctn93Em cũng có nguồn 250 đến 280vdc muốn chuyển sang 100vac bằng mạch cầu H dùng esg002. Có bác nào làm rồi chỉ em hoặc bán em với ạ. Em xin cảm ơn ạ
-
Channel: Điện tử công suất
05-02-2025, 23:00 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi mèomướpCháu thấy chú nhat... viết toàn cái gì gì ấy ạ khó hiểu ghê, chắc mai cháu phải đi hỏi mấy anh chị lớp lớn hơn xem sao ạ. Những việc lớn tầm cỡ thì hông phải ai cũng có đủ kiến thức, thời gian, sức khỏe, tiền bạc, đam mê, kiên...
-
Channel: Điện tử công suất
05-02-2025, 22:11 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Bác bảo ai lớn tờ iếng tiếng?
Hùng là không nhé. Chỉ bảo tận tình chứ không tận diệt.
Yêu kỹ thuật nên vẫn tham gia cho vui thôi. Mấy của nợ này dùng con PIC hai chục ngàn còn ngon luôn....-
Channel: Điện tử công suất
05-02-2025, 21:38 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi vi van phamThôi mà, anh em giúp đỡ nhau, có gì mà lớn tiếng?
Ai không chịu giúp đỡ nhau thì vào đây nhậu với tui. Bà xã hôm nay ngũ sớm tui được tự do, solo buồn quá, Nhathung,Dinhthuong ,Đinh Vặn gì đó tui cân tuốt.-
Channel: Điện tử công suất
05-02-2025, 21:16 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Thằng I Lôn Mút nó sắp đưa người lên sao Hỏa rồi.
Mấy anh em vẫn bàn cái "Một Phát Phải Thôi" thì nẫu quá.
Ngâm cứu cái gì cho đáng đi. Còn tôi nói gì hơi quá thì xin lỗi nhé.-
Channel: Điện tử công suất
05-02-2025, 19:45 -
-
Trả lời cho Giúp em về mạch MPPT và Solar Panel với!?bởi nhathung1101Và tôi thấy cái này như con bò sữa thôi mà. Nếu xét nguyên lý.
Bóp bóp bóp... đến hết thì thôi. Cái mạch thì nguồn sơ đẳng. Con để bóp thì vu nó lại cáo cào cao.
Ắc qui hay pin thì vưỡn giá nào xào nấy. Inverter thì...-
Channel: Điện tử công suất
05-02-2025, 19:33 -
Comment