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

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

5/5 - (2 bình chọn)

3 những suy nghĩ trên “Bài 9: Lập trình STM32 ADC nhiều kênh với DMA

  1. Hieu nói:

    Bạn có thể giúp mình scan nhiều channels sử dụng Timer không ? Mình đang muốn sử dụng ADC2 (STM32F103VBT6) đọc 3 tín hiệu ADC trên 3 chân liên tục. Sử dụng STM32CubeMX thì thấy ADC2 không support DMA. Thanks in advance !

  2. Dương nói:

    hi anh, em đang làm bài tương tự như trên nhưng mà em k dùng stm32f1 mà em dùng kit stm32f429i nhưng mà k biết vì sao vẫn không đọc được giá trị từ joystick ạ. trong cubemx em thấy chân PA0 và PA1 kit đã dùng, nên em dùng chanel 5 và chanel 13 của ADC 1 để thay thế, 2 chân này em nối vào VRX và VRY của joystick. Các cấu hình khác em làm giống anh, nhưng mà vào debug thì giá trị đều bằng 0 ạ. Không biết là cách cấu hình trên stm32f429i của em có phù hợp với code trên bài anh hướng dẫn không ạ?

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 *