Arduino基础知识
Arduino
开发板介绍
微控制器
端口
数字输入/输出
0/1 充当开关作用
其中rx/tx端口是用来和电脑进行数据传输的
模拟输入
模拟输入是指连续变化的电压或电流信号,它可以在一定范围内取任意值。这种信号通常来自传感器、测量设备或其他模拟信号源,如温度、压力、声音等物理量的变化都可以转换为模拟信号。模拟信号的特点是连续、平滑,可以反映物理量的细微变化。
电源
5v 、3.3v、G
arduino程序
1 | void setup(){ |
引脚三种模式
INPUT、OUTPUT、INPUT_PULLUP
INPUT_PULLUP 输入上拉模式 启动板载电阻,使该引脚可以直接连接 5V 电压而不需要在之间另加电阻,但 不能接负电位,不能接大于 5V 的电压。
随机函数
random()
randomSeed()
一般可以采用randomSeed(空引脚)获取一个随机数种子,使得arduino每次开机随机数不同
模拟输入输出
模拟输出
1 | analogWrite(ledPin,brightness);//引脚编号,参数:pwn频率值(0~255) |
在调用analogWrite()函数前,无需使用pinMode()函数来设置该引脚。
pwn
Arduino基础篇(四)– 如何玩转Arduino的PWM_arduino pwm-CSDN博客
PWM(Pulse Width Modulation)是一种方波控制信号。采用不同的占空比来模拟“模拟输出”。
作用:
提供模拟输出;如果数字输出被过滤,则其模拟电压将介于0%至100%之间。
生成音频信号。
控制灯光亮度,为电机提供变速控制。
生成调制信号,例如驱动用于远程控制的红外LED
使用
传统方式
1、analogWrite(pin,dutyCycle)
由1.3的图可知,在 UNO 中3,5,6,9,10,11 接口(带~)可以通过简单语句 analogWrite(pin, dutyCycle) 来实现一个指定占空比的 PWM。其中 pin 的值选择(3,5,6,9,10,11),dutyCycle 的值在0~255之间,0为占空比0%,255为占空比100%,对应电压从0到+5V。在调用 analogWrite() 函数之后,引脚将产生指定占空比的稳定方波,直到下一次调用 analogWrite() 或在相同引脚上调用 digitalRead() 或 digitalWrite() 。但是这种方式 PWM 信号的频率是固定的默认值,大多数引脚上的 PWM 信号频率约为490 Hz。在 Uno 和类似的板上,引脚5和6的频率约为980Hz。Leonardo上的引脚3和11也以980Hz运行。提示:在使用PWM时,可以使用示波器检测一下频率。
示例代码:
1 | // 引脚命名 |
2、手动实现 PWM
通过 delayMicroseconds() 手动实现频率可调的 PWM,也被称作数字IO轮转法,使用方法:
两次的digitalWrite输出状态必须相反;
可以用delay()实现毫秒级延迟,用delayMicroseconds()实现微秒级延迟。
示例代码:
1 | void setup() |
上面这段代码会产生一个PWM=0.1的,周期为1ms的方波(1kHz),这种方式的优缺点很明显:
PWM的比例可以更精确;
周期和频率可控制;
所有的pin脚都可以输出,不局限于那几个脚;
缺点:CPU干不了其他事情了;
使用寄存器
(这部分还不太懂,先放弃。。。。。)
对 Arduino 时钟的介绍,请参考Arduino中断的使用。时钟一般可以有多种不同的运行模式。常见的模式包括“快速PWM”和“相位修正PWM”。
Arduino除了常用的比较匹配寄存器外,还有一些其他的寄存器用来控制时钟。
TCCRnA 和 TCCRnB 就是用来设置时钟的计数位数。
脉冲生成模式控制位(WGM):用来设置时钟的模式
时钟选择位(CS):设置时钟的预定标器
输出模式控制位(COMnA和COMnB):使能/禁用/反相 输出A和输出B
输出比较器(OCRnA和OCRnB):当计数器等于这两个值时,输出值根据不同的模式进行变化
不同时钟的这些设置位稍有不同,所以使用的时候需要查一下资料。其中Timer1是一个16位的时钟,Timer2可以使用不同的预定标器。
1、快速PWM
对于快速 PWM 来说,时钟都是从0计数到255。当计数器=0时,输出高电平1,当计数器等于比较寄存器时,输出低电平0。所以输出比较器越大,占空比越高。这就是传说中的快速PWM模式。后面的例子会解释如何用OCRnA和OCRnB设置两路输出的占空比。很明显这种情况下,这两路输出的周期是相同的,只是占空比不同。
参考示例
下面这个例子以 Timer2 为例,把 Pin3 和 Pin11 作为快速PWM的两个输出管脚。其中:
WGM 的设置为 011,表示选择了快速PWM模式;
COM2A 和 COM2B 设置为 10,表示A和B输出都是非反转的 PWM;
CS的设置为100,表示时钟周期是系统时钟的1/64;
OCR2A和OCR2B分别是180和50,表示两路输出的占空比;
1 | pinMode(3, OUTPUT); |
在Arduino Due 开发板,上面这几行代码的结果为:
输出 A 频率: 16 MHz / 64 / 256 = 976.5625Hz
输出 A 占空比: (180+1) / 256 = 70.7%
输出 B 频率: 16 MHz / 64 / 256 = 976.5625Hz
输出 B 占空比: (50+1) / 256 = 19.9%
频率的计算里都除以了256,这是因为除以64是得到了时钟的计数周期,而256个计数周期是一个循环,所以PWM的周期指的是这个循环。另外,占空比的计算都加了1,这个是因为从0开始计数。
2、相位修正PWM
另外一种 PWM 模式是相位修正模式,也有人把它叫做“双斜率PWM”。这种模式下,计数器从0数到255,然后从255再倒数到0。当计数器在上升过程中遇到比较器的时候,输出0;在下降过程中遇到比较器的时候,输出1。
相位修正PWM的例子
继续以 Timer2 为例,设置 Pin3 和 Pin11 为输出管脚。其中WGM设置为001,表示相位修正模式,其他位设置和前面的例子相同:
1 | pinMode(3, OUTPUT); |
在Arduino Due开发板,上面这几行代码的结果为:
输出 A 频率: 16 MHz / 64 / 255 / 2 = 490.196Hz
输出 A 占空比: 180 / 255 = 70.6%
输出 B 频率: 16 MHz / 64 / 255 / 2 = 490.196Hz
输出 B 占空比: 50 / 255 = 19.6%
提示:与快速 PWM 相比,相位校正 PWM 将频率除以2,因为定时器同时上下运行。有些令人惊讶的是,频率被255除,而不是256除,占空比计算不加一作为快速脉宽调制。
一般来说,普通用户是不需要设置这些时钟参数。Arduino 默认有一些设置,所有的时钟周期都是系统周期的1/64。Timer0 默认是快速 PWM,而 Timer1 和 Timer2 默认是相位修正 PWM。具体的设置可以查看Arduino源代码中writing.c的设置。
需要特别特别注意的是,Arduino的开发系统中,millis()和delay()这两个函数是基于Timer0时钟的,所以如果你修改了Timer0的时钟周期,这两个函数也会受到影响。直接的效果就是delay(1000)不再是标准的1秒,也许会变成1/64秒,这个需要特别注意。
如果想要修改时钟频率,以及时钟的计数上限,请参考文章后面的链接。
参考
调整 PWM 频率: https://playground.arduino.cc/Main/TimerPWMCheatsheet/
Arduino PWM 的秘密——英文教程:http://www.righto.com/2009/07/secrets-of-arduino-pwm.html
Arduino PWM 的秘密——中文教程:http://www.diy-robots.com/?p=852
模拟输入
电位器
引脚、电阻值(1、3引脚间)、旋钮(往哪转哪边电阻减小)
!]
05v映射到 01023
analogRead()
示例程序:
1 | void setup(){ |
Arduino控制器读取一次模拟输入许需要消耗100微秒的时间。每秒一万次。
语法:analog Read(Pin);
应用
示例程序:
1 | void setup(){ |
Arduino编程语句参考
结构, 数值 (变量与常量) 和函数
结构
略
数值
数据类型
BYTE=unsigned char(完全等同)//1字节
WORD=unsigned short(完全等同)//2字节
DWORD=unsigned long(完全等同)//4字节
- byte(字节)
byte类型变量可存储8位无符号数,其存储数值范围是 0 – 255。
byte类型变量在控制LED时显得格外有用,因为Arduino控制LED亮度或色彩时常常使用的数值是在0-255之间。
转换
char(x)
byte(x)
int(x)
word(x)
……
x:任何类型的值
函数
通信
stream
当我们使用ESP8266开发板或者Arduino开发板来开发项目时,可以使用基于Stream类的库来处理Stream数据。以下列表中的库都是基于Stream类所建立的。
库 | 类 |
---|---|
Serial | Serial |
SoftwareSerial | SoftwareSerial |
Ehternet | EthernetClient |
ESP8266FS | File |
SD | File |
Wire | Wire |
GSM | GSMClient |
WifiClient | WiFiClient |
WiFiServer | WiFiServer |
WiFiUDP | WiFiUDP |
WiFiClientSecure | WiFiClientSecure |
函数
具体使用方法:
子类名**.**函数名
例:
Serial.available()
wifiClient.available()
serial(串行通信)
串行端口用于Arduino和个人电脑或其他设备进行通信。个人电脑可以通过USB端口与Arduino的引脚0(RX)和引脚1(TX) 进行通信。
函数见上
ASCII
数字I/O
pinMode()
digitalWrite()
digitalRead()
模拟I/O
高级I/O
tone()//发声
noTone()//停止发声
shiftOut()//移位??还不懂
shiftIn()
pulseIn()//读取脉冲信号(HIGH/LOW)
时间
millis()//millis函数可以用来获取Arduino开机后运行的时间长度,该时间长度单位是毫秒,最长可记录接近50天左右的时间。如果超出记录时间上限,记录将从0重新开始。
micros()//micros函数可以用来获取Arduino开机后运行的时间长度,单位为微秒,最长可记录接近70分钟的时间。如果超出记录时间上限,记录将从0重新开始。
delay() //毫秒
delayMicroseconds()//微秒
数字
min() 最小值
max() 最大值
abs() 绝对值
constrain() 数值限制//constrain(x, a, b)
map() 映射函数//map (x, in_min, in_max, out_min, out_max)
pow() 指数函数
sqrt() 开方函数
三角函数
sin() -正弦函数
cos() -余弦函数
tan() -正切函数
随机数
位与字节
lowByte()
highByte()
bitRead()
bitWrite()
bitSet()
bitClear()
bit()
外部中断
attachInterrupt() – 设置中断
detachInterrupt() – 取消中断