通过环形振荡器、555 定时器和 Arduino 设计数字方波发生器

出处:维库电子市场网 发布于:2023-04-06 15:29:35

之前,我们介绍了设计方波振荡器的概念,即运算放大器 (op-amp)和非稳态多谐振荡器 的基于晶体管的模拟实现。在本文中,我们将研究实现方波振荡器的数字方法,同时讨论其优点和局限性。

在深入研究之前,请注意我们将分析三个示例:

  • 环形振荡器
  • 基于 555 定时器的振荡器
  • 用于产生方波振荡器的 Arduino


使用环形振荡器的方波发生器

环形振荡器具有相当简单的架构,它利用一串反相器将终输出馈入个输入,从而形成一个环,如图 1 所示。


 通用环形振荡器架构

图 1. 通用环形振荡器架构


不仅架构简单,而且该电路的操作也很简单。启动时,假设 INV 1从逻辑 0 变为逻辑 1。随着该反相器的输出开始上升,一旦达到 INV 2的跳变点,该输出将开始下降至逻辑 0。这种连锁反应会继续到的反相器 INV N,然后该输出反馈到开始以维持反应。总的来说,这种反应会产生恒定的振荡,假设所有逆变器的上升/下降时间相同,就会产生方波输出。

为使电路按所述方式运行,环中反相器的数量(在图 1 中用 N 表示)必须为奇数。这一要求是必要的,因为正如我们在图 1 中看到的那样,任何反相器的输出 INV X (其中 X 为偶数)将具有与 INV 1的输出互补的输出。如果该值反馈到 INV 1,则不会发生变化,因此不会发生振荡。虽然在这个简单的例子中,我们只使用反相器,但您可以在整个电路中使用任何逻辑门。然而,在这个环形示例中,必须有奇数个反相级才能振荡。

现在,您可能会问一个问题:电路的哪些方面决定了工作频率?基本上,每个反相器的固有延迟 (t d ) 和级数 (N) 根据以下等式决定:


$$f = \frac{1}{2t_dN}$$ 


由于 t d通常很小,并且希望化 N,因此频率通常很高,大约为数百 MHz 甚至 GHz。对于低速应用或频率控制,用户通常必须为每个逆变器的输出添加负载,简单的方法是通过 RC 电路,如图 2 所示。


带 RC 负载的环形振荡器

图 2. 带 RC 负载的环形振荡器


展望未来,假设所有逆变器都在 $$\frac{V_{DD}}{2}$$ 跳闸,其中 V DD是电源电压,振荡频率变为:


$$f = \frac{1}{2(t_d+0.69RC)N}$$


接下来,假设 RC > t d,我们可以说振荡频率完全取决于 RC 时间常数和级数。

至于优点,这种设计的简单性使其对高速振荡器设计具有吸引力;然而,对于较低的频率,很难控制这些。另一个缺点是,由于开关速率高,这种架构通常很耗电。


使用 555 定时器作为方波发生器

接下来,我们将讨论使用555 定时器创建方波振荡器 。该通用 IC 用于: 

  • 各种脉冲产生
  • 延迟
  • 定时
  • 振荡器应用 

多家公司生产的 555 定时器种类繁多,但我们将重点介绍德州仪器 (TI) 的LM555 。数据表的第 7.4.2 节说明了定时器的非稳态操作,正如我们从上一篇文章中了解到的那样,这正是我们感兴趣的内容。要实现的原理图如图 3 所示。


用于不稳定操作模式的 LM555 定时器设置

图 3. LM555 定时器设置用于非稳态运行模式。图片由德州仪器提供


此处,电容器C 由电阻器R A和 R B充电。一旦达到上限跳变点(对于定时器,为 V CC的 ?),C 便会通过 R B放电至 V CC的? 。此时,电容器开始再次充电,并且这种行为会无限期地持续下去。由此,我们可以通过以下等式获得充放电时间和振荡周期:


$$t_{上升}=0.69(R_A+R_B)C$$


$$t_{fall}=0.69R_BC$$


$$T=t_{上升}+t_{下降}$$


$$f=\frac{1}{T}=\frac{1.44}{(R_A+2R_B)C}$$


在这里,我们可以看到我们不仅可以控制振荡频率,还可以控制输出占空比。但是,这些不能短于 t fall,这意味着占空比必须大于 50%,但如果 R B > R A ,则可以接近方波占空比。

这种实现的优点是简单,需要少的硬件,也是低速振荡器稳定可靠的解决方案。至于限制,此设计不适用于需要小于 50% 的占空比或需要高速的情况。


使用 Arduino UNO R3 的基于 Arduino 的方波发生器

,我们将讨论通过 Arduino 实现振荡器。对于我们的示例,我们将查看Arduino UNO R3。该板的引出线如图 4 所示。


Arduino UNO R3 引出线。

图 4.Arduino UNO R3 引出线。图片由Arduino提供[点击图片放大]


对于我们的生成器,我们将使用Arduino UNO 的数字 I/O 引脚之一,特别是 D7。实施此解决方案不需要外部硬件,因为这都可以通过如下所示的 Arduino 程序定义:


int 频率 = 100; //以Hz为单位设置用户定义的频率值 
int per_ms = 1e3*(1/频率); //设置一个状态(高或低)的时间为T/2,单位毫秒 
int dutyCyc = 0.5; //设置输出波形的占空比   
无效设置(){ 
  引脚模式(7,输出);//设置D7为数字输出 
}   
//振荡循环 
无效循环(){ 
  数字写入(7,高);//设置D7为逻辑1 
  延迟(dutyCyc*per_ms);//为 T/2 保留逻辑 1 
  数字写入(7,低);//设置D7为逻辑0 
  延迟((1-dutyCyc)* per_ms);//为 T/2 保留逻辑 0 
}


在上面的代码片段中,我们声明了三个全局变量,允许用户设置频率和占空比。在此示例中,我们可以创建占空比为 50% 的 100 Hz 输出,从而产生方波。从那里,我们可以使用“pinMode”函数在无效设置块中初始化我们的数字输出引脚。接下来,我们可以进入一个连续循环,将 D7 设置为高电平,并将输出保持在该值的时间等于占空比乘以周期。,我们可以将输出变为逻辑低电平,并在该周期的剩余时间内将信号保留在那里。因此,一旦 Arduino 打开,此循环将无限期地继续下去。

如您所见,软件实现允许在零外部硬件的情况下实现高度灵活性。虽然这相当简单,但我们受限于 Arduino 的带宽,除非我们在需要高速振荡器的情况下使用外部振荡器来推动更高的频率。

版权与免责声明

凡本网注明“出处:维库电子市场网”的所有作品,版权均属于维库电子市场网,转载请必须注明维库电子市场网,https://www.dzsc.com,违反者本网将追究相关法律责任。

本网转载并注明自其它出处的作品,目的在于传递更多信息,并不代表本网赞同其观点或证实其内容的真实性,不承担此类作品侵权行为的直接责任及连带责任。其他媒体、网站或个人从本网转载时,必须保留本网注明的作品出处,并自负版权等法律责任。

如涉及作品内容、版权等问题,请在作品发表之日起一周内与本网联系,否则视为放弃相关权利。

广告
上传BOM文件: BOM文件
*公司名:
*联系人:
*手机号码:
QQ:
应用领域:

有效期:
OEM清单文件: OEM清单文件
*公司名:
*联系人:
*手机号码:
QQ:
有效期:

扫码下载APP,
一键连接广大的电子世界。

在线人工客服

买家服务:
卖家服务:

0571-85317607

客服在线时间周一至周五
9:00-17:30

关注官方微信号,
第一时间获取资讯。

建议反馈

联系人:

联系方式:

按住滑块,拖拽到最右边
>>
感谢您向阿库提出的宝贵意见,您的参与是维库提升服务的动力!意见一经采纳,将有感恩红包奉上哦!