Bài 9: Lập trình STM32 ADC nhiều kênh với DMA

ADC nhiều kênh chế độ Scan mode và DMA

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

H1 5
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 14

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

H2 7
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 15

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.

H3 6
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 16

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

H4 5
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 17

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

H5 6
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 18

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];

H6 6
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 19

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

H7 7
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 20

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)

H8
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 21

Bật debug lên, tìm tới biến khởi tạo và Add to Watch 1

H9 7
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 22

Nhấn F5 để Run và xem kết quả

H10 5
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 23

Với chế độ Scan Continuous ta chỉ cần Enable bit CONT lên bằng câu lệnh.

hadc1.Init.ContinuousConvMode = ENABLE;

H11 5
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 24

Sau đó chuyển lệnh Start lên trên While (1)

H12 4
Bài 9: Lập trình STM32 ADC nhiều kênh với DMA 25

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

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *