arduinonano怎么输出脉冲宽度

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了arduinonano怎么输出脉冲宽度相关的知识,希望对你有一定的参考价值。

脉冲宽度调制或PWM是用于改变脉冲串中的脉冲宽度的常用技术。PWM有许多应用,如控制伺服和速度控制器,限制电机和LED的有效功率。
PWM的基本原理
脉冲宽度调制基本上是一个随时间变化而变化的方波。基本的PWM信号如下图所示。

有很多术语与PWM相关:
第 1 页
∙ On-Time(导通时间) - 时间信号的持续时间较长。
∙ Off-Time(关断时间) - 时间信号的持续时间较短。
∙ Period(周期) - 表示为PWM信号的导通时间和关断时间的总和。
∙ Duty Cycle(占空比) - 它表示为在PWM信号周期内保持导通的时间信号的百分比。
周期
如图所示,Ton表示导通时间,Toff表示信号的关断时间。周期是导通和关断时间的总和,并按照以下公式计算:
第 2 页

占空比
占空比用于计算为一段时间的导通时间。使用上面计算的周期,占空比计算为:

analogWrite()函数
analogWrite()函数将模拟值(PWM波)写入引脚。它可用于以不同的亮度点亮LED或以各种速度驱动电机。在调用analogWrite()函数之后,引脚将产生指
第 3 页
定占空比的稳定方波,直到下一次调用analogWrite()或在相同引脚上调用digitalRead()或digitalWrite()。大多数引脚上的PWM信号频率约为490 Hz。在Uno和类似的板上,引脚5和6的频率约为980Hz。Leonardo上的引脚3和11也以980Hz运行。
在大多数Arduino板上(ATmega168或ATmega328),此功能在引脚3,5,6,9,10和11上工作。在Arduino Mega上,它在引脚2-13和44-46上工作。旧的Arduino ATmega8板仅支持引脚9,10和11上的 analogWrite()。
第 4 页

Arduino Due支持引脚2至13以及引脚DAC0和DAC1上的 analogWrite()。与PWM引脚不同,DAC0和DAC1是数模转换器,用作真正的模拟输出。
在调用analogWrite()之前,不需要调用pinMode()将引脚设置为输出。
analogWrite()函数语法
analogWrite ( pin , value ) ;
value − the duty cycle: between 0 (always off) and 255 (always on).
第 5 页
value - 占空比:0(始终导通)到255(始终关断)之间。
示例
int ledPin = 9; // LED connected to digital pin 9
int analogPin = 3; // potentiometer connected to analog pin 3
int val = 0; // variable to store the read value
void setup()
pinMode(ledPin, OUTPUT); // sets the pin as output
第 6 页

void loop()
val = analogRead(analogPin); // read the input pin
analogWrite(ledPin, (val / 4)); // analogRead values go from 0 to 1023,
// analogWrite values from 0 to 255

第 7 页
百度文库
搜索
arduinonano怎么输出脉冲宽度
参考技术A arduinonano怎么输出脉冲宽度?
回答如下:
第一步首先是打开安全设置,然后第二步操作是针对问题分析方案,多动手,得以解决。

我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制

PWM 是一种调节输出功率的技术(俗称调压),其原理在于改变输出方波的占空比,具体输出见下图:

_thumb3_thumb_thumb

输出信号为电压值,当负载为恒阻时,上图中的输出功率分别为 25%、50%、75%。

实现方法如下:

  • 设置一个计数器,上图中的第一行就是个 4 位的计数器,每满 15 自动变为 0。那么可以得到输出频率等于时钟的 1/16。
  • 当计数器的值小于某个值的时候输出 0,高于或者等于某个值的时候输出 1。

假设控制的是一个小灯为 1/8 功率输出,那么我们需要的值就是 13 (4\'hD),当计数器小于等于 13 输出 0,否则输出 1。

具体代码如下:

PWM_thumb7_thumb_thumb

        如果时钟为 50MHz,一个时钟周期为 2ns,根据推算可以得出上述的 PWM 输出信号的周期为 32 ns,频率大约 1.5MHz。由于 1.5MHz 的频率远远的超过了人眼 100Hz 的分辨极限,所以在人看来 LED 会一直发光但亮度较低。

        然而并不是所有的外设都能承受 1.5MHz 这么高的频率。很多器件内包含有三极管,但三极管是存在截止频率上限问题,当输出管脚通过三极管来放大输出电流时,过高的频率会导致输出失效,所以绝大多数情况下我们需要降低 PWM 的输出频率。

使用环形计数器可以得到任意整数分频的电路,这在电子钟篇中已经试用过了。我们可以把分频模块的输出作为另一个电路的时钟输入,可是这种方法生成的时钟信号不够稳定。锁相环可以对时钟信号进行任意比例分频,倍频和移相等操作。锁相环分为数字式(DLL)和模拟式(PLL)两种,Altera 公司在 FPGA 里集成了模拟式锁相环,Xilinx 公司的器件集成的既有模拟的也有用数字式的。

与 ASICS 的自由布线相比,FPGA 内部可用的时钟就显得十分有限了。FPGA 可用的时钟牵扯到全局时钟网络的问题。由于这里不涉及画板子的问题,对于时钟网络就不多做赘述了。

锁相环的使用方法: 首先在 tools 菜单栏找到并打开 MegaWizard Plug-In Manager,按照下面的步骤配置使用 PLL IP 核 

PLL_1
PLL_2
PLL_3
PLL_4
PLL_5
PLL_6
PLL_7
PLL_8

这个 IP 核输出多达 5 个 信号,由于我们只需要用到一个输出 c0,所以 c1 ~ c4 设置为默认(不开启)即可。

PLL_9

PLL_10

这样的话 PLL 核就配置好了,原理图连接方法:

PWM_thumb1_thumb_thumb

本文中时钟为 50MHz,可以计算得到输出频率

50M = 50_000_000 –> 50_000_000 / 25_000 = 2000 –> 2000/16 = 125

        125Hz 的一个周期为 0.008s = 0ms = 8_000 us,使用图形仿真输入来验证显然不太现实,此外我们在工程中使用了 IP 核,出于效率的考虑应当选用 Modelsim。但我在使用 Modelsim 仿真时出现了问题,Modelsim 总是报告分频系数不正确,然而当我把分频系数降为 10 ,仿真器却可以正常工作。我猜测可能是因为 Modelsim 在仿真 Cyclone IV E 系列 PLL 的时候调用的是 Cyclone III 的仿真文件,而 Cyclone IV 的 PLL 与 Cyclone III 也许并不完全一致,也有可能是仿真库文件出现了问题。

        觉得效果不够明显可以在 pwm 代码中添加一个全亮的灯作为参照也可以把 duty 改为 4\'hE(1/16 功率),此外还可以尝试增大锁相环中的分频系数让小灯闪动(只要锁相环配置时出现 able to implement the requested PLL 就表示配置可行)。

以上是关于arduinonano怎么输出脉冲宽度的主要内容,如果未能解决你的问题,请参考以下文章

我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制

请教三菱plc中怎么用旋转编码器的脉冲信号来控制步进电机的启停,编码转电机也转,梯形图怎么写?

stm32输出的pwm有啥用

串行读取循环不好

STM32的PWM控制步进电机,怎么实现精确控制输出脉冲数

求问单片机控制舵机连续来回转动而不停下来的C程序怎么写