Thứ Bảy, 1 tháng 12, 2018

Bài 13. ADC trong AVR vi điều khiển ATmega32A

Hướng dẫn này là về ADC trong AVR vi điều khiển ATmega32A. ADC là viết tắt của analog để chuyển đổi kỹ thuật số cho phép chúng ta tương tác với thế giới vật lý. Hầu như tất cả các vi điều khiển đều có mạch tích hợp của ADC. ADC cho phép chúng ta đọc dữ liệu từ cảm biến bằng vi điều khiển. Bằng cách này, chúng tôi có thể kiểm soát, cảm nhận và giao tiếp với dữ liệu thế giới thực. Hãy thâm nhập kỹ thuật hơn một chút. ADC trong AVR vi điều khiển ATmega32A được ghép với PORTA có nghĩa là kênh ADC được chia sẻ với PORTA. ADC có thể hoạt động ở chế độ chuyển đổi đơn và chế độ chạy tự do. Trong chế độ chuyển đổi đơn, ADC thực hiện chuyển đổi và sau đó dừng lại. Trong khi chạy tự do, nó được sử dụng để chuyển đổi liên tục. Nó thực hiện chuyển đổi và bắt đầu chuyển đổi tiếp theo ngay sau đó.

ADC hoạt động như thế nào?

Trong ví dụ thế giới thực, mọi cảm biến cảm nhận các thông số vật lý (điện áp, nhiệt độ hoặc áp suất, vv ..) và chuyển đổi nó thành tín hiệu tương tự tương tự. Nhưng để xử lý tín hiệu hiệu quả và dễ dàng, tín hiệu analog này được chuyển đổi thành một giá trị số tương đương bằng cách sử dụng công cụ chuyển đổi analog sang kỹ thuật số. Giá trị kỹ thuật số này sau đó được đưa vào bộ vi điều khiển đặc trưng của ADC.
ADC của AVR có độ phân giải 8 kênh và 10 bit
8-kênh: Điều này có nghĩa là có 8 chân ADC được ghép với nhau. Chúng ta có thể thấy các chân có tên là PA0, PA1… ..PA7. Độ phân giải 10 bit: Điều này có nghĩa là có 2 ^ 10 = 1024 bước / số.
Giả sử chúng ta sử dụng tham chiếu 5V. Trong trường hợp này, bất kỳ giá trị tương tự nào trong khoảng 0V và 5V được chuyển thành giá trị ADC tương đương. Dải 0-5V được chia thành 2 ^ 10 = 1024 bước. Sử dụng điện áp tham chiếu mặc định là 5v và điện áp này được chuyển thành giá trị 10 bit, độ phân giải của mỗi bit là 5v / 1023 = 4.88mV cho mỗi giá trị liên tiếp, nhưng hãy tưởng tượng rằng bạn có một đồng hồ tốc độ tương tự, chúng gần như luôn luôn 3.3v một phần, vì vậy nếu bạn sử dụng tham chiếu 5v, bạn sẽ có 5 - 3.3 = 1.7v giá trị không sử dụng và cũng giảm độ phân giải, bây giờ hãy xem độ phân giải là gì nếu bạn sử dụng điện áp tham chiếu 3.3v 3.3 / 1023 = 3.22mV cho mỗi giá trị liên tiếp, do đó, nó đạt được độ phân giải và bạn sẽ có thể sử dụng đầy đủ các ADC.

ADC Counts và phạm vi điện áp

ADC bên trong cũng có thể được sử dụng trong chế độ 8 bit, chỉ sử dụng 8 bit có độ phân giải 10 bit lớn nhất, điều này có thể hữu ích khi làm việc trong môi trường ồn ào và bạn chỉ cần độ phân giải 8 bit. là một điểm cộng vì bạn không cần phải tốn thêm thời gian để chuyển toàn bộ 10 bit thành 8 bit.
Hãy để tôi giới thiệu cho bạn một cái gì đó mà là quan trọng để biết điều đó. Khi chip của chúng tôi đang được cấp nguồn 5v, chúng tôi có thể cắm bất kỳ tín hiệu nào mà chúng tôi muốn vào chân đầu vào ADC nếu tín hiệu nằm trong dải 0-5v, trên hoặc dưới đó và mạch ADC sẽ bị hỏng vĩnh viễn và thậm chí bạn có thể phá hủy toàn bộ chip. Chúng ta cũng có thể thay đổi (cho rằng nó luôn dưới mức VCC của chip), điện áp tối đa mà ADC sử dụng, để bạn có thể đặt điện áp tối đa mong muốn (nó được gọi là điện áp tham chiếu và nó chống lại điện áp này. thực hiện) trong pin Aref, đó là pin 32 của gói DIP và sau đó cấu hình ADC trong phần mềm để sử dụng tham chiếu điện áp đó, tôi sẽ không giải thích điều này trong hướng dẫn này, nhưng nếu bạn có nghi ngờ chỉ cần chụp một câu hỏi.

Hãy hiểu ADC Prescaler và ADC Register:

ADC PRESCALER
ADC cần xung nhịp để thực hiện chuyển đổi của nó. Đồng hồ này được tạo ra bởi đồng hồ hệ thống bằng cách chia nó để có tần số nhỏ hơn. ADC yêu cầu tần số từ 50 KHz đến 200 KHz. Ở tần số cao hơn, chuyển đổi sẽ nhanh chóng trong khi chuyển đổi tần số thấp hơn xảy ra chậm và chính xác. Tần số hệ thống đầu tiên có thể được đặt thành bất kỳ giá trị nào bởi người dùng của họ. Vì vậy Prescaler tạo ra tần số chấp nhận được cho ADC từ bất kỳ tần số xung nhịp hệ thống nào. Đồng hồ hệ thống có thể được chia cho 2, 4, 16, 32, 64 và 128 bằng cách cài đặt bộ đếm trước.
ADC ĐĂNG KÝ
Như chúng ta biết đăng ký có liên quan đến mô-đun ngoại vi cụ thể (như ADC, Timer, và USART vv) cung cấp các liên kết truyền thông giữa CPU & ngoại vi. Bạn có thể cấu hình ADC theo nhu cầu của bạn bằng cách sử dụng các thanh ghi và bạn cũng có thể nhận được kết quả chuyển đổi trong thanh ghi thích hợp.
  1. Đăng ký lựa chọn bộ ghép kênh ADC- ADMUX
  2. Đăng ký kiểm soát & trạng thái ADC- ADCSRA
  3. Đăng ký dữ liệu ADC- ADCL và ADCH
Đăng ký ADCChức năng
ADMUXĐể chọn điện áp tham chiếu và kênh đầu vào
ADCSRANó đại diện cho trạng thái của ADC và cũng sử dụng để kiểm soát nó
ADCL / ADCHĐể thu thập kết quả cuối cùng của chuyển đổi
Hãy bắt đầu bằng cách thực hiện một chương trình thử nghiệm đơn giản để chúng ta có thể thấy ADC của chúng ta đang hoạt động. Đối với điều này atmega của chúng tôi sẽ đọc một 10Kohm POT kết nối với pin 0 của PORT A, đó là pin PA0 của ATmega32A, và giá trị đọc của POT sẽ được hiển thị trên thiết bị đầu cuối nối tiếp của PC. Chúng tôi sẽ sử dụng Thư viện mã USART để giao tiếp nối tiếp.

KẾT NỐI: ADC trong AVR Vi điều khiển ATmega32A

 Nồi sẽ được kết nối như trong sơ đồ sau:

Giao diện POT với AVR ATmega32A

Hãy chắc chắn để kết nối tinh thể bên ngoài 16 MHz để vi điều khiển ATmega32A và đừng quên để ghi các bit cầu chì sau khi tải tập tin hex vào ATmega. Các bit cầu chì làLFUSE : 0xFF HFUSE : 0x99 . Nếu trong trường hợp bạn có bất kỳ câu hỏi nào, chỉ cần viết vào phần bình luận và chúng tôi sẽ giúp bạn.
Để sử dụng ADC trong AVR vi điều khiển ATmega32A. Chúng ta phải thực hiện một số bước. Đây là mã giả và đây là những gì chúng ta cần làm:
  1. Định cấu hình ADC
  2. BẬT ADC
  3. Bắt đầu chuyển đổi ADC
  4. Đọc giá trị ADC từ đăng ký dữ liệu ADC
Đây là chương trình C hoàn chỉnh để sử dụng ADC trong vi điều khiển AVR ATmega32A. Trong phần sau của hướng dẫn này, chúng tôi sẽ chia chương trình thành nhiều phần để có được nhiều khung nhìn bên trong hơn.

GIẢI THÍCH MÃ:

Một vài dòng đầu tiên đại diện cho một số tiêu chuẩn bao gồm chúng ta sẽ sử dụng trong khi cấu trúc mã của chúng ta. Nếu bạn so sánh mã từ hướng dẫn trước, bạn sẽ tìm thấy rất nhiều điểm tương đồng. Ở đây chúng tôi sẽ chỉ thảo luận về các chức năng được thêm vào dự án trước đó. Tôi khuyên bạn nên lấy một bảng dữ liệu và nhảy ngay trên Chương: 22 và Trang No: 223. Ngoài ra trong chức năng chính.
Đầu tiên chúng ta cần cung cấp một đồng hồ cho ADC, và như chúng ta đã thấy trước khi tín hiệu này là giá trị tối đa được khuyến nghị và đồng hồ này được tạo ra bằng cách sử dụng prescaler, vì vậy trước tiên hãy thiết lập prescaler của chúng ta. Điều này được cấu hình trong thanh ghi ADCSRA và các bit có liên quan đến các cài đặt bộ cài đặt trước là ADPS2, ADPS1 và ADPS0, bạn có thể thấy trên trang số: 226 các giá trị có thể cho bộ đếm trước là 2, 4, 8, 16, 32, 64 và 128, khi chúng ta đang chạy ở 16Mhz, chúng ta sẽ sử dụng 128 prescaler để đồng hồ ADC của chúng ta sẽ là 125Khz (16000000/128 = 125 Khz), để thiết lập giá trị này chúng ta cần thiết lập ba bit ADPS thành 1.
Bây giờ chúng ta sẽ cấu hình tham chiếu điện áp mà ADC của chúng ta sẽ sử dụng, trong hướng dẫn này chúng ta sẽ sử dụng điện áp cũng được sử dụng để cấp nguồn cho phần còn lại của ATmega (+ 5v), với một tụ điện bên ngoài kết nối với pin AVCC. Nguồn điện áp tham chiếu được cấu hình trong thanh ghi ADMUX với các bit REFS0 và REFS1. Trong trường hợp của chúng ta, chúng ta sẽ tạo bit REFS0 thành 1, nó cũng nằm trong thanh ghi ADMUX mà chúng ta có thể chọn kênh nào sẽ được sử dụng để thực hiện chuyển đổi analog sang kỹ thuật số, nó được chọn bằng MUX3 tới MUX0 bit. không chạm vào bit này khi chúng ta đang đọc từ kênh 0 và tất cả các bit trong thanh ghi đang ở trạng thái 0 khi chúng ta cấp nguồn cho ATmega.
Bây giờ ADC của chúng ta gần như đã được thiết lập, chúng ta chỉ cần bật nó lên (vì theo mặc định nó bị tắt để bộ điều khiển vi mô tiêu thụ ít dòng hơn), và để chúng ta đặt bit ADEN tại 1 trong thanh ghi ADCSRA. Những thứ còn lại cũng được nhận xét thành chính mã.
Bây giờ ở đây trong chức năng này, chúng ta phải chọn kênh đầu vào ADC. Trong ví dụ này, chúng ta sẽ đọc dữ liệu từ kênh 0 là pin PA0 của chip ATmega. Nó có thể được thực hiện bằng cách thiết lập hoặc xóa các bit MUX4, MUX3, MUX2, MUX1 và MUX0 trong thanh ghi ADMUX, ánh xạ giữa các giá trị MUX và kênh được chọn được hiển thị trong bảng này:
MUX4MUX3MUX2MUX1MUX0Ghim sẽ được đọc
00000PORTA0 Analog 0
00001PORTA1 Analog 1
00011PORTA2 Analog 2
00000PORTA3 Analog3
00100PORTA4 Analog 4
00101PORTA5 Analog 5
00110PORTA6 Analog 6
00111PORTA7 Analog 7
khi chạy trong chế độ chuyển đổi đơn có một số điều mới mà chúng ta phải kiểm tra, vì đồng hồ ADC khá chậm (125Khz so với 16Mhz mà chip đang chạy) và mỗi chuyển đổi mất 13 chu kỳ của đồng hồ 125Khz đó khi chúng ta đọc ADC chúng tôi bắt đầu một chuyển đổi đơn mới và chúng tôi cần đợi cho đến khi hoàn thành, để thực hiện điều này, chúng tôi kiểm tra ADSC bit cho đến khi được xóa, khi xóa chuyển đổi được thực hiện và khi chúng tôi thực hiện chuyển đổi đơn lẻ, chúng tôi không cần phải gây rối các bit ADTS và ADATE.
Mã này vẫn dễ đọc và dễ hiểu, và bây giờ chúng ta có hai hàm tiện dụng mà bạn có thể chỉ cần sao chép và dán vào các dự án của bạn và đọc ADC, số mà bạn chuyển tới read_adc (). Nó cũng là số pin từ PORTA, do đó, kênh tương tự 0 là trong PORTA0 và có thể được đọc bằng cách sử dụng read_adc (0). Các thiết lập còn lại cũng được nhận xét trong chính mã và tự giải thích.
Bạn có thể tự hỏi ADCW là gì? Nó đến từ đâu? Chức năng AVR LIBC của nó được hỗ trợ bởi hầu hết các trình biên dịch avr-gcc, nơi chúng ta nhận được kết quả của việc chuyển đổi ADC. Điều này có thể hữu ích thay vì chuyển bit để có được kết quả 10 bit từ ADCH và ADCL. Đây là những thanh ghi dữ liệu ADC.
Trong vòng lặp không bao giờ kết thúc Chúng ta sẽ đọc giá trị chuyển đổi ADC, và điều này đã thực hiện bằng cách sử dụng hàm read_adc đơn giản (0). Để chuyển đổi giá trị ADC 10 bit thành chuỗi số có thể đọc được, chúng ta cần sử dụng hàm ITOA (viết tắt của Integer TO ASCII), hàm này lấy 3 tham số đầu vào, một là giá trị mà chúng ta muốn chuyển đổi. uint8_t, uint16_t, int và các biến số nguyên tương tự khác, các tham số đầu vào là cơ sở cho nơi chúng tôi muốn chuyển đổi, 2 để chuyển đổi thành nhị phân, 8 cho bát phân, 10 cho thập phân và 16 cho thập lục phân và cuối cùng một mảng nhỏ sẽ là chuỗi đầu ra cộng với chuỗi terminator NULL, mảng đầu ra này phải có ít nhất khoảng trống cho số ký tự tối đa mà số của chúng ta cộng với một cho NULL, vì vậy khi chúng ta đang sử dụng 10 bit giá trị từ ADC , điều này có nghĩa là giá trị tối đa của chúng tôi là 2 ^ 10-1 = 1023, vì vậy chúng tôi có thể có tối đa 4 số cộng với bộ kết thúc vì vậy chúng tôi cần một mảng có không gian cho 5 ký tự. Ngoài ra, itoa là một trong những hàm chuẩn của C, và do đó nó nằm trong tiêu đề stdlib.h và tiêu đề đó phải được đưa vào để trình biên dịch không phàn nàn.
Khi chúng tôi biên dịch và tải về tập tin đầu ra để AVR ATmega32A (Hãy chắc chắn để thiết lập các bit cầu chì). Chúng tôi sẽ nhận được đầu ra ADC trên thiết bị đầu cuối nối tiếp của PC. Đây là đầu ra từ dự án của chúng tôi.

ADC Channel 0 Đọc

Chúng tôi hy vọng bạn sẽ tìm thấy hướng dẫn này giáo dục và giải trí để sử dụng ADC trong AVR vi điều khiển ATmega32A.

Bài đăng mới nhất

Hướng dẫn sử dụng Cân điện tử Fujihatsu FTC-01

Hướng dẫn sử dụng Cân điện tử Fujihatsu FTC-01 # candientu ,  # fujihatsu ,  # candientufujihatsu  #candientu,  # candientufujhatsu , #fuji...

Bài đăng phổ biến