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
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.
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.
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)
Lập trình trên Keil C
Công thức tính điện áp đầu ra:
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
Sau đó chúng ta sẽ khởi động bộ STM32 DAC bằng lệnh HAL_DAC_Start
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.
Kết quả
Dùng đồng hồ hoặc oscillo đo chân PA4 (chân DAC1)
Chúng ta sẽ được kết quả:
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
Công thức tính giá trị STM32 DAC để tạo sóng hình Sin
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)
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.
Chọn DMA cho bộ DAC dạng circular buffer với chiều dài word (16bit).
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
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.
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.
Để 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ả
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é!!!