toilet

Chia sẻ - ADC với 8051 (không có sẵn ADC modul)

Thảo luận trong 'Họ 8051'

Đang xem chủ đề này ( Thành viên: 0, Khách: 0)

  1. Đăng 26/12/14 #1

    yeuthichdientu Thạc sỹ

    Số bài viết: 1,949
    Đã được thích: 2,731
    Với những VÐK không có ADC, để đơn giản và tiết kiệm, người ta hay dùng nguyên lý ADC 2 độ dốc (Dual slope)
    Nguyên lý chung có thể tham khảo tại:
    Integrating ADC - Wikipedia, the free encyclopedia

    Tại ví dụ này, tác giả dùng VÐK 8051, đạt được độ chính xác đến 14bit, tốc độ 7-15 lần/giây (như AT89C51), sử dụng 3 chân và Timer0:

    Dual_slope_explain_small 2.

    Mạch hoạt động như sau:
    B1
    : Bắt đầu chu trình, Lệnh
    SETB P3.4 ;"nối" Vref
    SETB P3.5 ;"nối" Output

    chân B & C của 4053 được set=1, do đó Z nối Z1, Y nối Y1, tụ C14 được nạp đến giá trị Vref (-1.2v) trong 25.5mS (Trễ 25,5mS)

    B2: Đặt T0 = 8000h = 32,768,

    H1_Positive_step 2.JPG

    Lệnh
    CLR P3.5 ;"nối" Vmaxabs
    CLR P3.4 ;"nối" Vin

    chân B & C của 4053 được set=0, do đó Z nối Z0, Y nối Y0, Tụ C14 được xả đến giá trị Vin qua trở R17 (100k)
    cho đến khi T0 ngắt (cờ TF0) = ~32mS, với lệnh:
    Wait4Vref:
    JNB TF0, Wait4Vref ;warte das Zähler fertig


    B3: Lệnh SETB P3.4 ;"nối" Vref

    H1_Positive_step 3.JPG

    nối Z và Z1, Y và Y0, Tụ C14 được nạp với dòng ổn định (Vref và R17), đồng thời T0 bắt đầu đếm từ 00.
    sẽ dừng đếm đến Khi tụ C14 được nạp đến = giá trị Vin (bộ so sánh sẽ set P3.2=0) ,
    lệnh:
    Wait4Vin:
    JB P3.2, Wait4Vin ;warten das Zähler fertig

    Kết quả : giá trị đếm trong thanh ghi TH0:TL0 tỷ lệ với giá trị điện áp vào Vin.

    Nếu điện áp vào Vin lớn, sẽ gây tràn T0 và gây sai số,
    Chương trình sẽ kiểm tra nếu tràn T0, sẽ gán giá trị Max = FFFFh vào thanh ghi.
    lệnh:
    JNB TF0, MOK ;Überlauf ???
    MOV TL0, #0FFH ; dann auf max setzen
    MOV TH0, #0FFH
    MOK:

    tại đây, Giá trị Vin trong thanh ghi TH0:TL0

    Kết thúc quá trình, lại lặp lại lần đo tiếp theo từ B1.

    Trong ví dụ trên, tác giả không dùng ngắt (cho dễ hiểu), Chúng ta có thể cải tiến dùng Ngắt sẽ tăng độ chính xác của phép biến đổi.
    Có nhiều biến thể của mạch với đầu vào -V, hoặc +/-V, và code ASM ở file kèm theo,
    link gốc tại đây: Dual Slope ADC for 8051

    Chúc các Bạn thành công !

    Các file đính kèm:

    phunghe, ThaiKy, thanh_nhanbk7 others thích bài này.
    #1
  2. Đăng 27/12/14 #2

    Coffee-Bean Mechatronics

    Số bài viết: 474
    Đã được thích: 1,257
    Wow, quá hay cám ơn chủ thớt , mà nếu hiểu được lý thuyết chắc cũng có thể áp dụng cho bất kỳ vi điều khiển nào cũng được đúng không nhỉ...

    À mà đọc lý thuyết thấy cũng không đơn giản, không biết bạn yeuthichdientu có thể nói sơ qua một ít về lý thuyết cho mình dễ nắm được không nhỉ ? ít nhất là cũng hiểu một chút về giải thuật...

    Cám ơn chủ thớt trước...:)...
    yeuthichdientu thích bài này.
    #2
  3. Đăng 28/12/14 #3

    yeuthichdientu Thạc sỹ

    Số bài viết: 1,949
    Đã được thích: 2,731
    tiếp...
    Thêm một chút lý thuyết cơ bản về phương pháp ADC 2 độ dốc (Dual-slope).
    Với nguyên lý cơ bản, chúng ta hoàn toàn có thể tự xây dựng mạch đo theo yêu cầu đề ra.

    Nguyên lý chung:
    Phương pháp dựa trên mạch tích phân điện áp (thường là dùng một bộ khuyếch đại thuật toán+tụ+trở)
    Mạch cơ bản nhất là nạp tụ với điện áp cần đo (đo khoảng thời gian T nạp-hay là Tu) và xả tụ với điện áp tham chiếu (đo khoảng thời gian T xả-hay là Td)
    So sánh hai khoảng thời gian đó sẽ biết giá trị điện áp cần đo.

    index.

    Ưu điểm là kết quả đo hoàn toàn độc lập với tụ C và trở R, biến thiên trị số RC không quá quan trọng với phương pháp này, Nguyên do là nạp và xả trong cùng một phép đo, với thời gian ngắn nên sự thay đổi là không đáng kể.

    Trong mạch thực tế, vì mạch dùng KĐTT với đầu vào đảo, nên chu trình nạp (sườn lên) thực tế làm đầu ra giảm, chu trình xả (sườn xuống) lại làm cho đầu ra tăng.

    Độ phân giải (resolution) của phương pháp này phụ thuộc vào khoảng thời gian chu trình xả và xung nhịp đồng hồ. Thời gian đo càng dài với xung nhịp càng nhanh thì càng tăng độ phân giải.
    VD: Với phép đo Vin lớn nhất=Vref (full-scale), xung nhịp 10MHz, độ phân giải 16bit, khoảng thời gian đo sẽ là 13.1mS, tương đương 76 phép đo/1 giây.
    với độ phân giải 10bit, sẽ mất 0.2mS/phép đo , tương đương 4900 phép đo/ giây.

    Hạn chế:
    Không hẳn cứ tăng khoảng thời gian đo và tần số xung nhịp là có thể tăng độ phân giải, phụ thuộc một số yếu tố:
    - Điện áp ra của bộ KĐTT (bộ tích phân), với thời gian đo quá lâu, đầu ra bộ KÐTT sẽ tăng đến giá trị Max và gây sai số phép đo.
    - Độ chính xác của mạch so sánh và nhiễu cũng là vấn đề, chỉ nên tính toán với sai số 1mV (có thể hơn nếu dùng KÐTT cao cấp)
    - Chất lượng tụ cũng gây ảnh hưởng, nếu phép đo quá dài, dung môi thay đổi có thể gây sai số.

    Các Biến thể khác: có một số biến thể cao cấp khác như Multi-slope Run-up/ Run-down, về cơ bản vẫn trên nguyên lý dual-slope nói trên. (phần này dành cho các Bạn nghiên cứu chuyên sâu tự tìm hiểu thêm)

    Một số thiết bị đo công nghiệp sử dụng nguyên lý Multi-slop đạt 16bit, 100,000 phép đo/giây, như Agilent/HP-3458A (từ ~10 năm trước) :
    (một thông số thật sự ấn tượng, không còn là việc "tiết kiệm" một con chip có tích hợp modul ADC nữa)

    3458_all.JPG

    Các file đính kèm:

    ThaiKy, Coffee-Beanthanh_nhanbk thích bài này.
    #3
  4. Đăng 30/12/14 #4

    Coffee-Bean Mechatronics

    Số bài viết: 474
    Đã được thích: 1,257
    Oh, cảm ơn yeuthichdientu như vậy trong hình trên công thức tính Vin sẽ như sau:
    [​IMG]
    Trong đó Tint và Vinitial là thời gian tích điện và điện áp ban đầu của mạch tích phân, nếu xem Tint=Tu và Vinitial =0 khi đó
    [​IMG]

    [​IMG]
    Và khi chuyển mạch để xả:

    [​IMG]
    từ hai cái trên tính ra được điện áp cần đo :
    [​IMG]
    Hay, nói chung là ... hay...:)...

    À mà nó thể hiện trên giải thuật ở chỗ nào vậy chủ thớt nhỉ...8->
    yeuthichdientuThaiKy thích bài này.
    #4

Chia sẻ trang này