〰️ فانکشن ژنراتور (Function Generator)
| اسم انگلیسی | Function Generator |
|---|---|
| در ووکوی (Wokwi) | نسخهی آمادهای سراغ نداریم |
| دسته | 📏 ابزار اندازهگیری |
| در شبیهساز فارسی | مود ساده (بدون کد) · رایگان |
فانکشن ژنراتور (Function Generator) دستگاهی است که ولتاژ را با یک الگوی تکرارشونده بالا و پایین میبرد: موج مربعی، سینوسی یا مثلثی، با فرکانس، دامنه و آفستی که خودت تعیین میکنی. در کار با آردوینو از آن برای ساختن یک سیگنال آزمایشی استفاده میشود؛ مثلاً ورودی ساعت برای یک شمارنده، پالس برای تست وقفه (Interrupt)، یا موج سینوسی برای امتحان یک فیلتر. خبر خوب این است که خود آردوینو هم یک موجساز مربعی ساده است و همین صفحه نشانت میدهد چطور.
فانکشن ژنراتور در ووکوی (Wokwi)
تا جایی که میدانیم ووکوی فانکشن ژنراتور ندارد و سیگنال آنالوگ مثل موج سینوسی را بین قطعهها شبیهسازی نمیکند. جایگزین عملی این است که خود برد را با tone() یا analogWrite() موجساز کنی و سیگنال را با آنالایزر منطقی ووکوی (wokwi-logic-analyzer) ببینی. آنالایزر فقط صفر و یک را ثبت میکند، پس برای موج مربعی و PWM کاملاً مناسب است:
{
"version": 1,
"parts": [
{ "type": "wokwi-arduino-uno", "id": "uno", "top": 100, "left": 0 },
{ "type": "wokwi-logic-analyzer", "id": "logic1", "top": -60, "left": 80 }
],
"connections": [
[ "uno:8", "logic1:D0", "green", [] ],
[ "uno:9", "logic1:D1", "blue", [] ],
[ "uno:8", "uno:2", "orange", [] ],
[ "uno:GND.1", "logic1:GND", "black", [] ]
]
}
سیم نارنجی خروجی پین 8 را به پین 2 برمیگرداند تا کد پایین فرکانس ساختهشده را خودش بشمارد. فانکشن ژنراتور واقعیتر، با موج مربعی، سینوسی و مثلثی، فرکانس ۰٫۱ تا ۵ هرتز (آنقدر آهسته که چشمک LED را با چشم ببینی) و ولتاژ تا ۱۲ ولت، در مود سادهی شبیهساز مدار تینکرکد فارسی رایگان است.
سیمکشی با آردوینو
| پایه | وصل به |
|---|---|
| OUT ژنراتور واقعی | پین 2 از راه مقاومت ۱ کیلواهم؛ موج بین ۰ تا ۵ ولت، بدون بخش منفی |
| GND ژنراتور | GND آردوینو |
| پین 8 (tone) | بازر، LED با مقاومت، یا پین 2 برای خودآزمایی |
| پین 9 (PWM) | LED با مقاومت یا کانال اسیلوسکوپ |
کد نمونه: موجساز و فرکانسشمار
// Arduino as a tiny square-wave generator and frequency counter.
// Pin 8: square wave from tone(). Pin 9: PWM (about 490 Hz) at 25% duty.
// Pin 2: input; wire it to pin 8 (or to a real generator) to measure frequency.
const int TONE_PIN = 8;
const int PWM_PIN = 9;
const int IN_PIN = 2;
volatile unsigned long edges = 0;
unsigned int freq = 100; // Hz, change it from the Serial Monitor
void countEdge() {
edges++;
}
void setup() {
Serial.begin(9600);
pinMode(IN_PIN, INPUT);
attachInterrupt(digitalPinToInterrupt(IN_PIN), countEdge, RISING);
tone(TONE_PIN, freq);
analogWrite(PWM_PIN, 64); // 64 / 255 = about 25% duty
Serial.println("type a frequency in Hz (31 .. 20000) and press Enter");
}
void loop() {
if (Serial.available()) {
long f = Serial.parseInt();
while (Serial.available()) Serial.read(); // drop the line ending
if (f >= 31 && f <= 20000) {
freq = f;
tone(TONE_PIN, freq);
}
}
noInterrupts();
edges = 0;
interrupts();
delay(1000); // count rising edges for one second
noInterrupts();
unsigned long counted = edges;
interrupts();
Serial.print("set:");
Serial.print(freq);
Serial.print(" measured:");
Serial.println(counted);
}
تعداد لبههای بالارونده در یک ثانیه همان فرکانس به هرتز است. اگر یک ژنراتور واقعی را به پین 2 بدهی، همین برنامه فرکانسشمار سادهای میشود که عدد روی دستگاه را تأیید میکند.
اشتباههای رایج
- ولتاژ منفی روی پین: بیشتر ژنراتورها موج را حول صفر میسازند؛ بدون آفست، نیمهی منفی به پین آردوینو میرسد.
- دامنهی دو برابر: خیلی از ژنراتورها فرض میکنند بار ۵۰ اهمی وصل است؛ روی ورودی پرامپدانس مثل پین آردوینو، دامنهی واقعی تا دو برابر عدد نمایشگر میشود. یک بار با اسیلوسکوپ یا مولتیمتر چک کن.
- زمین مشترک نیست: بدون اتصال GND دو دستگاه، سیگنال مرجع ندارد.
- تداخل tone با PWM: روی اونو
toneتایمر ۲ را میگیرد و PWM پینهای 3 و 11 را به هم میزند؛ برای همین PWM را روی پین 9 گذاشتیم.
آموزشهای مرتبط
- اسیلوسکوپ و آنالایزر منطقی ووکوی
- بازر؛ شنیدن موج مربعی
- ووکوی دقیقاً چه چیزی را شبیهسازی میکند؟
- آموزش PWM آردوینو
- ماشینحساب PWM
سؤالهای رایج
فانکشن ژنراتور را مستقیم به پین آردوینو وصل کنم؟
فقط اگر موج بین ۰ تا ۵ ولت بماند. موج سینوسی ژنراتور معمولاً حول صفر نوسان میکند و نیمهی منفیاش به پین آسیب میزند؛ با تنظیم آفست (Offset) موج را بالای صفر ببر و یک مقاومت ۱ کیلواهم سری بگذار.
آردوینو اونو چه فرکانسی میتواند بسازد؟
با tone() موج مربعی از ۳۱ هرتز تا دهها کیلوهرتز، روی یک پین در هر زمان. analogWrite روی بیشتر پینها PWM حدود ۴۹۰ هرتز و روی پینهای ۵ و ۶ حدود ۹۸۰ هرتز میدهد. برای موج سینوسی واقعی به فیلتر یا مبدل دیجیتال به آنالوگ نیاز داری.
ووکوی فانکشن ژنراتور دارد؟
تا جایی که میدانیم نه. در ووکوی میتوانی با tone یا PWM سیگنال مربعی بسازی و با آنالایزر منطقی ببینی. فانکشن ژنراتور با سه شکل موج در شبیهساز تینکرکد فارسی رایگان است.