Bài 07: ADC với STM32F303CC.

Bài 07: ADC với STM32F303CC.

  1. Giới thiệu sơ lược về ADC.
  2. ADC – Analog to digital Converter là bộ chuyển đổi tín hiệu tương tự sang tín hiệu số. ADC được ứng dụng rất nhiều như đo nhiệt độ, đọc giá trị điện áp, cường độ dòng điện, đọc phím nhấn, đọc giá trị biến trở, bảo vệ động cơ…. Khi tìm hiểu về ADC chúng ta cần tìm hiểu bộ ADC đó là bao nhiêu bit, các phương pháp chuyển đổi. ADC có số bit càng cao tức là độ phân giải của bộ ADC càng lớn, bộ ADC đó càng xịn.

    ADC trong STM32F303CC là bộ ADC có 12 bit - tức là giá trị đọc về nằm trong khoảng 0 ->2^12-1= 4095. Giá trị điện áp đầu vào bộ ADC được cung cấp trên chân VDDA và thường lấy bằng giá trị cấp nguồn cho vi điều khiển VDD(+3V3) nên với các ứng dụng quan trọng sử dụng ADC phần cứng cần được thiết kế khối nguồn với chân VDDA cẩn thận. STM32F103C8 có 4 kênh ADC đó là ADC1, ADC2, ADC3 và ADC4; số lượng channel của mỗi kênh là khác nhau với nhiều mode hoạt động như: single, continuous, scan hoặc discontinuous. Kết quả chuyển đổi được lưu trữ trong thanh ghi 16 bit với 2 dạng data là MSB là bit cao nhất hoặc LSB là bit cao nhất. Đọc biến trở là ví dụ đơn giản nhất của chức năng ADC:

    Số lượng các chanel ADC của các kênh cho dòng STM32F3:

    Một số tính năng chính được liệt kê như sau:

    • Độ phân giải 12 -10 - 8 - 6 bit tương ứng với giá trị maximum là 4096 – 1024 – 256 - 32.
    • Được chia là các loại phụ thuộc vào tốc độ chuyển đổi như fast channel(5.1 Ms/s) hoặc slow channel(4.8 Ms/s).
    • Thời gian chuyển đổi phụ thuộc vào clock của hệ thống cũng như clock chia cho bộ ADC được sử dụng.
    • Có các ngắt hỗ trợ như End conversion, End of Injected Conversion and Analog Watchdog Event.
    • Single mode hay Continuous mode.
    • Tự động calib và có thể điều khiển hoạt động ADC bằng xung Trigger.
    • Điện áp cung cấp cho bộ ADC là 2.4V -> 3.6V. Nên điện áp Input của thiết bị có ADC 2.4V ≤ VIN ≤ 3.6V.
    • Có bộ DMA giúp tăng tốc độ xử lí.
    • Các tính năng bổ trợ như: hoạt động ở chế độ low-power, kênh cảm biến nhiệt nội bên trong chip, kênh đo điện áp tham chiểu Vref, kênh đo điện áp trên chân Vbat….
  3. Cấu hình trên STM32 CubeMx.
  4. VD: Viết chương trình đọc điện áp trên chân PA0, với độ phân giải là 12 bit, Continuous conversion. Dùng UART2 để hiển thị giá trị ADC lên mà 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 và ADC1. 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,PB9 lần lượt là chân ADC input, UART2_TX, UART2_RX, 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.

    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 đã đượ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 ý:
      • Vòng lặp for được thực hiện để lấy giá trị trung bình với số mẫu xác định(ở đây là 10 mẫu) giúp cho giá trị ADC đọc về 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 ra màn hình 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.

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

  6. Bài tập
    1. Đọc giá trị biến trở sử dụng nhiều kênh ADC : ADC1 channel 0 trên chân PA0 và ADC1 channel 1 trên chân PA1. Hiển thị các giá trị ADC lên máy tính thông qua UART.
    2. Đọc giá trị biến trở sử dụng kênh ADC1 channel 0 trên chân PA0, hiển thị giá trị ADC lên máy tính thông qua UART có sử dụng ngắt Analog Watchdog, nếu giá trị ADC nằm ngoài lớn hơn 3000 và nhỏ hơn 2000 thì đèn PB9 sẽ sáng để cảnh báo.
    3. Đọc giá trị cảm biến nhiệt độ bên trong MCU(sử dụng cấu hình ADC), nếu giá trị lớn hơn 35oC thì bật led ở chân PB9 cảnh báo, hiển thị giá trị nhiệt độ lên máy tính thông qua UART.


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