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
Nếu như vậy thì có phải delay cho mỗi lần lấy mẫu ko ạ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
-
Mình ko rõ bạn dùng cái này với mục đích gì. Giá trị adc_data[0] thay đổi liên tục (dù ít hay nhiều) nếu bạn sử dụng interrupt để lấy mẫu, làm sao bạn kiểm soát được chương trình?Hàm delay thưc chất là vòng lặp các lệnh "nop" trong assembler, biến vòng lặp ở đây liên quan tới giá trị adc_data[0], mà adc_Data[0] thay đổi mỗi khi có ngắt.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 Yêu thơ mê nhạc, mời các bác vào đây!bởi vi van phamHôn nhân của tôi dường như có bàn tay sắp đặt của ông tơ, bà nguyệt. Bà xả nói tôi viết hồi ký duyên số này. Tôi đã viết vào tập 100 trang học sinh. Sau 50 năm lật tới, lật lui xem quyển hối ký có nơi rách nát. Tôi viết lại bằng AI, giọng đọc VBBe, ca sĩ hát là là Synthesizer V.
...-
Channel: Tâm tình dân kỹ thuật
Hôm qua, 14:18 -
-
Trả lời cho Công thức tính định luật kirchhoffbởi nguyendinhvanCông thức này chắc là để áp dụng cho UAV để bắn máy bay F15....
-
Channel: Hỗ trợ học tập
14-05-2026, 21:17 -
-
Trả lời cho Yêu thơ mê nhạc, mời các bác vào đây!bởi dinhthuong92GIỚI THIỆU CA KHÚC VỀ CHA MẸ:
Nặng Nghĩa Mẹ Cha
Sáng tác: Hoàng Đình Thường
Giọng hát: AI
Công cha cao tựa như Thái Sơn
Nghĩa mẹ sâu nước biếc xanh trong
Mong con khôn lớn đời hạnh phúc
Mẹ cha...-
Channel: Tâm tình dân kỹ thuật
12-05-2026, 16:22 -
-
bởi afrendlyCảm ơn bạn. Mình hỏi để thợ có thể tham khảo thôi chứ không đủ kiển thức để sửa, mà cũng không có đồ nghề, mua đồ nghề quá tiền máy. Gọi nhiều lần mà thợ hẹn mãi chưa có tới ấy bạn. Mình muốn sửa được chứ bỏ thì uống, nhưng sợ là được mỗi người thợ mà lại không sửa nổi....
-
Channel: Điện tử gia dụng
11-05-2026, 00:34 -
-
bởi mèomướpDạ nó bị tắc ẩm hoặc rò thiếu gas hoặc lốc yếu hoặc van tiết lưu có vấn đề hoặc tất cả những nguyên nhân trên ạ. Chú ko chuyên về mảng này thì bán đi, giành thời gian trồng rau sạch đem ra chợ bán lấy tiền mua tủ mới ạ. Còn...
-
Channel: Điện tử gia dụng
10-05-2026, 17:01 -
-
bởi afrendlyXin chào mọi người. Mình lại có vấn đề về đồ điện cần nhờ mọi người hỗ trợ giúp. Mình có tủ lạnh Sharp dùng cũng lâu rồi. Trước có bị kém lạnh, không đông đá thì có thợ họ mang về, sục đường ga gì đó hết 900k và đã dùng...
-
Channel: Điện tử gia dụng
10-05-2026, 16:53 -
-
bởi dinhthuong92Đấy, cái tôi thắc mắc là chỗ màu hồng ấy bạn, để áp vào cao chứ không bị sụt gần bằng áp pin thì rất cần cuộc cảm để làm điều đó. Tuy nhiên, trong công thức bác thớt dẫn không thấy mặt L, và một vài mạch MPPT tôi đã kiểm...
-
Channel: Nguồn!
09-05-2026, 10:01 -
-
bởi mèomướpDạ mạch sạc là 1 cục nguồn, nó sẽ điều chỉnh công suất đầu ra để có tổng trở bằng nội trở của pin ạ. Và cái cách nó chỉnh công suất đầu ra sẽ là dạng buck, boot. Đều cần đến cuộn cảm ạ. Tất nhiên chú thích thì có thể dùng dạng tuyến tính transistor để bù trừ nhưng mà nó đốt năng lượng vô ích ạ...
-
Channel: Nguồn!
08-05-2026, 16:26 -
-
bởi dinhthuong92Tng trở R của tải (gồm pin và mạch sạc) trong công thức đó rõ ràng khống có L xuất hiện. Nếu tính các dây dẫn thì rất nhỏ, bỏ qua. Vì nội trở pin là rất nhỏ, có thể nói luôn lớn hơn nội trở solar, nên mạch MPPT sẽ hầu như luôn tính...
-
Channel: Nguồn!
08-05-2026, 11:00 -

Comment