输出-OUTPUT

作者:hardihuang   hardihuang   

数字输出 #


顾名思义,数字输出即为使单片机输出数字量——高电平或低电平。单片机进行数字输出前需先对相应引脚进行初始化:

void setup()
{
	pinMode(8,OUTPUT); //将8号引脚设置为输出模式
}


该部分调取pinMode函数,该函数入口参数有两个,分别为需初始化的引脚号码以及初始化模式,该示例将8引脚设置为输出引脚。
在loop函数中可对引脚电平进行相应操作以达到所需目的:

void loop()
{
	digitalWrite(8,HIGH);//8号引脚输出高电平
	delay(1000);         //延时1秒(1000毫秒)
	digitalWrite(8,LOW); //8号引脚输出低电平
	delay(1000);         //延时1秒
}


该部分代码为使引脚电平高低转换的示例。digitalWrite函数为调节输出电平的函数,包含两个入口参数即引脚序号与电平高低。delay函数为延时函数,使程序保持原有状态一段时间,入口参数即为该段时间长短,单位为毫秒。

该示例程序完整演示了控制arduino引脚输出高低电平的操作。

模拟输出 #


模拟输出为单片机输出模拟量,即PWM波。之前未接触过该概念的朋友可简要理解为通过改变一个周期内高电平的输出比例(占空比)调节等效输出电压的操作,广泛用于单片机控制电机转速、舵机角度等领域。
该部分的初始化代码与数字输出完全相同,故这里不再赘述,但需特殊说明的是并非所有引脚均可完成模拟量输出的操作。在单片机板子上,引脚号旁边标有~的引脚才可输出PWM波,其余均不可进行模拟输出操作。

PWM的介绍: #

PWM是一种调制方式,那么为什么会有这种方式存在?大家可能知道Arduino有模拟输入引脚,这些引脚是通过A/D转换操作的,而一般的数字引脚却只能输入HIGH或LOW电平,那么中间电平可否输出呢?比如2v的电平如何输出?于是PWM应运而生。PWM的高明之处在于:它输出的仍然是HIGH或者LOW电平,但可以间歇性周期性输出,则利用取平均值的方法,可以达到满意的输出效果。一个简单的例子:在0~5s内输出5v的电平,那么0~5s的平均电压就是5v,而倘若我在0~2.5s输出5v,在2.5~5s输出0v(占空比50%),那么这5s内平均电平就是2.5v,显然可以达到我们想要的效果。但仍有问题:倘若你的周期很长,就像上面例子所说,周期5s,点亮一个LED灯(LOW亮,HIGH灭),那么LED灯显然是前2.5s灭,后2.5s亮,显然达不到调灯暗亮的效果。但当周期被缩小之后比如20ms,这时候亮与灭只是很短时间内的事,肉眼根本看不到亮灭的变化,因而LED灯表现的就是亮度变暗。于是我们知道:PWM调制的周期一般比较短。PWM只是用数字输出替代模拟量输出,因此单方面还是不行的,这就要求我们的设备还要支持PWM的调制。(比如舵机等)。因而PWM的周期也不能任意短,还需要满足我们设备的调制要求。


初始化步骤完成后,使单片机输出PWM波的代码如下:

void loop()
{
	analogWrite(8,200);//8号引脚输出PWM波
}


analogWrite函数控制引脚输出PWM波,其需要两个入口参数,第一个为引脚号码,第二个为占空比参数,arduino模拟输出为8位模拟量,即支持28个占空比类别(0~254),参数越大占空比越高,上文示例中参数取值为200。
掌握基本模拟输出函数后结合简单C语言语法,我们可以对其进行更加复杂的操作:

void loop()
{
	int t;
	for(t=0;t<255;t++)
	{
		analogWrite(8,t);
		delay(5);
	}
	for(t=255;t>-1;t--)
	{
		analogWrite(8,t);
		delay(5);
	}
}


该部分代码使8号引脚输出占空比匀速变化的PWM波,占空比由0缓慢增大至254,再由254减小至0,通过改变delay函数中参数的值,可加快或减慢占空比变化速度。

analogWrite()实现对引脚设置PWM的要求。可以被用来控制LED等,电机转动,舵机等。使用此函数后,引脚会产生稳定的方波,直到下一次对引脚做其他操作。大多数引脚的PWM频率大约为490Hz。在Uno以及相似的板子上,pin5和pin6有大约980Hz的频率。Leonardo板子的pin3和pin11也有980Hz的频率。

在大多数的Arduino板子上(用ATmega168或者ATmega328的板子),在引脚3,5,6,9,10和11有PWM功能;在Arduino Mega板子上,在2~13和44~46引脚有PWM功能。使用ATmega8的老板子只在9,10和11引脚支持analogWrite()。

Arduino Due板子在2到13引脚和DAC0,DAC1引脚支持analogWrite()。但是ADC0和DAC1是采用D/A转换的方式输出,它们确实输出的是模拟量而不是由PWM调制输出的。

另外,使用analogWrite()不需要再用pinMode()设置引脚为输出。

形式:

analogWrite(pin,value)

参数:

pin:写入的引脚;

value:占空比,在0~255之间。(0时候为关,即LOW;255为开,即HIGH)

返回值:none

注:5pin和6pin产生的PWM输出会比设置的占空比高,这是因为millis()和delay()函数与它们使用相同的内部时钟。

示例:

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
 
}
 
 
 
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
 
}


Reference:

https://blog.csdn.net/acslsr/article/details/103780698

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注