1.analogReference(type)
analogReference函数的作用是配置模拟引脚的参考电压。在嵌入式应用中引脚获取模拟电压值之后,根据参考电压将模拟值转换到0~1023,该函数为无返回值函数,参数为type类型,type 的选项有 DEFAULT/INTERNAL/INTERNAL1V/INTERNAL2V56/EXTERNAL,其具体含义如下。
(1)DEFAULT:默认5V或3.3V为基准电压(以Arduino板的电压为准)。
(2)INTERNAL:低电压模式,使用片内基准电压源(Arduino Mega无此选项)。
(3)INTERNAL1V1:低电压模式,以1.1V为基准电压(此选项仅针对Arduino Mega)。
(4)INTERNAL256:低电压模式,以2.56V为基准电压(此选项仅针对Arduino Mega)。
(5)EXTERNAL:扩展模式,以AREF引脚(0~5V)的电压作为基准电压,其中AREF引脚的位置如图1-45所示。
图1-45 AREF引脚的位置
设置模拟输入引脚的基准电压为默认值的语句如下:
analogReference(DEFAULT);
注意:使用AREF引脚上的电压作为基准电压时,需接一个5kΩ的上拉电阻,以实现外部和内部基准电压之间的切换。但总阻值会发生变化,因为AREF引脚内部有一个32kΩ的电阻,接上拉电阻后会产生分压作用,最终AREF引脚上的电压为 ,V aref 为AREF引脚的输入电压。
2.analogRead(pin)
analogRead函数的作用是从指定的模拟引脚读取值,读取周期为100μs,即最大读取速度可达每秒10000次,参数pin表示读取的模拟输入引脚号,返回值为int型(范围在0~1023之间)。
ArduinoUno主板有6个通道(Mega有16个)10位A/D(模数)转换器,即精度为10位,返回值是0~1023,也就是说输入电压为5V的读取精度为5V/1024个单位,约等于每个单位0.049V(mV)。输入范围和进度可通过analogReference()进行修改。
如输入电压为a,则获取模拟输入引脚3的电压值的示例程序如下:
Int potpin=3;
Int value=0;
Vold setup()
{
serial.begin(9600);
}
voi loop()
{
value=analogRead(potpin)*a+1000/1023; //输入电压是a
serial\printIn(value); //输出电压值的单位为mV
{
注意:对ArduinoUno而言,函数参数的pin范围是0~5,对应板上的模拟口A0~A5.其他型号的Arduino控制板以此类推。
可以在开发环境中的下列示例程序中找到analogRead函数的应用:
ADXL3xx.pde、AnalogInput.pde、Calibration.pde、Graph.pde、Knock.pde、Smoothing.pde、VirtualColorMixer.pde。
3.analogWrite(pin,value)
analogWrite函数通过PWM的方式在引脚上输出一个模拟量,较多地应用在LED亮度控制、电动机转速控制等方面。
PWM(Pulse Width Modulation,脉冲宽度调制)方式通过对一系列脉冲的宽度进行调制,来等效地获得所需要的波形或电压。脉冲宽度调制是一种模拟控制方式,其根据相应载荷的变化调制晶体管栅极或基极的偏置,来实现开关稳压电源输出晶体管或晶体管导通时间的改变,这种方式能使电源的输出电压在工作条件变化时保持恒定,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。图1-46是一种简单的PWM波示意图。
其中,V CC 是高电平值,T是PWM波的周期,D是高电平的宽度,D/T是PWM波的占空比,当上述PWM波通过一个低通滤波器后,波形中高频的部分被滤掉得到所需的波形,其平均电压为V CC ×D/T。因此,可通过调节D的大小来改变占空比,产生不同的平均电压;同样,调节PWM波的周期T也可以改变占空比,从而得到不同的平均电压值。
在 Arduino 中执行该操作后,应该等待一定时间后才能对该引脚进行下一次操作。Arduino中PWM的频率大约为490Hz。该函数支持以下引脚:3、5、6、9、10、11。在Arduino控制板上引脚号旁边标注—的是可用作PWM的引脚,如图1-47所示。
图1-46 PWM波示意图
图1-47 Arduino控制板上PWM引脚的标识
analogWrite函数为无返回值函数,有两个参数pin和value:参数pin表示所要设置的引脚,只能选择函数支持的引脚;参数value表示PWM输出的占空比,范围在0~255之间,对应的占空比为0~100%,函数原型如下:
void analogWrite(uint8-t pin,int val)
{
if (digitalPinToTimer(pin)==TIMERIA)
{
//connect pwm to pin on timer 1,channel A
sbi(TCCRIA,COM1A1);
//set pwm duty
OCRIA=val;
}
else if (digitalpintotimer(pin)==TIMERIB)
{
//connect pwm to pin on timer 1,channel B
sbi(TCCR1A,COM1B1);
//set pwm duty
OCR1B=val
}
else if(digitalPintotimer(pin)==TIMER0A)
{
if(val==0);
{
digitalWrite(pin,LOW);
}
wlse
{
//connect pwm to pin on timer 0,channel A
sbi(RCCR0A,COM0A1);
//set pwm duty
OCR0A=val;
}
}
else if (digitalpintotimer(pin)==TIMER2A)
{
//connect pwm to pin on timer 2,channel A
sbi(TCCR2A,COM2A1);
//set pwm duty
OCR2A=val;
}
Else if (giditalpintotimer(pin)==TIMER2B)
{
//connect pwm to pin on timer 2,channel B
sbiTCCR2A,COMB1;
//ocR2B=val;
}
else if (val<12B)
digitalWrite(pin ,LOW);
else
digitalWrite(pin,HIGH);
}
注意:引脚5和6的PWM输出将产生高于预期的占空比。这是因为millis()和delay()函数共享同一个内部定时器,使内部定时器在处理PWM输出时分心。这种情况一般出现在低占空比设置时,如0~10的情况下,还有些情况是占空比为0时,引脚5和6并没有关闭输出。
可以在开发环境的下列实例程序中找到analogWrite函数的应用:
Calidration.pde、Dimmer.pde、Fading.pde。