BÀI 09: ADC TRONG STM32F103.


  1. Sơ lược về lý thuyết.
  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.

    ADC trong STM32F103 là bộ ADC có 12 bit tức là giá trị đọc về nằm trong khoảng 0 ->2^12= 4096. 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). STM32F103C8 có 2 kênh ADC đó là ADC1 và ADC2, mỗi kênh có tối đa là 9 channel 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. Đọc biến trở là ví dụ đơn giản nhất của chức năng ADC:

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

    • Độ phân giải 12 bit tương ứng với giá trị maximum là 4095.
    • 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.
    • Thời gian chuyển đổi nhanh : 1us tại tần số 65Mhz.
    • Đ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í.

    Sơ đồ khối của bộ ADC trong STM32F103:

  3. Cấu hình với thư viện chuẩn của ST.
  4. Ví dụ: cấu hình sử dụng bộ ADC1 kênh 0 trên chân PA0 đọc giá trị biến trở hiển thị lên máy tính thông qua UART2.

    1. B1 – Khởi tạo các định nghĩa và cấp clock cho ngoại vi cũng như bộ ADC.
    2. B2 – Cấu hình chân GPIO Input ADC và cấu hình chung ADC.
    3. B3- Cấu hình chanel, rank, thời gian lấy mẫu, bộ calib.
    4. B4 – Sử dụng phương pháp trung bình để đọc kết quả chính xác hơn.
    5. Lưu ý:

      • Sử dụng lệnh printf để xuất kết quả lên màn hình đã có vd trong bài UART.
      • Dùng phương pháp lấy trung bình để đọc kết quả giá trị ADC sẽ chính xác hơn. Ở đây số mẫu lấy trung bình là 10.
  5. Một số thanh ghi quan trọng.
    1. ADC_DR – ADC regular data register.
    2. Thanh ghi này chứa giá trị ADC đọc về, nó là thanh ghi 32 bit với 16 bit data của bộ ADC1 và 16 bit data của bộ ADC2.

    3. ADC_SR – ADC status register.
    4. Thanh ghi này chứa các cờ báo trạng thái như:

      • STRT : báo channel đã bắt đầu chuyển đổi giá trị ADC hay chưa.
      • JSTRT : báo channel đã bắt đầu chuyển đổi khi có tín hiệu bên ngoài điều khiển hay chưa.
      • JEOC: báo kết thúc quá trình chuyển đổi khi có tín hiệu bên ngoài điều khiển hay chưa.
      • EOC: báo kết thúc quá trình chuyển đổi ADC.
      • AWD: báo có sự kiện Analog Watchdog có xảy ra hay không.
    5. ADC_CR2 – ADC Control register 2.
    6. Thanh ghi này điều khiển các quá trình chuyển đổi ADC như:

      • TSVREFE: bật hay tắt cảm biến nhiệt độ và Vrefint.
      • SWSTART : bật hay reset trạng thái bộ chuyển đổi liên tục.
      • JSWSTART: bật hay reset trạng thái bộ chuyển đổi liên tục được điều khiển từ bên ngoài bộ ADC.
      • EXTTRIG: cho phép hay không cho phép bắt đầu bộ chuyển đổi liên tục từ xung trigger bên ngoài.
      • EXTSEL[2:0] : bit chọn lựa xung trigger bên ngoài từ nguồn nào.
      • ALIGN : sắp xếp thanh ghi data theo chiều từ lớn đến bé hoặc ngược lại.
      • DMA: có sử dụng bộ DMA hay không.
      • RSTCAL: reset lại thanh ghi calib hay không.
      • CAL: cho phép hay báo là đã calib xong.
      • CONT: lựa chọn mode chuyển đổi liên tục hay chuyển đổi đơn.
      • ADON: bật hay tắt bộ chuyển đổi ADC.
    7. ADC_SMPR2 – ADC sample time register.
    8. Thanh ghi này thiết lập thời gian lấy mẫu nhanh hay chậm và được cài đặt bởi lập trình.SMPx[2:0] tương ứng giá trị nhị phân từ 0->7 sẽ tương ứng với thời gian lấy mầu là: 1.5 - 7.5 - 13.5 - 28.5 - 41.5 - 55.5 - 71.5 - 239.5 cycles. Cách tính thời gian dựa theo hình sau:

  6. Bài tập.
    1. Đọ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.
    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 độ trong bộ 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 chương trình sử dụng channel 1 kênh ADC1
Link tải chương trình sử dụng ngắt watchdog timer của kênh ADC
Link tải chương trình sử dụng đọc nhiệt độ bên trong chip của bộ ADC