电子设计基础训练之无线电台

PWM

Arduino 可以直接输入模拟信号而无法直接输出模拟信号。但是,PWM 引脚可以通过调整占空比来输出不同幅值的电压,从而输出近似的模拟信号。(详见第 10 章)

(实验 10.1.2)使用 PWM 引脚输出近似的模拟信号,并使用模拟引脚读取,得到的电压变化如下图。其中平滑的曲线为理论上输出的电压,反复振荡的曲线是输入引脚读取的电压,也就是 PWM 引脚实际输出的电压。

使用模拟引脚读取 PWM 信号

但是,这个实验的结果很不精确,因为模拟引脚读取速度十分有限。使用示波器可以得到更为精确的结果:

使用示波器读取 PWM 信号

Timer

Arduino Uno 有三个定时器:Timer0、Timer1 和 Timer2。其中:

  • Timer0 用于 delay()millis()micros() 等函数,并控制着 5、6 号引脚的 PWM 输出;
  • Timer1 在基础实验中不使用,并控制着 9、10 号引脚的 PWM 输出;
  • Timer2 用于 tone() 函数,并控制着 3、11 号引脚的 PWM 输出。

产生电磁波

产生电磁波有两个条件:高频振荡信号和开放电路。后者可以通过接天线实现——当然,悬空的杜邦线也是可以的。下面着重说说前者:

本次实验中使用 Timer1 产生高频振荡信号。配置 Timer1 需要修改 TCCR1ATCCR1BOCR1A 等变量的值,较为麻烦。而 TimerOne 这个第三方库可以用来方便地配置 Timer1。使用以下代码即可在 9 号引脚处生成占空比为 50% 的 PWM 信号:

1
2
Timer1.initialize(1);
Timer1.pwm(9, 512, 1);

产生电报信号

tone()noTone() 函数可以产生指定频率的方波。将方波接入蜂鸣器,即可发声。

电磁波携带电报信号

将高频振荡信号与电报信号通过与门相叠加,再通过开放电路发射出去,即可实现发报功能。

使用示波器测量叠加后的波形,可以看到波形在微秒尺度上具有周期性:

最终发射的信号(比例尺 500ns)

但是,当比例尺缩小到毫秒尺度时,呈现的波形仍然具有周期性。这是为什么呢?我并没有找到原因。可能是因为波形振荡太频繁了,出现了显示错误。

最终发射的信号(比例尺 2ms)

延伸阅读