Cần giúp Chống nhiễu cho ADC

huunho

Thạc sỹ
#11
Có cái gì đó không ổn ở đây :-), đặc biệt ở phần bạn tính từ 3.3 V lên... 158.4V... nó giống như bạn đang suy nghĩ và tính toán về một mạch.... tăng áp DC ... đây là phần mình không hiểu. Phần Vref cho mạch ADC nói chung dường như khác với những gì bạn dùng để tính toán lý thuyết.

Nếu được bạn cho mình xem bản vẽ phần cứng của mạch phân áp thì mình sẽ dễ hình dung hơn.

Mình ít sử dụng STM32 mà chủ yếu chỉ chơi Arduino thôi... nên đành phải tìm trong google vậy... và đây là một trang web mình tìm thấy nguồn https://letanphuc.net/2016/07/stm32f0-adc/. Tác giả trang web có vẻ là người Việt mà sao thấy toàn viết bằng tiếng Anh kể cả các video clip minh họa tác giả cũng giải thích bằng tiếng Anh luôn.

Nhưng thôi bỏ qua chuyện này cái được là trang web này viết rất chi tiết về ADC của STM32 bạn thử xem có giải quyết được gì không.

Rất mong được trao đổi cùng bạn. Chúc vui.
Cám ơn hai bạn đã góp ý. Mình đã giải quyết được vấn đề.
--Tính toán như trên là phù hợp với mạch phân áp bằng trở, cụ thể khi áp cần đo lên đên 158,4V thì trên trở 1k đo được là 3,3V phù hợp với đầu vào ADC của stm32F1.
--Về tính toán của F1 trong code thì nó hoàn toàn ko bị tràn bởi lẽ mình tét với 1 giá trị cố định thì nó tính rất đúng, các biến được khai báo là 32bit để tránh tràn, tuy nhiên cách tính của bạn thái phan rất thông minh, nó làm giảm tải CPU cho F1 khá nhiều.
--Vấn đề mình gặp phải về sau phát hiện là do F1 đo trễ,khi mình tăng áp cần đo từ 0 đến 15V thì tăng lên đên 2,5V trên LCD mới đo dc 0,01v tức là từ 0 đến 2,5v thì nó đo dc là 0V, sau đó lại giảm dần từ 15V về 0V thì khi áp giảm đến 1,5V thì LCD 1602 đã hiển thị 0V rồi. Tóm lại giá trị đo dc luôn luôn sai và không ổn định. Mình đã xem tài liệu của bạn concept cho thì thấy ADC có 2 thư viện, một thư viện chứa các hàm con cài đạt và điều khiển cơ bản stm32f1xx_hal_adc.h và thư viện mở rộng stm32f1xx_hal_adc_ex.h thì thư viện mở rộng chưa 1 hàm hiệu chỉnh ADC là : HAL_ADCEx_Calibration_Start(&hadc1);
Thêm nó vào phần đầu chương trình chính là ADC đo chuẩn ngay lập tức:
/* USER CODE BEGIN SysInit */

/* USER CODE END SysInit */

/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_ADC1_Init();
MX_TIM4_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start_IT(&htim4);
//send_16bit(0xff,0xc6);
HAL_ADCEx_Calibration_Start(&hadc1);
do_off
xanh_off
/* USER CODE END 2 */

/* Infinite loop */
/* USER CODE BEGIN WHILE */
//HAL_Delay(2000); // tre de do dien ap
while (1)


Với thư viện mở rộng này thì nhà sản xuất đã nói ngắn gọn là để hiệu chỉnh ADC: Calibration (ADC automatic self-calibration) và 1 vài chức năng khác.


@brief This file provides firmware functions to manage the following
* functionalities of the Analog to Digital Convertor (ADC)
* peripheral:
* + Operation functions
* ++ Start, stop, get result of conversions of injected
* group, using 2 possible modes: polling, interruption.
* ++ Multimode feature (available on devices with 2 ADCs or more)
* ++ Calibration (ADC automatic self-calibration)
* + Control functions
* ++ Channels configuration on injected group
* Other functions (generic functions) are available in file
* "stm32f1xx_hal_adc.c".
*

Tóm lại ADC đã chạy ngon và mình mong bạn nào đó cần ADC thì sẽ không mất thời gian nhờ bài chia sẻ này. cám ơn hai bạn đã góp ý, chúc diễn đàn ngày càng lớn mạnh
 
#13
Hiện tượng xử lý nhiễu thì muôn thủa, mỗi project có cách xử lý khác nhau và tuỳ vào từng điều kiện hoạt động của mạch. Nhiễu ADC cũng vậy, tuy nhiên trước hết phải tuân thủ nguyên tắc theo khuyến cáo của nhà sản xuất đã.

Với chú ý một số điểm sau:
- Đầu vào Analog cần được bọc chống nhiễu.
- Vref cần được cấp chuẩn. Như bọn tư bản nó hay dùng một con IC chuyên dụng để cấp nguồn riêng cho thằng này.
Mình lâu quá rồi ko làm và cũng không làm nhiều nên góp ý với bạn chút cho rôm rả thôi :)
Trích dẫn của AD đã đúng, chỉ có điều chưa giải thích rõ tại sao thôi.
Các bạn chuyên làm phần mềm mà không chú ý giới hạn của phần cứng nên nhiều khi đòi hỏi phần cứng cao hơn khả năng thiết kế mà báo là mạch sai hay code sai là không phù hợp.
Mạch chống nhiễu ADC ở đây cơ bản là mạch RC lọc thông thấp, làm giảm biên độ biến thiên của điện áp ở ngõ vào Analog_in với tần số cao. Để tránh ADC lấy mẫu vào đỉnh hoặc đáy khi điện áp dao động. Nếu là khi đó, thì giá trị ADC sẽ nhận được không ổn định. Tuy nhiên có thể lấy trung bình nhiều mẫu trong thời gian dài. Điều đó tương đương mạch lọc thông thấp số, thay vì dùng mạch cứng RC.
Ngoài ra, Vref của ADC cũng quan trọng, nếu Vref cũng có ripple theo một tải biến thiên nào đó thì khi trích mẫu so sánh, giá trị đầu ra ADC phụ thuộc vào Vref. Nhưng cái này cần quan tâm nhiều hơn cho loại ADC độ phân giải cao như 16/20/24/32 bit ADC Sigma-Delta.
ADC tích hợp cùng STM32 hay các dòng ARM khác là loại rẻ, theo nguyên lí xấp xỉ - DAC. Loại này tốc độ thấp và tín hiệu trích mẫu bị suy hao dẫn theo mỗi bit ADC. Tức là các bit cuối của ADC thường không chính xác. Ưu điểm loại này là cấu tạo đơn giản, tốn ít phần tử transistor trong thiết kế chip-IC. Trong bảng 48 (table 48) trên nói rất rõ rằng, ADC có 04 lỗi phần cứng cơ bản, và tổng sai số cơ bản là 2 LBS, tức là 02 bit cuối là lỗi (trong trường hợp tối đa, với các điều kiện thiết lập mạch lọc RC, VDD/VREF ổn định). Như vậy số bit hiệu quả (efective bit - enod bit) hay gọi là tin tưởng được là =12-2=10 bits. Hiểu nôm na là bạn không bao giờ thiết kế 12 mà nhận được 12 đâu.
Trong ứng dụng đo lường, sai số không tuyến tính là rất tệ. Tức là khi tín hiệu vào tăng một lượng x thì giá trị ADC không tăng một lượng tuyến tính Kx. Nghe có vẻ khó tin, nhưng table 48 có đề cập đến non-linear error.
Sai số của ADC còn phụ thuộc vào nhiệt độ. Nhiệt độ làm thay đổi điện trở trong, VREF, white noises,.. làm trôi điểm làm việc đã Calib của ADC. Thế mới thấy tại sao có một số con ADC rời tại sao lại đắt như vậy.
Sai số ADC còn phụ thuộc vào thời gian giữ mẫu, trích mẫu, thời điểm lấy mẫu - trigger, cross-talk giữa các kênh. Khi nào các bạn làm việc với nguồn switching số thì cái này rất quan trọng. Còn bình thường dùng, điều khiển on/off thì không có ảnh hưởng nhiều.
Ở đây dùng ADC 12bit với Enod 10 bit cho các ứng dụng phổ thông là tương đối ổn.
Chốt lại, mất 02 bit cuối không có sai cái gì cả, điều đó nằm trong "bảo đảm" của nhà sản xuất rồi.
Tất nhiên, các bạn có thể thấy kết quả đo có khi đạt độ chính xác 11 bit, thậm chí 12 bit. Nhưng nó chỉ giữ được ở một thời điểm nhất định và không đáng tin cho toàn bộ thời gian hoạt động cũng như quá trình đòi hỏi độ chính xác cao.
Các ADC rời có nhiễu nền thấp, độ tuyến tính cao, số bit hữu ích cao các bạn có thể tham khảo hãng ADI/LTC: http://www.analog.com . Tài liệu, thiết kế mẫu rất chi tiết. English nha :)
 

Quảng cáo Google