Mục lục:

Arduino Waveform Generator: 5 bước (có hình ảnh)
Arduino Waveform Generator: 5 bước (có hình ảnh)

Video: Arduino Waveform Generator: 5 bước (có hình ảnh)

Video: Arduino Waveform Generator: 5 bước (có hình ảnh)
Video: Arduino | Tìm Hiểu Bản Chất Băm Xung PWM Arduino Kèm Code Chi Tiết || PWM In Arduino 2024, Tháng bảy
Anonim
Bộ tạo dạng sóng Arduino
Bộ tạo dạng sóng Arduino

Cập nhật tháng 2 năm 2021: kiểm tra phiên bản mới với tốc độ lấy mẫu gấp 300 lần, dựa trên Raspberry Pi Pico

Trong phòng thí nghiệm, người ta thường cần một tín hiệu lặp lại có tần số, hình dạng và biên độ nhất định. Nó có thể là để kiểm tra một bộ khuếch đại, kiểm tra một mạch, một thành phần hoặc một bộ truyền động. Các bộ tạo dạng sóng mạnh mẽ có sẵn trên thị trường, nhưng tương đối dễ dàng để tự tạo một bộ hữu ích với Arduino Uno hoặc Arduino Nano, xem ví dụ:

www.instructables.com/id/Arduino-Waveform-…

www.instructables.com/id/10-Resister-Ardui…

Đây là mô tả của một cái khác với các tính năng sau:

* Dạng sóng chính xác: Đầu ra 8 bit sử dụng R2R DAC, hình dạng mẫu 256

* Nhanh: tốc độ lấy mẫu 381 kHz

* Chính xác: Dải tần số bước 1mHz. Chính xác như pha lê Arduino.

* Hoạt động dễ dàng: dạng sóng và tần số có thể cài đặt với bộ mã hóa quay đơn

* Biên độ đa dạng: milivôn đến 20V

* 20 dạng sóng được xác định trước. Thẳng thắn để bổ sung thêm.

* Dễ chế tạo: Arduino Uno hoặc Nano cộng với các thành phần tiêu chuẩn

Bước 1: Cân nhắc kỹ thuật

Tạo tín hiệu tương tự

Một thiếu sót của Arduino Uno và Nano là nó không có bộ chuyển đổi kỹ thuật số sang tương tự (DAC), vì vậy không thể làm cho nó xuất ra điện áp tương tự trực tiếp trên các chân cắm. Một giải pháp là thang R2R: 8 chân kỹ thuật số được kết nối với mạng điện trở để có thể đạt tới 256 mức đầu ra. Thông qua việc truy cập cổng trực tiếp, Arduino có thể đặt 8 chân đồng thời bằng một lệnh duy nhất. Đối với mạng điện trở, cần 9 điện trở có giá trị R và 8 điện trở có giá trị 2R. Tôi đã sử dụng 10kOhm làm giá trị cho R, giữ cho dòng điện từ các chân đến 0,5mA hoặc nhỏ hơn. Tôi đoán R = 1kOhm cũng có thể hoạt động, vì Arduino có thể dễ dàng cung cấp 5mA mỗi chân, 40mA mỗi cổng. Điều quan trọng là tỷ số giữa điện trở R và 2R thực sự là 2. Điều đó dễ dàng đạt được nhất bằng cách đặt 2 điện trở có giá trị R mắc nối tiếp, tổng cộng có 25 điện trở.

Bộ tích lũy pha

Việc tạo ra một dạng sóng sau đó chuyển sang việc gửi lặp đi lặp lại một chuỗi các số 8 bit đến các chân Arduino. Dạng sóng được lưu trữ trong một mảng 256 byte và mảng này được lấy mẫu và gửi đến các chân. Tần số của tín hiệu đầu ra được xác định bởi tốc độ di chuyển của một tín hiệu qua mảng. Một cách mạnh mẽ, chính xác và thanh lịch để làm điều đó là sử dụng bộ tích lũy pha: số 32 bit được tăng dần đều đặn và chúng tôi sử dụng 8 bit quan trọng nhất làm chỉ số của mảng.

Lấy mẫu nhanh

Các ngắt cho phép lấy mẫu tại các thời điểm xác định rõ, nhưng chi phí của các ngắt giới hạn tần số lấy mẫu ở mức ~ 100kHz. Một vòng lặp vô hạn để cập nhật pha, lấy mẫu dạng sóng và đặt các chân cần 42 chu kỳ đồng hồ, do đó đạt được tốc độ lấy mẫu là 16MHz / 42 = 381kHz. Xoay hoặc đẩy bộ mã hóa quay gây ra sự thay đổi chân và ngắt ra khỏi vòng lặp để thay đổi cài đặt (dạng sóng hoặc tần số). Ở giai đoạn này, 256 số trong mảng được tính toán lại để không cần thực hiện các phép tính thực tế nào về dạng sóng trong vòng lặp chính. Tần số tối đa tuyệt đối có thể được tạo ra là 190kHz (một nửa tốc độ lấy mẫu) nhưng sau đó chỉ có hai mẫu mỗi chu kỳ, vì vậy không kiểm soát được nhiều hình dạng. Do đó, giao diện không cho phép đặt tần số trên 100kHz. Ở tần số 50kHz, có 7-8 mẫu mỗi khoảng thời gian và ở 1,5 kHz trở xuống, tất cả 256 số được lưu trữ trong mảng sẽ được lấy mẫu mỗi khoảng thời gian. Đối với các dạng sóng mà tín hiệu thay đổi trơn tru, ví dụ như sóng sin, việc bỏ qua các mẫu không có vấn đề gì. Nhưng đối với các dạng sóng có gai hẹp, ví dụ như sóng vuông với chu kỳ nhiệm vụ nhỏ, có nguy cơ là đối với các tần số trên 1,5 kHz, thiếu một mẫu đơn lẻ có thể dẫn đến dạng sóng không hoạt động như mong đợi

Độ chính xác của tần số

Số lượng pha tăng lên ở mỗi mẫu tỷ lệ với tần số. Do đó, tần số có thể được đặt ở độ chính xác 381kHz / 2 ^ 32 = 0,089mHz. Trong thực tế, độ chính xác như vậy hầu như không bao giờ cần thiết, vì vậy giao diện giới hạn để đặt tần số theo từng bước 1mHz. Độ chính xác tuyệt đối của tần số được xác định bởi độ chính xác của tần số xung nhịp Arduino. Điều này phụ thuộc vào loại Arduino nhưng hầu hết chỉ định tần số 16.000MHz, do đó, độ chính xác là ~ 10 ^ -4. Mã cho phép sửa đổi tỷ lệ của tần số và độ tăng pha để điều chỉnh các sai lệch nhỏ của giả định 16MHz.

Bộ đệm và khuếch đại

Mạng điện trở có trở kháng đầu ra cao, vì vậy điện áp đầu ra của nó nhanh chóng giảm xuống nếu một tải được gắn vào. Điều đó có thể được giải quyết bằng cách tạo bộ đệm hoặc khuếch đại đầu ra. Ở đây, bộ đệm và khuếch đại được thực hiện với một opamp. Tôi đã sử dụng LM358 vì tôi có một số. Nó là một opamp chậm (tốc độ quay 0,5V mỗi micro giây) nên ở tần số cao và biên độ cao, tín hiệu sẽ bị méo. Một điều tốt là nó có thể xử lý điện áp rất gần 0V. Tuy nhiên, điện áp đầu ra được giới hạn ở mức ~ 2V bên dưới đường ray, vì vậy việc sử dụng nguồn + 5V sẽ giới hạn điện áp đầu ra ở mức 3V. Mô-đun bậc thang nhỏ gọn và rẻ. Cung cấp + 20V cho opamp, nó có thể tạo ra tín hiệu với điện áp lên đến 18V. (NB, giản đồ nói LTC3105 vì đó là bước duy nhất tôi tìm thấy trong Fritzing. Thực tế, tôi đã sử dụng mô-đun MT3608, hãy xem hình ảnh trong các bước tiếp theo). Tôi chọn áp dụng một sự suy giảm biến đổi cho đầu ra của DAC R2R, sau đó sử dụng một trong các opamps để đệm tín hiệu mà không cần khuếch đại và opamps kia để khuếch đại 5,7, để tín hiệu có thể đạt đầu ra tối đa khoảng 20V. Dòng điện đầu ra khá hạn chế, ~ 10mA, vì vậy có thể cần một bộ khuếch đại mạnh hơn nếu tín hiệu để điều khiển một loa lớn hoặc nam châm điện.

Bước 2: Các thành phần bắt buộc

Đối với bộ tạo dạng sóng lõi

Arduino Uno hoặc Nano

Màn hình LCD 16x2 + tông đơ 20kOhm và điện trở loạt 100Ohm cho đèn nền

Bộ mã hóa vòng quay 5 chân (với nút ấn tích hợp)

25 điện trở 10kOhm

Đối với bộ đệm / bộ khuếch đại

LM358 hoặc opamp kép khác

mô-đun nâng cấp dựa trên MT3608

Biến trở 50kOhm

Điện trở 10kOhm

Điện trở 47kOhm

Tụ điện 1muF

Bước 3: Thi công

Sự thi công
Sự thi công
Sự thi công
Sự thi công

Tôi đã hàn mọi thứ trên một bảng nguyên mẫu 7x9cm, như trong hình. Vì nó hơi lộn xộn với tất cả các dây dẫn nên tôi đã cố gắng tô màu các dây dẫn mang điện áp dương là màu đỏ và những dây dẫn mang điện áp dương màu đen.

Bộ mã hóa tôi đã sử dụng có 5 chân, 3 chân ở một bên, 2 chân ở phía bên kia. Mặt có 3 chân là bộ mã hóa thực tế, mặt có 2 chân là nút tích hợp. Ở phía 3 chân, chân trung tâm phải được nối với đất, hai chân còn lại với D10 và D11. Ở phía 2 chân, một chân phải được nối với đất và chân kia với D12.

Đó là điều xấu xí nhất mà tôi từng làm nhưng nó hoạt động. Sẽ rất tốt nếu bạn đặt trong một chiếc hộp, nhưng hiện tại, việc làm thêm và chi phí không thực sự chứng minh được điều đó. Nano và màn hình được gắn với đầu ghim. Tôi sẽ không làm điều đó lần nữa nếu tôi muốn xây dựng một cái mới. Tôi đã không đặt các đầu nối trên bảng để nhận tín hiệu. Thay vào đó, tôi nhặt chúng bằng dây cá sấu từ những đoạn dây đồng nhô ra, được dán nhãn như sau:

R - tín hiệu thô từ bộ DAC R2R

B - tín hiệu đệm

A - tín hiệu khuếch đại

T - tín hiệu hẹn giờ từ chân 9

G - mặt đất

+ - điện áp 'cao' dương từ mô-đun bước lên

Bước 4: Mã

Mã, một bản phác thảo Arduino, được đính kèm và phải được tải lên Arduino.

20 dạng sóng đã được xác định trước. Nên đơn giản để thêm bất kỳ làn sóng nào khác. Lưu ý rằng các sóng ngẫu nhiên lấp đầy mảng 256 giá trị với các giá trị ngẫu nhiên, nhưng cùng một mẫu được lặp lại mỗi chu kỳ. Các tín hiệu ngẫu nhiên thực sự nghe giống như tiếng ồn, nhưng dạng sóng này nghe giống tiếng còi hơn nhiều.

Mã đặt tín hiệu 1kHz trên chân D9 với TIMER1. Điều này rất hữu ích để kiểm tra thời gian của tín hiệu tương tự. Đó là cách tôi tìm ra số chu kỳ đồng hồ là 42: Nếu tôi giả sử là 41 hoặc 43 và tạo ra tín hiệu 1kHz, rõ ràng nó có tần số khác với tín hiệu trên chân D9. Với giá trị 42, chúng hoàn toàn phù hợp.

Thông thường, Arduino ngắt mỗi mili giây để theo dõi thời gian bằng hàm millis (). Điều này sẽ làm xáo trộn việc tạo tín hiệu chính xác, do đó ngắt cụ thể bị vô hiệu hóa.

Trình biên dịch cho biết: "Sketch sử dụng 7254 byte (23%) không gian lưu trữ chương trình. Tối đa là 30720 byte. Các biến toàn cục sử dụng 483 byte (23%) bộ nhớ động, để lại 1565 byte cho các biến cục bộ. Tối đa là 2048 byte." Vì vậy, có không gian rộng rãi cho mã phức tạp hơn. Lưu ý rằng bạn có thể phải chọn "ATmega328P (bộ nạp khởi động cũ)" để tải thành công lên Nano.

Bước 5: Sử dụng

Bộ tạo tín hiệu có thể được cấp nguồn đơn giản thông qua cáp USB mini của Arduino Nano. Tốt nhất là nên thực hiện với một bộ dự trữ điện để không có vòng nối đất ngẫu nhiên với thiết bị mà nó có thể được kết nối với.

Khi được bật, nó sẽ tạo ra sóng hình sin 100Hz. Bằng cách xoay núm, có thể chọn một trong 20 loại sóng khác. Bằng cách xoay khi được đẩy, con trỏ có thể được đặt thành bất kỳ chữ số nào của tần số, sau đó có thể thay đổi giá trị này thành giá trị mong muốn.

Biên độ có thể được điều chỉnh bằng chiết áp và có thể sử dụng tín hiệu đệm hoặc tín hiệu khuếch đại.

Thực sự hữu ích khi sử dụng máy hiện sóng để kiểm tra biên độ tín hiệu, đặc biệt là khi tín hiệu cung cấp dòng điện cho thiết bị khác. Nếu dòng điện được rút ra quá nhiều, tín hiệu sẽ bị cắt và tín hiệu bị méo nặng

Đối với tần số rất thấp, đầu ra có thể được hiển thị bằng đèn LED mắc nối tiếp với điện trở 10kOhm. Các tần số âm thanh có thể được nghe bằng loa. Đảm bảo đặt tín hiệu rất nhỏ ~ 0,5V, nếu không dòng điện quá cao và tín hiệu bắt đầu bị cắt.

Đề xuất: