- Trình tạo chức năng DDS là gì?
- Hiểu hoạt động của IC tạo chức năng AD9833
- Các thành phần cần thiết để xây dựng Bộ tạo chức năng dựa trên AD9833
- Bộ tạo chức năng dựa trên AD9833 - Sơ đồ
- Trình tạo chức năng dựa trên AD9833 - Mã Arduino
- Kiểm tra Bộ tạo chức năng dựa trên AD9833
- Cải tiến hơn nữa
Nếu bạn là một người đam mê điện tử như tôi, người muốn điều chỉnh xung quanh với các mạch điện tử khác nhau, việc có một Bộ tạo chức năng tốt đôi khi trở thành điều bắt buộc. Nhưng việc sở hữu một chiếc là cả một vấn đề vì những thiết bị cơ bản như vậy có thể tốn cả gia tài. Xây dựng thiết bị kiểm tra của riêng bạn không chỉ rẻ hơn mà còn là một cách tuyệt vời để nâng cao kiến thức của bạn.
Vì vậy, trong bài viết này, chúng ta sẽ xây dựng một Bộ tạo tín hiệu đơn giản với Arduino và Mô-đun bộ tạo chức năng AD9833 DDS có thể tạo ra các sóng sin, vuông và tam giác với tần số tối đa là 12 MHz ở đầu ra. Và cuối cùng, chúng tôi sẽ kiểm tra tần số đầu ra với sự trợ giúp của máy hiện sóng.
Trước đây chúng tôi đã chế tạo Máy tạo sóng hình sin đơn giản, Máy tạo sóng vuông và Máy tạo sóng tam giác với sự trợ giúp của các mạch tương tự cơ bản. Bạn có thể kiểm tra những điều đó nếu bạn đang tìm kiếm một số Mạch tạo dạng sóng cơ bản. Ngoài ra, nếu bạn muốn xây dựng một bộ tạo chức năng Arduino rẻ hơn mà không sử dụng Mô-đun AD9833, bạn có thể xem Dự án tự tạo bộ tạo dạng sóng Arduino.
Trình tạo chức năng DDS là gì?
Như tên của nó, một bộ tạo chức năng là một thiết bị có thể xuất ra một dạng sóng cụ thể với một tần số cụ thể khi cài đặt. Ví dụ: hãy xem xét bạn có một bộ lọc LC mà bạn muốn kiểm tra đáp ứng tần số đầu ra của mình, bạn có thể dễ dàng làm điều đó với sự trợ giúp của bộ tạo hàm. Tất cả những gì bạn cần làm là đặt tần số đầu ra và dạng sóng mong muốn, sau đó bạn có thể kéo nó xuống hoặc tăng lên để kiểm tra phản hồi. Đây chỉ là một ví dụ, bạn có thể làm nhiều việc hơn với nó khi danh sách tiếp tục.
DDS là viết tắt của Direct Digital Synthesis. Nó là một loại máy phát dạng sóng sử dụng bộ chuyển đổi tín hiệu số sang tín hiệu tương tự (DAC) để xây dựng tín hiệu từ mặt đất lên. Phương pháp này được sử dụng đặc biệt để tạo ra một sóng sin. Nhưng vi mạch chúng ta đang sử dụng có thể tạo ra tín hiệu sóng Vuông hoặc Tam giác. Các hoạt động xảy ra bên trong chip DDS là kỹ thuật số nên nó có thể chuyển đổi tần số rất nhanh hoặc có thể chuyển từ tín hiệu này sang tín hiệu khác rất nhanh. Thiết bị này có độ phân giải tần số tốt với phổ tần số rộng.
Hiểu hoạt động của IC tạo chức năng AD9833
Trọng tâm của dự án của chúng tôi là IC tạo dạng sóng lập trình AD9833 được thiết kế và phát triển bởi các thiết bị tương tự. Nó là một máy phát dạng sóng có thể lập trình, công suất thấp, có khả năng tạo ra sóng hình sin, sóng tam giác và sóng vuông với tần số tối đa là 12 MHz. Đó là một vi mạch rất độc đáo có khả năng thay đổi tần số và pha đầu ra chỉ bằng một chương trình phần mềm. Nó có một giao diện SPI 3 dây, đó là lý do tại sao việc giao tiếp với IC này trở nên rất đơn giản và dễ dàng. Sơ đồ khối chức năng của IC này được hiển thị bên dưới.
Hoạt động của vi mạch này rất đơn giản. Nếu chúng ta nhìn vào sơ đồ khối chức năng ở trên, chúng ta sẽ thấy rằng chúng ta có Bộ tích lũy pha có công việc là lưu trữ tất cả các giá trị kỹ thuật số có thể có của một sóng sin, bắt đầu từ 0 đến 2π. Tiếp theo, chúng ta có SIN ROM có công việc là chuyển đổi thông tin pha mà sau này có thể được ánh xạ trực tiếp thành biên độ. SIN ROM sử dụng thông tin pha số làm địa chỉ cho bảng tra cứu và chuyển đổi thông tin pha thành biên độ. Và cuối cùng, chúng ta có một bộ chuyển đổi kỹ thuật số sang tương tự 10 bit, công việc của nó là nhận dữ liệu kỹ thuật số từ SIN ROM và chuyển đổi nó thành điện áp tương tự tương ứng, đó là những gì chúng ta nhận được từ đầu ra. Ở đầu ra, chúng ta cũng có một công tắc mà chúng ta có thể bật hoặc tắt chỉ bằng một đoạn mã phần mềm nhỏ. Chúng tôi sẽ nói về điều đó ở phần sau của bài viết.Các chi tiết bạn thấy ở trên là một phiên bản rút gọn của những gì đang xảy ra bên trong vi mạch và Hầu hết các chi tiết bạn thấy ở trên được lấy từ biểu dữ liệu AD9833, bạn cũng có thể kiểm tra để biết thêm thông tin.
Các thành phần cần thiết để xây dựng Bộ tạo chức năng dựa trên AD9833
Các thành phần cần thiết để xây dựng bộ tạo chức năng dựa trên AD9833 được liệt kê dưới đây, chúng tôi thiết kế mạch này với các thành phần rất chung chung, giúp quá trình sao chép rất dễ dàng.
- Arduino Nano - 1
- AD9833 Bộ tạo hàm DDS - 1
- Màn hình OLED 128 X 64 - 1
- Bộ mã hóa quay chung - 1
- Giắc cắm thùng DC - 1
- Bộ điều chỉnh điện áp LM7809 - 1
- Tụ điện 470uF - 1
- Tụ điện 220uF - 1
- Tụ điện 104pF - 1
- Điện trở 10K - 6
- Công tắc xúc giác - 4
- Thiết bị đầu cuối trục vít 5.04mm - 1
- Tiêu đề Nữ - 1
- Nguồn điện 12V - 1
Bộ tạo chức năng dựa trên AD9833 - Sơ đồ
Sơ đồ mạch đầy đủ cho Bộ tạo chức năng dựa trên AD9833 và Arduino được hiển thị bên dưới.
Chúng tôi sẽ sử dụng AD9833 với Arduino để tạo tần số mong muốn của chúng tôi. Và trong phần này, chúng tôi sẽ giải thích tất cả các chi tiết với sự trợ giúp của schematic; hãy để tôi cung cấp cho bạn một cái nhìn tổng quan ngắn gọn về những gì đang xảy ra với mạch. Hãy bắt đầu với mô-đun AD9833. Mô-đun AD9833 là mô-đun tạo chức năng và nó được kết nối với Arduino theo sơ đồ. Để cấp nguồn cho mạch, chúng tôi đang sử dụng IC ổn áp LM7809, với một tụ phân tách khá, điều này là cần thiết vì nhiễu nguồn có thể gây nhiễu tín hiệu đầu ra dẫn đến đầu ra không mong muốn. Như mọi khi, Arduino đang hoạt động như một bộ não cho dự án này. Để hiển thị tần số đã đặt và các thông tin có giá trị khác, chúng tôi đã kết nối mô-đun màn hình OLED 128 X 64. Để thay đổi dải tần số, chúng tôi đang sử dụng ba công tắc. Nút đầu tiên đặt tần số thành Hz, nút thứ hai đặt tần số đầu ra thành KHz và nút thứ ba đặt tần số thành MHz, chúng ta cũng có một nút khác có thể được sử dụng để bật hoặc tắt đầu ra. Cuối cùng, chúng tôi có bộ mã hóa quay,và chúng tôi phải gắn một số điện trở kéo lên với nó nếu không các công tắc đó sẽ không hoạt động vì chúng tôi đang kiểm tra sự kiện nhấn nút trên phương pháp gộp. Bộ mã hóa quay được sử dụng để thay đổi tần số và công tắc xúc giác bên trong bộ mã hóa quay được sử dụng để chọn dạng sóng đã đặt.
Trình tạo chức năng dựa trên AD9833 - Mã Arduino
Mã hoàn chỉnh được sử dụng trong dự án này có thể được tìm thấy ở cuối trang này. Sau khi thêm các tệp tiêu đề và tệp nguồn được yêu cầu, bạn sẽ có thể biên dịch trực tiếp tệp Arduino. Bạn có thể tải xuống thư viện Arduino ad9833 và các thư viện khác từ liên kết được cung cấp bên dưới hoặc nếu không, bạn có thể sử dụng phương pháp quản lý bảng để cài đặt thư viện.
- Tải xuống Thư viện AD9833 của Bill Williams
- Tải xuống Thư viện OLED SSD1306 của Adafruit
- Tải xuống thư viện Adafruit GFX
Giải thích về mã trong ino. tập tin như sau. Đầu tiên, chúng tôi bắt đầu bằng cách bao gồm tất cả các thư viện bắt buộc. Thư viện cho mô-đun AD9833 DDS trước tiên là thư viện cho OLED và thư viện toán học được yêu cầu cho một số tính toán của chúng tôi.
#include // LIbrary cho Mô-đun AD9833 #include
Tiếp theo, chúng tôi xác định tất cả các chân đầu vào và đầu ra cần thiết cho các nút, công tắc, bộ mã hóa quay và OLED.
#define SCREEN_WIDATA_PINH 128 // Màn hình OLED Chiều rộng tính bằng pixel #define SCREEN_HEIGHT 64 // Chiều cao màn hình OLED, tính bằng pixel #define SET_FREQUENCY_HZ A2 // Nút nhấn để đặt tần số tính bằng Hz #define SET_FREQUENCY_KHZ A3 // Nhấn nút để đặt tần số trong Khz #defENCY A6 // Nút nhấn để đặt tần số theo Mhz #define ENABLE_DISABLE_OUTPUT_PIN A7 // Nút nhấn để bật / tắt đầu ra #define FNC_PIN 4 // Fsync Yêu cầu bởi Mô-đun AD9833 #define CLK_PIN 8 // Pin đồng hồ của bộ mã hóa #define DATA_PIN 7 / / Pin dữ liệu của bộ mã hóa #define BTN_PIN 9 // Nút ấn bên trong trên bộ mã hóa
Sau đó, chúng tôi xác định tất cả các biến cần thiết được yêu cầu trong mã này. Đầu tiên, chúng tôi xác định một bộ đếm biến số nguyên sẽ lưu trữ giá trị bộ mã hóa quay. Hai biến tiếp theo clockPin và clockPinState lưu trữ bức tượng pin được yêu cầu để hiểu hướng bộ mã hóa. Chúng ta có một biến thời gian chứa các giá trị bộ đếm thời gian hiện tại, biến này được sử dụng để gỡ lỗi nút. Tiếp theo, chúng ta có một moduleFrequency biến dài không được đánh dấu giữ tần suất được tính toán sẽ được áp dụng. Tiếp theo, chúng tôi có độ trễ debounce. Độ trễ này có thể được điều chỉnh theo yêu cầu. Tiếp theo, chúng ta có ba biến boolean set_frequency_hz,set_frequency_Khz và set_frequency_Mhz ba biến này được sử dụng để xác định cài đặt hiện tại của mô-đun. Chúng tôi sẽ nói về nó chi tiết hơn trong phần sau của bài viết. Tiếp theo, chúng ta có biến lưu trữ trạng thái của dạng sóng đầu ra, dạng sóng đầu ra mặc định là sóng hình sin. Và cuối cùng, chúng ta có biến encoder_btn_count chứa số nút mã hóa được sử dụng để đặt dạng sóng đầu ra.
int counter = 1; // Giá trị Counter này sẽ tăng hoặc giảm nếu khi quay bộ mã hóa quay int clockPin; // Trình giữ chỗ cho trạng thái chân được sử dụng bởi bộ mã hóa quay int clockPinState; // Trình giữ chỗ cho trạng thái ghim được sử dụng bởi bộ mã hóa quay unsigned long time = 0; // Được sử dụng để gỡ lỗi dài moduleFrequency không dấu; // dùng để đặt tần số đầu ra long debounce = 220; // Debounce delay bool btn_state; // được sử dụng để kích hoạt đầu ra của Mô-đun AD98333 bool set_frequency_hz = 1; // Tần số xác định của Mô-đun AD9833 bool set_frequency_khz; bool set_frequency_mhz; String waveSelect = "SIN"; // Dạng sóng khởi động của mô-đun int encoder_btn_count = 0; // được sử dụng để kiểm tra nút bấm của bộ mã hóa Tiếp theo, chúng ta có hai đối tượng của chúng ta, một đối tượng dành cho màn hình OLED và một đối tượng khác dành cho mô-đun AD9833.Màn hình Adafruit_SSD1306 (SCREEN_WIDATA_PINH, SCREEN_HEIGHT, & Wire, -1); AD9833 gen (FNC_PIN);
Tiếp theo, chúng ta có hàm setup (), trong hàm cài đặt đó, chúng ta bắt đầu với việc kích hoạt Serial để gỡ lỗi. Chúng tôi khởi tạo mô-đun AD9833 với sự trợ giúp của phương thức begin (). Tiếp theo, chúng tôi đặt tất cả các chân bộ mã hóa quay được chỉ định làm Đầu vào. Và chúng ta lưu trữ giá trị của chân clock trong biến clockPinState, đây là bước cần thiết cho bộ mã hóa vòng quay.
Tiếp theo, chúng tôi đặt tất cả các chân nút làm đầu vào và kích hoạt màn hình OLED với sự trợ giúp của phương thức display.begin () và chúng tôi cũng kiểm tra bất kỳ lỗi nào với câu lệnh if . Khi điều đó hoàn tất, chúng tôi xóa màn hình và in màn hình hiển thị khởi động, chúng tôi thêm thời gian trễ 2 giây, cũng là độ trễ cho màn hình hiển thị và cuối cùng, chúng tôi gọi hàm update_display () để xóa màn hình và cập nhật hiển thị một lần nữa. Chi tiết về phương thức update_display () sẽ được thảo luận ở phần sau của bài viết.
void setup () {Serial.begin (9600); // Bật Serial @ 9600 baud gen.Begin (); // Đây PHẢI là lệnh đầu tiên sau khi khai báo pinMode đối tượng AD9833 (CLK_PIN, INPUT); // Đặt Pins làm mã pin đầu vào (DATA_PIN, INPUT); pinMode (BTN_PIN, INPUT_PULLUP); clockPinState = digitalRead (CLK_PIN); pinMode (SET_FREQUENCY_HZ, INPUT); // Đặt các Ghim làm đầu vào pinMode (SET_FREQUENCY_KHZ, INPUT); pinMode (SET_FREQUENCY_MHZ, INPUT); pinMode (ENABLE_DISABLE_OUTPUT_PIN, INPUT); if (! display.begin (SSD1306_SWITCHCAPVCC, 0x3C)) {// Địa chỉ 0x3D cho 128x64 Serial.println (F ("Phân bổ SSD1306 không thành công")); cho (;;); } display.clearDisplay (); // Xóa màn hình display.setTextSize (2); // Đặt kích thước văn bản display.setTextColor (WHITE); // thiết lập LCD Color display.setCursor (30, 0); // Đặt Vị trí con trỏ display.println ("AD9833"); // In màn hình Văn bản này.setCursor (17, 20); // Đặt Vị trí con trỏ display.println ("Hàm"); // In văn bản này display.setCursor (13, 40); // Đặt Vị trí con trỏ display.println ("Trình tạo"); // In văn bản này display.display (); // Cập nhật độ trễ Hiển thị (2000); // Độ trễ 2 GIÂY update_display (); // Gọi hàm update_display}
Tiếp theo, chúng ta có hàm loop (), tất cả các hàm chính được viết trong phần loop.
Đầu tiên, chúng ta đọc chân Clock của bộ mã hóa Rotary và lưu trữ nó trong biến clockPin mà chúng ta đã khai báo trước đó. Tiếp theo, trong khi tuyên bố, chúng tôi kiểm tra nếu giá trị trước của pin và giá trị hiện tại của pin cũng tương tự hay không và chúng tôi cũng kiểm tra giá trị hiện tại của pin. Nếu tất cả đều đúng, chúng tôi kiểm tra chân dữ liệu, nếu đúng, điều đó có nghĩa là bộ mã hóa đang quay ngược chiều kim đồng hồ và chúng tôi giảm giá trị bộ đếm với sự trợ giúp của lệnh counter--. Nếu không, chúng tôi tăng giá trị bộ đếm bằng lệnh counter ++. Cuối cùng, chúng tôi đặt một câu lệnh if khác để đặt giá trị nhỏ nhất thành 1. Tiếp theo, chúng tôi cập nhật clockPinState với clockPin hiện tạigiá trị sử dụng trong tương lai.
void loop () {clockPin = digitalRead (CLK_PIN); if (clockPin! = clockPinState && clockPin == 1) {if (digitalRead (DATA_PIN)! = clockPin) {counter -; } else {counter ++; // Bộ mã hóa đang quay CW nên tăng} if (counter <1) counter = 1; Serial.println (bộ đếm); update_display (); }
Tiếp theo, chúng tôi có mã của chúng tôi để phát hiện một lần nhấn nút. Trong phần này, chúng tôi đã phát hiện nút bên trong bộ mã hóa với sự trợ giúp của một số câu lệnh if lồng nhau, if (digitalRead (BTN_PIN) == LOW && millis () - time> de den), trong câu lệnh này, trước tiên, chúng tôi kiểm tra xem nút pin thấp hoặc không, nếu nó thấp, thì nó được nhấn. Sau đó, chúng tôi kiểm tra lại giá trị bộ đếm thời gian với độ trễ gỡ lỗi, nếu cả hai câu lệnh đều đúng, thì chúng tôi tuyên bố đó là hành động nhấn nút thành công nếu vậy chúng tôi tăng giá trị encoder_btn_count. Tiếp theo, chúng ta khai báo một câu lệnh if khác để đặt giá trị bộ đếm tối đa là 2, chúng ta cần nó vì chúng ta đang sử dụng nó để đặt dạng sóng đầu ra.Ba câu lệnh if liên tiếp thực hiện điều đó, nếu giá trị bằng 0, dạng sóng sin được chọn, nếu là một, đó là sóng vuông và nếu giá trị là 2, đó là sóng tam giác. Trong cả ba câu lệnh if này, chúng tôi cập nhật màn hình bằng hàm update_display () . Và cuối cùng, chúng tôi cập nhật biến thời gian với giá trị bộ đếm thời gian hiện tại.
// Nếu chúng ta phát hiện một tín hiệu THẤP, nút được nhấn if (digitalRead (BTN_PIN) == LOW && millis () - time> debounce) {encoder_btn_count ++; // Tăng giá trị if (encoder_btn_count> 2) // nếu giá trị lớn hơn 2 thì đặt lại thành 0 {encoder_btn_count = 0; } if (encoder_btn_count == 0) {// nếu giá trị là 0 sóng hình sin được chọn waveSelect = "SIN"; // cập nhật biến chuỗi với giá trị sin update_display (); // cập nhật hiển thị} if (encoder_btn_count == 1) {// nếu giá trị là 1 wave vuông được chọn waveSelect = "SQR"; // cập nhật biến chuỗi với giá trị SQR update_display (); // cập nhật hiển thị} if (encoder_btn_count == 2) {// nếu giá trị là 1 Sóng tam giác được chọn waveSelect = "TRI"; // cập nhật biến chuỗi với giá trị TRI update_display ();// cập nhật hiển thị} time = millis (); // cập nhật biến thời gian}
Tiếp theo, chúng tôi xác định tất cả mã cần thiết được yêu cầu để thiết lập tất cả các nút có độ trễ gỡ lỗi. Khi các nút được kết nối với các chân tương tự của Arduino, chúng tôi đang sử dụng lệnh đọc tương tự để xác định một lần nhấn nút nếu giá trị đọc tương tự đạt dưới 30, sau đó chúng tôi phát hiện nút nhấn thành công và chúng tôi đợi 200 ms để kiểm tra xem đó là một lần nhấn nút thực tế hay chỉ là tiếng ồn. Nếu câu lệnh này đúng, chúng tôi gán các biến boolean với các giá trị được sử dụng để đặt các giá trị Hz, Khz và Mhz của trình tạo hàm. Tiếp theo, chúng tôi cập nhật hiển thị và cập nhật biến thời gian. Chúng tôi làm điều đó cho tất cả bốn nút được kết nối với Arduino.
if (analogRead (SET_FREQUENCY_HZ) <30 && millis () - time> debounce) {set_frequency_hz = 1; // cập nhật giá trị boolean set_frequency_khz = 0; set_frequency_mhz = 0; update_display (); // cập nhật thời gian hiển thị = millis (); // cập nhật biến thời gian} if (analogRead (SET_FREQUENCY_KHZ) <30 && millis () - time> debounce) {set_frequency_hz = 0; // cập nhật giá trị boolean set_frequency_khz = 1; set_frequency_mhz = 0; moduleFrequency = counter * 1000; update_display (); // cập nhật thời gian hiển thị = millis (); // cập nhật biến thời gian} if (analogRead (SET_FREQUENCY_MHZ) <30 && millis () - time> debounce) {// kiểm tra chân analog có độ trễ gỡ lỗi set_frequency_hz = Số 0; // cập nhật giá trị boolean set_frequency_khz = 0; set_frequency_mhz = 1; moduleFrequency = counter * 1000000; update_display ();// cập nhật thời gian hiển thị = millis (); // cập nhật biến thời gian} if (analogRead (ENABLE_DISABLE_OUTPUT_PIN) <30 && millis () - time> debounce) {// kiểm tra chân analog có độ trễ debounce btn_state =! btn_state; // Đảo trạng thái nút gen.EnableOutput (btn_state); // Bật / Tắt đầu ra của trình tạo hàm tùy thuộc vào trạng thái nút update_display (); // cập nhật thời gian hiển thị = millis (); // cập nhật biến thời gian}}// cập nhật biến thời gian}}// cập nhật biến thời gian}}
Cuối cùng, chúng ta có hàm update_display (). Trong chức năng này, chúng tôi đã làm nhiều hơn là chỉ cập nhật màn hình này vì một phần nhất định của màn hình không thể được cập nhật trong OLED. Để cập nhật nó, bạn phải sơn lại nó với các giá trị mới. Điều này làm cho quá trình viết mã khó khăn hơn rất nhiều.
Bên trong chức năng này, chúng tôi bắt đầu với việc xóa màn hình. Tiếp theo, chúng tôi đặt kích thước văn bản yêu cầu của chúng tôi. Sau đó, chúng tôi đặt con trỏ và Trình tạo hàm được in với display.println ("Hàm Hàm"); chỉ huy. Chúng tôi lại đặt kích thước văn bản thành 2 và con trỏ thành (0,20) với sự trợ giúp của hàm display.setCursor (0, 20).
Đây là nơi chúng tôi in thông tin cho nó là sóng gì.
display.clearDisplay (); // Trước tiên xóa màn hình display.setTextSize (1); // thiết lập kích thước văn bản display.setCursor (10, 0); // Đặt vị trí con trỏ display.println ("Hàm tạo"); // in văn bản display.setTextSize (2); // đặt kích thước văn bản display.setCursor (0, 20); // Đặt vị trí con trỏ
Tiếp theo, chúng tôi kiểm tra các biến boolean để biết chi tiết tần suất và cập nhật giá trị trong biến moduleFrequency. Chúng tôi thực hiện điều này đối với các giá trị Hz, kHz và MHz. Tiếp theo, chúng ta kiểm tra biến waveSelect và xác định sóng nào được chọn. Bây giờ, chúng ta có các giá trị để đặt loại sóng và tần số.
if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {// kiểm tra xem nút đặt tần số tính bằng Hz có được nhấn moduleFrequency = counter; // cập nhật biến moduleFrequency với giá trị bộ đếm hiện tại} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {// kiểm tra xem nút đặt tần số trong KHz có được nhấn moduleFrequency = counter * 1000; // cập nhật biến moduleFrequency với giá trị bộ đếm hiện tại nhưng chúng tôi nhân với 1000 để đặt nó trên KHZ} nếu (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {// kiểm tra xem nút đặt tần số theo MHz có được nhấn mô-đun không = bộ đếm * 1000000; if (moduleFrequency> 12000000) {moduleFrequency = 12000000;// không để tần số lớn hơn mà 12Mhz counter = 12; }} if (waveSelect == "SIN") {// Sóng hình sin được chọn display.println ("SIN"); gen.ApplySignal (SINE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "SQR") {// Sqr wave được chọn display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave được chọn display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // cập nhật mô-đun AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr wave được chọn display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave được chọn display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // cập nhật mô-đun AD9833. Serial.println (moduleFrequency); }} if (waveSelect == "SQR") {// Sqr wave được chọn display.println ("SQR"); gen.ApplySignal (SQUARE_WAVE, REG0, moduleFrequency); Serial.println (moduleFrequency); } if (waveSelect == "TRI") {// Tri wave được chọn display.println ("TRI"); gen.ApplySignal (TRIANGLE_WAVE, REG0, moduleFrequency); // cập nhật mô-đun AD9833. Serial.println (moduleFrequency); }
Chúng tôi đặt lại con trỏ và cập nhật các giá trị bộ đếm. Một lần nữa chúng tôi kiểm tra boolean để cập nhật dải tần số trên màn hình, chúng tôi phải làm điều này vì nguyên lý hoạt động của OLED rất kỳ lạ.
display.setCursor (45, 20); display.println (bộ đếm); // in thông tin bộ đếm lên màn hình. if (set_frequency_hz == 1 && set_frequency_khz == 0 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Hz"); // in Hz trên màn hình hiển thị display.display (); // khi tất cả các thiết lập cập nhật display} if (set_frequency_hz == 0 && set_frequency_khz == 1 && set_frequency_mhz == 0) {display.setCursor (90, 20); display.println ("Khz"); display.display (); // khi tất cả thiết lập cập nhật display} if (set_frequency_hz == 0 && set_frequency_khz == 0 && set_frequency_mhz == 1) {display.setCursor (90, 20); display.println ("Mhz"); display.display (); // khi tất cả các thiết lập cập nhật màn hình}
Tiếp theo, chúng tôi kiểm tra biến nút nhấn để in đầu ra bật / tắt cho màn hình OLED. Một lần nữa điều này cần phải được thực hiện vì mô-đun OLED.
if (btn_state) {display.setTextSize (1); display.setCursor (65, 45); display.print ("BẬT đầu ra"); // in kết quả ra màn hình display.display (); display.setTextSize (2); } else {display.setTextSize (1); display.setCursor (65, 45); display.print ("TẮT đầu ra"); // in đầu ra ra màn hình display.display (); display.setTextSize (2); }
Điều này đánh dấu sự kết thúc của quá trình mã hóa của chúng tôi. Nếu bạn bối rối ở điểm này, bạn có thể kiểm tra các nhận xét trong mã để hiểu thêm.
Kiểm tra Bộ tạo chức năng dựa trên AD9833
Để kiểm tra mạch, thiết lập trên được sử dụng. Như bạn thấy, chúng tôi đã kết nối bộ chuyển đổi nguồn DC 12V với giắc cắm thùng DC và chúng tôi đã kết nối Máy hiện sóng Hantek với đầu ra của mạch. Chúng tôi cũng đã kết nối máy hiện sóng với máy tính xách tay để hình dung và đo tần số đầu ra.
Khi điều này được thực hiện, chúng tôi đặt tần số đầu ra thành 5Khz với sự trợ giúp của bộ mã hóa quay và chúng tôi kiểm tra sóng hình sin đầu ra và chắc chắn, đó là sóng hình sin 5Khz ở đầu ra.
Tiếp theo, chúng tôi đã thay đổi dạng sóng đầu ra thành sóng tam giác nhưng tần số vẫn giữ nguyên, dạng sóng đầu ra được hiển thị bên dưới.
Sau đó, chúng tôi thay đổi đầu ra thành sóng vuông và quan sát đầu ra, và đó là một sóng vuông hoàn hảo.
Chúng tôi cũng đã thay đổi dải tần số và kiểm tra đầu ra, và nó hoạt động tốt.
Cải tiến hơn nữa
Mạch này chỉ là một bằng chứng về khái niệm và cần được cải tiến thêm. Đầu tiên, chúng ta cần một PCB chất lượng tốt và một số đầu nối BNC chất lượng tốt cho đầu ra, nếu không chúng ta không thể thu được tần số cao hơn. Biên độ của mô-đun rất thấp, vì vậy để tăng cường điều đó, chúng ta cần một số mạch op-amp để khuếch đại điện áp đầu ra. Một chiết áp có thể được kết nối để thay đổi biên độ đầu ra. Có thể kết nối một công tắc để bù tín hiệu; đây cũng là một tính năng cần phải có. Và xa hơn, mã cần được cải thiện nhiều vì nó có một chút lỗi. Cuối cùng, màn hình OLED cần phải được thay đổi nếu không sẽ không thể viết mã dễ hiểu.
Điều này đánh dấu sự kết thúc của hướng dẫn này, tôi hy vọng bạn thích bài viết và học được điều gì đó mới. Nếu có bất kỳ thắc mắc nào liên quan đến bài viết, bạn có thể để lại trong phần bình luận bên dưới hoặc có thể sử dụng Diễn đàn điện tử của chúng tôi.