Bài 08: DAC với STM32F303CC trong MXCUBE

Bài 08: DAC với STM32F303CC.

  1. Giới thiệu sơ lược về ADC.
  2. DAC – Digital to Analog Converter là bộ chuyển đổi số ra tín hiệu tượng tự. Tạm hiểu nôm na là : chân GPIO của STM32 chỉ xuất được 2 giá trị là 0 hoặc 3V3, nếu ta cần 1 giá trị điện áp nằm giữa 0 – 3V3 và có thể thay đổi được thì dùng DAC là cách hữu hiệu nhất.

    Ứng dụng : DAC chủ yếu được ứng dụng trong các thiết bị âm thanh, audio. Ngoài ra nó còn được sử dụng để điều khiển tốc độ của một số driver, tạo các sóng sin, sóng bậc thang….

    STM32F303CC có 1 bộ DAC với 2 kênh output, độ phân giải là 12 bit với nhiều mode hoạt động. Các chức năng chính như sau:

    • Căn chỉnh bit data bên phải hoặc trái – tương ứng với LSB hoặc MSB trong ADC.
    • Tạo được sóng tam giác, sóng sin.
    • 2 mode chuyển đổi là đồng thời hoặc độc lập.
    • Có DMA giúp nâng cao tốc độ chuyển đổi.
    • Có thể điều khiển bộ DMA bằng các xung trigger hoặc timer.
    • Điện áp tham chiều là điện áp vào trên chân VDDA.
  3. Cấu hình trên STM32 CubeMx.
  4. VD: Viết chương trình xuất điện áp DAC trên chân PA4, điện áp xuất ra được kiểm tra bằng cách đọc điện áp trên chân PA0(chân PA0 nối chân PA4), với độ phân giải là 12 bit, Continuous conversion. Dùng UART2 để hiển thị giá trị ADC, DAC lên màn hình máy tính.

    1. New project. Cửa sổ mới được mở ra. Chọn loại MCU theo tên hoặc theo họ, loại package… Ở đây mình nhớ tên luôn nên gõ vào cho nhanh STM32F303CC.
    2. Chọn loại MCU, Double click vào tên MCU được tìm thấy hoặc bấm vào Start project để bắt đầu quá trình cài đặt.
    3. Cấu hình thạch anh, chuẩn nạp trước tiên. Bài này sử dụng UART2, ADC1, DAC1. Click chuột trái để chọn chức năng cho ngoại vi.Click chuột phải để tạo nhãn cho chân ngoại vi cho dễ nhìn.

      Ở đây, chân PA0, PA2,PA3,PA4, PB9 lần lượt là chân ADC input, UART2_TX, UART2_RX, output DAC và led hiển thị trạng thái.

    4. Tab Clock Configuration để tốc độ là tối đa 72Mhz.
    5. Tab Configuration
      • Connectivity -> click vào UART đã chọn(UART2) để bắt đầu cấu hình. Cấu hình tốc độ baud là 38400, độ dài là 8 bit, không sử dụng bit parity và 1 bit stop, các phần khác để mặc định.
      • Sau khi nhập các thông số, nhấn Ok để đóng bảng.

      • Tab Analog -> chọn bộ ADC vừa cấu hình là ADC1
      • Sau khi nhập các thông số, nhấn Ok để đóng bảng.

      • Tab Analog -> chọn bộ DAC vừa cấu hình là DAC.
      • Sau khi nhập các thông số, nhấn Ok để đóng bảng.

    6. Cài đặt file xuất ra cho project : vào Project -> settings.Việc cài đặt tương tự như các bài 02, 03. Và không có gì khác biệt nhiều.
    7. Lưu ý : Tab code generator chọn copy only the necessary library files để chương trình sinh ra chỉ copy những file cần thiết -> chương trình tốn ít bộ nhớ hơn. Tab Advanced Setting để mặc định. Nhấn Ok để kết thúc quá trình.

    8. Xuất code sau khi cài đặt : Project -> code generate hoặc click vào biểu tượng. Sau khi code được sinh ra click vào open project để mở project đó lên.
  5. Chỉnh sửa code trên keil C.
    1. Mở file main.c trong khung project lên để chỉnh sửa code sinh ra.
    2. Thêm dòng code như hình.
      • Thêm define stdio.h để sử dụng lệnh printf:
      • Khai báo để sử dụng hàm printf cho UART2 và các biến sử dụng.
      • Khởi động bộ ADC, DAC đã được cấu hình.
      • Viết chương trình trong main.

      Lưu ý: thêm code vào giữa begin và end để generate code lần sau không bị mất code đã thêm vào.

    3. Chọn reset and run trong options of target -> Utilities -> setting -> Flash download để sau khi nạp xong chương trình chạy luôn mà không cần nhấn nút reset.
    4. Biên dịch chương trình(Build) ở lần đầu tiên và Rebuild(F7) cho các lần tiếp theo. Chương trình không báo lỗi. Nhấn nút Load để nạp(F8).
    5. Lưu ý:
      • Hàm HAL_DAC_SetValue được sử dụng để xuất giá trị DAC ra ngoài với các giá trị tương ứng : bộ DAC được chọn, kênh DAC được chọn, kiểu xuất dữ liệu bit cao bên trái hoặc phải, giá trị DAC được xuất.
      • Sử dụng các hàm HAL_DACEx_TriangleWaveGenerate, HAL_DACEx_TriangleWaveGenerate.. để tọa các dạng sóng khác nhau.
      • Vòng lặp for được thực hiện để lấy giá trị ADC chính xác hơn.
      • Điện áp dao động nhỏ nên giá trị adc đọc về chênh lệch vài giá trị là chuyện thông thường.
      • %4.3f là sử dụng hàm printf in kiểu dữ liệu float với 4 số trước dấu “.” Và 3 số sau dấu “.”.
      • Led đảo trạng thái để thông báo là chương trình vẫn chạy bình thường và không bị đứng ở bất kì chỗ nào.
      • “Dac_value” chính là giá trị điện áp(DAC) xuất ra trên chân PA4, AVG_value chính là giá trị điện áp(ADC) đọc về trên kênh ADC1_IN2, “tùy chỉnh sai số” ở đây có nghĩa là hiệu chỉnh giá trị để giá trị xuất ra gần bằng giá trị đọc vào.

      Chúc các bạn thành công.

  6. Bài tập
    1. Sử dụng bộ DAC với 2 kênh xuất điện áp 1.0V trên chân PA4, và điện áp 2.0V trên chân PA5 .
    2. Sử dụng bộ DAC xuất sóng tam giác trên chân PA4.
    3. Sử dụng bộ DAC xuất sóng nhiễu trên chân PA4.


Link tải ví dụ DAC ở trên