BÀI 09: ADC TRONG STM32F103.
- Sơ lược về lý thuyết.
- Độ phân giải 12 bit tương ứng với giá trị maximum là 4095.
- Có các ngắt hỗ trợ như End conversion, End of Injected Conversion and Analog Watchdog Event.
- Single mode hay Continuous mode.
- Tự động calib và có thể điều khiển hoạt động ADC bằng xung Trigger.
- Thời gian chuyển đổi nhanh : 1us tại tần số 65Mhz.
- Điện áp cung cấp cho bộ ADC là 2.4V -> 3.6V. Nên điện áp Input của thiết bị có ADC 2.4V ≤ VIN ≤ 3.6V.
- Có bộ DMA giúp tăng tốc độ xử lí.
- Cấu hình với thư viện chuẩn của ST.
- B1 – Khởi tạo các định nghĩa và cấp clock cho ngoại vi cũng như bộ ADC.
- B2 – Cấu hình chân GPIO Input ADC và cấu hình chung ADC.
- B3- Cấu hình chanel, rank, thời gian lấy mẫu, bộ calib.
- B4 – Sử dụng phương pháp trung bình để đọc kết quả chính xác hơn.
- Sử dụng lệnh printf để xuất kết quả lên màn hình đã có vd trong bài UART.
- Dùng phương pháp lấy trung bình để đọc kết quả giá trị ADC sẽ chính xác hơn. Ở đây số mẫu lấy trung bình là 10.
- Một số thanh ghi quan trọng.
- ADC_DR – ADC regular data register.
- ADC_SR – ADC status register.
- STRT : báo channel đã bắt đầu chuyển đổi giá trị ADC hay chưa.
- JSTRT : báo channel đã bắt đầu chuyển đổi khi có tín hiệu bên ngoài điều khiển hay chưa.
- JEOC: báo kết thúc quá trình chuyển đổi khi có tín hiệu bên ngoài điều khiển hay chưa.
- EOC: báo kết thúc quá trình chuyển đổi ADC.
- AWD: báo có sự kiện Analog Watchdog có xảy ra hay không.
- ADC_CR2 – ADC Control register 2.
- TSVREFE: bật hay tắt cảm biến nhiệt độ và Vrefint.
- SWSTART : bật hay reset trạng thái bộ chuyển đổi liên tục.
- JSWSTART: bật hay reset trạng thái bộ chuyển đổi liên tục được điều khiển từ bên ngoài bộ ADC.
- EXTTRIG: cho phép hay không cho phép bắt đầu bộ chuyển đổi liên tục từ xung trigger bên ngoài.
- EXTSEL[2:0] : bit chọn lựa xung trigger bên ngoài từ nguồn nào.
- ALIGN : sắp xếp thanh ghi data theo chiều từ lớn đến bé hoặc ngược lại.
- DMA: có sử dụng bộ DMA hay không.
- RSTCAL: reset lại thanh ghi calib hay không.
- CAL: cho phép hay báo là đã calib xong.
- CONT: lựa chọn mode chuyển đổi liên tục hay chuyển đổi đơn.
- ADON: bật hay tắt bộ chuyển đổi ADC.
- ADC_SMPR2 – ADC sample time register.
- Bài tập.
- Đọc giá trị biến trở sử dụng kênh ADC1 channel 0 trên chân PA0, hiển thị giá trị ADC lên máy tính thông qua UART.
- Đọc giá trị biến trở sử dụng kênh ADC1 channel 0 trên chân PA0, hiển thị giá trị ADC lên máy tính thông qua UART có sử dụng ngắt Analog Watchdog, nếu giá trị ADC nằm ngoài lớn hơn 3000 và nhỏ hơn 2000 thì đèn PB9 sẽ sáng để cảnh báo.
- Đọc giá trị cảm biến nhiệt độ trong bộ ADC, nếu giá trị lớn hơn 35oC thì bật led ở chân PB9 cảnh báo, hiển thị giá trị nhiệt độ lên máy tính thông qua UART.
ADC – Analog to digital Converter là bộ chuyển đổi tín hiệu tương tự sang tín hiệu số. ADC được ứng dụng rất nhiều như đo nhiệt độ, đọc giá trị điện áp, cường độ dòng điện, đọc phím nhấn, đọc giá trị biến trở, bảo vệ động cơ…. Khi tìm hiểu về ADC chúng ta cần tìm hiểu bộ ADC đó là bao nhiêu bit, các phương pháp chuyển đổi. ADC có số bit càng cao tức là độ phân giải của bộ ADC càng lớn.
ADC trong STM32F103 là bộ ADC có 12 bit tức là giá trị đọc về nằm trong khoảng 0 ->2^12= 4096. Giá trị điện áp đầu vào bộ ADC được cung cấp trên chân VDDA và thường lấy bằng giá trị cấp nguồn cho vi điều khiển VDD(+3V3). STM32F103C8 có 2 kênh ADC đó là ADC1 và ADC2, mỗi kênh có tối đa là 9 channel với nhiều mode hoạt động như: single, continuous,scan hoặc discontinuous. Kết quả chuyển đổi được lưu trữ trong thanh ghi 16 bit. Đọc biến trở là ví dụ đơn giản nhất của chức năng ADC:
Một số tính năng chính được liệt kê như sau:
Sơ đồ khối của bộ ADC trong STM32F103:
Ví dụ: cấu hình sử dụng bộ ADC1 kênh 0 trên chân PA0 đọc giá trị biến trở hiển thị lên máy tính thông qua UART2.
Lưu ý:
Thanh ghi này chứa giá trị ADC đọc về, nó là thanh ghi 32 bit với 16 bit data của bộ ADC1 và 16 bit data của bộ ADC2.
Thanh ghi này chứa các cờ báo trạng thái như:
Thanh ghi này điều khiển các quá trình chuyển đổi ADC như:
Thanh ghi này thiết lập thời gian lấy mẫu nhanh hay chậm và được cài đặt bởi lập trình.SMPx[2:0] tương ứng giá trị nhị phân từ 0->7 sẽ tương ứng với thời gian lấy mầu là: 1.5 - 7.5 - 13.5 - 28.5 - 41.5 - 55.5 - 71.5 - 239.5 cycles. Cách tính thời gian dựa theo hình sau:
Link tải chương trình sử dụng ngắt watchdog timer của kênh ADC
Link tải chương trình sử dụng đọc nhiệt độ bên trong chip của bộ ADC
Chào admin.
ReplyDeleteCho mình hỏi cái này với ạ.
Trong vidu 3 bài 9 dùng lệnh gì để bật đèn và tắt đèn ở chân PB9 .
Tại trong ví dụ này mình không thấy có chỗ đề cập đến. Vậy nếu mình if trong chương trình chính để so sánh với 35 để bật tắt led liệu có được ko ?
Mình xin cảm ơn
Chào bạn.
DeleteTrong ví dụ 3 mình thiếu mất phần bật LED cảnh báo.
Bạn có thể bật ngay trong chương trình chính, hoặc có thể dùng ngắt ADC(phải cấu hình thêm phần dùng ngắt này).
Anh ơi cho em hỏi sao ko có thư viện USB trong STD vậy ạ?
ReplyDeleteChào bạn, giao tiếp USB có khá nhiều kiểu nên có 1 gói thư viện riêng dành cho STD, bạn có thể tìm kiếm từ khóa "usb stm32 standard library", sẽ có gói "STSW-STM32121" bao gồm thư viện và đầy đủ các ví dụ.
DeleteCho mình hỏi là trong bài cảm biến nhiệt độ sử dụng loại gì vậy ạ? Cái công thức chuyển từ giá trị ADC sang độ C sao lại có vậy bạn?
ReplyDeleteMình cảm ơn
Chào bạn, mình chưa tìm được tài liệu nào nói loại cảm biến sử dụng bên trong MCU. Công thức chuyển đổi như sau : Temperature (in °C) = {(V25 - VSENSE) / Avg_Slope} + 25
DeleteBạn thao khảo thêm ở phần ADC trong "Reference manual" và "Electrical Characteristics" trong descrition của loại MCU này để biết giá trị default của V25 và Avg_Slope.
em muốn dùng cả 2 adc1 và adc2 mà lúc em thay hết adc1 thành adc2 bằng replace không sót một cái nào lại không chạy được đổi lại adc1 thì chạy được. Em đã sai ở đâu ạ
ReplyDeleteChào bạn, bạn nên kiểm tra lại config lúc chuyển sang adc2, chân IO đó có hỗ trợ adc2 hay không, ở cấu hình mẫu chỉ hộ trợ chạy 1 lần 1 kênh adc, muốn chạy nhiều bộ adc cùng 1 lúc bạn cần điều chỉnh lại config hoặc có thể dùng DMA. Nếu còn bị lỗi bạn có thể cung cấp nhiều thông tin hoặc code để mình giúp.
Delete