Lập trình STM32 DAC tạo sóng hình Sin trên KIT STM32F407 Discovery

stm32f407 dac

Trong bài này chúng ta sẽ cùng nhau tìm hiều STM32 DAC với KIT STM32F407VE Discovery. Học cách điều khiển bộ DAC và điều chế sóng Sin trên KIT.

Bài 1 phần STM32F407 trong Serie Học STM32 từ A tới Z

DAC là gì?

DAC là viết tắt của cụm từ Digital Analog Converter – bộ chuyển đổi tín hiệu digital thành analog.

DAC là một thành phần thiếu yếu của bất kỳ hệ thống âm thanh nào trên PC. Khu vực âm thanh trên bo mạch chủ có 1 DAC, tương tự như trên card âm thanh, smartphone, tai nghe dạng USB cùng những thiết bị kỹ thuật số khác.

Độ phân giải DAC

Độ phân giải DAC là số lượng mức để biểu diễn điện áp cũng tương tự như khái niệm độ phân giải của ADC. Mức phân giải càng lớn thì giá trị ADC càng mịn, hay chúng ta càng điều chế ra được mức điện áp chính xác cao.

Ví dụ: Nếu DAC có độ phân giải 4bit nghĩa là bạn sẽ có 2^4 = 16 mức để biểu diễn điện áp từ 0 – 3.3v (Vmax).

Nếu DAC có độ phân giải 8bit nghĩa là bạn có 2^8 = 256 mức để biểu diễn điện áp từ 0 – 3.3V

ESP32 DAC

Tần số lấy mẫu khi điều chế sóng bằng DAC

Về cơ bản một sóng Analog có thể được biểu diễn bằng các mức điện áp khác nhau tại nhiều thời điểm. Nếu khoảng thời gian giữa các lần xuất ra điện áp càng hẹp thì sóng sẽ càng giống như dạng Analog.

Khoảng thời gian giữa các lần cập nhật người ta định nghĩa là tần số lấy mẫu (f sample).

VD: Các bạn có thể thấy trên hình với tần số lấy mẫu nhỏ, khi điều chế DAC sẽ cho kết quả không giống thực tế lắm, nhưng với tần số lấy mẫu lớn, sóng ra sẽ mịn và giống sóng Analog hơn.

analog to digital sampling

Khối DAC trong STM32f407

STM32F407 có 2 bộ DAC với 2 độ phân giải là 8 bit và 12 bit. Có thể kích hoạt bởi các Timer 2,4,5,6,7 (trong phần thực hành điều chế sóng Sin, mình sẽ nói rõ hơn phần này).

STM32 DAC cũng sẽ được điều khiển bởi 1 thanh ghi DAC control Register và một thanh ghi giá trị đầu vào DAC là DAC_DORx, thanh ghi này có thể kết nối với bộ DMA để giúp chuyển dữ liệu nhanh hơn.

STM32 DAC Block diagram

Lập trình STM32 DAC điều khiển điện áp đầu ra

Cấu hình trong CubeMx

Chúng ta sẽ khởi tạo STM32 DAC với kênh 1.

Các phần còn lại để mặc định. Sau đó Gencode như bình thường (thao tác này quá quen thuộc rồi mình không nhắc lại nữa)

STM32 DAC Cube config

Lập trình trên Keil C

Công thức tính điện áp đầu ra:

cong thuc tinh dien ap ra STM32 DAC

Vậy để tính được DOR để nạp vào thanh ghi giá trị đầu vào, chúng ta cần

  • Điện áp đầu ra DAC Ouput
  • Vref hay điện áp tham chiểu, ở đây sẽ là 3.3V (điện áp cực đại của STM32)
  • Giá trị cực đại của bộ DAC ( tùy vào 8bit hay 12 bit)

Vậy nên chúng ta sẽ khởi tạo

  • Giá trị điện áp đầu ra = 1.5V (hoặc 1 số bất kì)
  • Đinh nghĩa Vref = 3.3V
  • 2 mức điện áp lớn nhất cho 2 chế độ 8bit và 12bit.
  • Và 1 biến dac_value chính là giá trị nạp vào thanh ghi DOR

khoi tao cac bien stm32 DAC

Sau đó chúng ta sẽ khởi động bộ STM32 DAC bằng lệnh HAL_DAC_Start

khoi dong STM32 DAC

Tiếp tới, tính toán DAC_Value bằng cách biến đổi công thức bên trên.

Sau đó ghi giá trị ra bên ngoài với độ phân giải tương ứng.

stm32 dac

Kết quả

Dùng đồng hồ hoặc oscillo đo chân PA4 (chân DAC1)

stm32 dac do dac

Chúng ta sẽ được kết quả:

stm32 dac ket qua

Chúng ta có thể tăng giảm giá trị DAC_Voltage rồi tính toán và nạp lại vào chương trình để được 1 chương trình sáng tăng dần, giảm dần điện áp.

Lâp trình STM32 DAC tạo sóng Sin

Để tạo được sóng hình Sin, chúng ta sẽ dùng timer để chia thành các khoảng thời gian cố định (step), tại mỗi step sẽ gửi 1 giá trị DAC ra chân Output. Thời gian giữa mỗi step càng nhỏ thì sóng hình sin càng mịn, nhưng stm32 sẽ phải hoạt động nhiều hơn

dac sinwave

Công thức tính giá trị STM32 DAC để tạo sóng hình Sin

cong thuc sinwave

Download tài liệu tạo sóng Sin tại đây: STM32 DAC Sin wave

Cấu hình trong CubeMX

Kích hoạt timer 2 để tạo thời gian giữa mỗi step (t samples)

setup timer 2

Chọn DAC trigger Timer 2 event (được kích hoạt bởi sự kiện của Timer 2). Nghĩa là mỗi khi Timer có sự kiện đếm hết (tràn) timer thì sẽ kích hoạt DAC 1 lần.

STM32 DAC config triger timer

Chọn DMA cho bộ DAC dạng circular buffer với chiều dài word (16bit).

STM32 DAC config DMA

Lập trình trên Keil C

Khởi tạo các biến và hằng số dùng để tính toán giá trị Sinwave với

NUMBER_SAMPLE là số lượng step của 1 chu kì hình sin

MAXDIGIGALVALUE_12BIT là giá trị lớn nhất mà DAC tạo ra với bộ DAC 12 bit

STM32 DAC Sinwave 1

Tạo ra 1 chuỗi sin_value có 100 phần tử, sau đó tính toán giá trị nạp vào cho từng step theo công thức trên.

STM32 DAC Sinwave 2

Cuối cùng chúng ta khởi động Timer 2 và DAC với DMA, mỗi lần Timer 2 sảy ra ngắt DAC sẽ truyền 100 giá trị của sinvalue vào.

STM32 DAC Sinwave 3

Để thay đổi tần số sinwave, chúng ta thay đổi giá trị nạp vào của timer 2, như bài STM32 Timer time base đã học.

Kết quả

stm32 dac sinwave

Kết

STM32 DAC là một ngoại vi rất thường được sử dụng trong các mạch điều chế sóng hoặc chuyển đổi âm thanh số thành tương tự, để phát ra loa như một chiếc máy nghe nhạc.

Hy vọng sau bài này các bạn đã học được cách sử dụng STM32 DAC và điều chế 1 số loại sóng cơ bản với DAC. Đừng quên gia nhập Hội Anh Em Nghiện Lập trình để giao lưu và học hỏi nhé!!!

 

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

Để lại một bình luận

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 *