Lập trình STM32 đọc ADC nhiều kênh kết hợp DMA sẽ giúp bạn hiểu được:
- Cách sử dụng chế độ Scan Mode
- Cách sử dụng DMA cho ADC
- Cách lập trình ADC nhiều kênh trên STM32
Bài 9 trong serie Học lập trình STM32 từ A tới Z
ADC nhiều kênh sử dụng chế độ Scan Mode
Chế độ Scan chỉ được bật khi sử dụng 2 kênh ADC trở lên.
Nếu Bit CONT được set lên 1, sau khi scan hết các kênh ADC tự động lặp lại thao tác Scan.
Nếu bit CONT ko được bật, sau khi ADC scan hết các kênh sẽ dừng lại.
Sau khi thực hiện chuyển đổi ADC tại mỗi kênh, cờ EOC sẽ được bật, ngắt hoặc DMA sẽ được sinh ra, giá trị thu được sẽ lưu vào thanh ghi DR.
Khi thực hiện chuyển đổi xong tại kênh tiếp theo, giá trị sẽ ghi đè lên thanh ghi DR
Khi sử dụng DMA giá trị chuyển đổi sẽ được chuyển tới SRAM trước khi vào bộ DMA
Cấu hình ADC nhiều kênh trên STM32 CubeMX
Trong bài này chúng ta sẽ sử dụng ADC Scan mode 2 kênh CH0 và CH1, không sử dụng mode CONT và dùng DMA để lưu giá trị
Bật project, chọn chip STM32F103C8, trong Sys, chọn Debug: Serial Wire. Chi tiết trong Bài 3
Phần Mode tick chọn CH0 và CH1
Phần Configurations, Tab Parameter
Num of Conversion: 2 Chọn số kênh cần chuyển đổi
Khi đó Scan Mode sẽ tự động Enable
Continuous Mode: Disable tắt chế độ Cont
Tại Rank 2: Chọn thêm Chanel 1, Chọn chu kì lấy mẫu cho mỗi Chanel tại Samping Time
Rank là thứ tự chuyển đổi, cao nhất là 1 lớn nhất là 10, bộ ADC sẽ Scan từ kênh có Rank là 1 đến n với n là số kênh các bạn cần chuyển đổi.
Trong DMA:
Mục DMA Request thêm kênh ADC1 các mục còn lại sẽ tự động được cài đặt theo
Mode: Circular với mode này dữ liệu sẽ liên tục được gửi qua lại giữa ADC và Vùng nhớ sử dụng DMA
Data Width: Half Word 16 bit
Ok. Xong phần Config các bạn đặt tên, chọn tool chain là ARM-MDK V5 rồi Gen code ra thôi
Lập trình ADC nhiều kênh chế độ Scan Mode
Mở project các bạn thêm biến u16_ADCScanVal[2];
Rồi khởi động ADC với DMA và trỏ DMA tới biến vừa tạo chứa giá trị ADC. Vì là chế độ Single nên bạn phải để trong While(1) mỗi lần chuyển đổi cách nhau 100ms
Phần cứng mình sẽ kết nối với joystick để đọc 2 giá trị X và Y nhé. Các bạn kết nối 5V với 3.3V, GND, VRX với PA0(ADC kênh 0), VRY với A1(ADC kênh 1)
Bật debug lên, tìm tới biến khởi tạo và Add to Watch 1
Nhấn F5 để Run và xem kết quả
Với chế độ Scan Continuous ta chỉ cần Enable bit CONT lên bằng câu lệnh.
hadc1.Init.ContinuousConvMode = ENABLE;
Sau đó chuyển lệnh Start lên trên While (1)
Như vậy ADC sẽ hoạt động liên tục.
Khi cần dừng bộ ADC chúng ta sử dụng lệnh
HAL_ADC_Stop(&hadc1);
Kết
ADC nhiều kênh được sử dụng rất nhiều trong việc đọc tín hiệu từ các loại cảm biến Analog. Bộ ADC là một ngoại vi cơ bản, bắt buộc phải nắm rõ khi học lập trình vi điều khiển, cụ thể hơn là lập trình STM32