Arduino 2005 年诞生于意大利伊夫雷亚交互设计院。它简单易用,得益并完美演绎着开源精神,是一项重要的创客项目。

1.内部机理

该设计院的另一开源软件wiring对arduino的成功功不可没, 另外还有Processing。 wiring库为Arduino控制硬件引脚提供了简单易用的函数。arduino安装目录中有hardware文件夹往下还有cores文件夹,其中的arduino文件夹中是.h和.cpp文件。hardware/arduino/variants文件夹中有各开发板对应的文件夹,其中的pin_arduino.h 定义了开发板引脚常量。

sketch->gcc->avrdude->(usb serial)flashmemory  使用可监听串口的引导程序(hardware/arduino/bootloaders/)。无需使用特殊硬件就可以对arduino进行编程。

用另一块arduino开发板烧录引导程序(约500字节)

main.cpp

#include  <Arduino.h>

int main(void){         init();

#if defined(USBCON)

USBDevice, attach();

#endif

setup();

for(;;){  loop();

if(serialEventRun) serialEventRun();}

return 0;

}

2.中断和定时器

传感器输入的短脉冲可能只存在几百万分之一秒,可以使用中断接收这些事件。attachInterrupt(0,stuffhappened,FALLING), 参数1:中断号,中断0是指引脚D2,中断1指的是引脚D3;参数2:要调用的函数,ISR中断服务程序;参数3:中断模式FALLING下降沿,RISING,CHANGE,LOW,HIGH。

中断信号通常是从传感器的数字输出端产生的,这种情况下不需要上拉电阻。如传感器是一个开关,启动内部上拉电阻(40kΩ),可以减少器件用量。如:pinMode(2,INPUT_PULLUP); attachInterrupt(0,stuffHapened,RISING);

ISR尽可能短而快。在ISR内部,中断时自动关闭的,以防止ISR相互中断造成的潜在混乱。delay函数使用了定时器中断,以此它可能会受影响,millis同样如此。delayMicroseconds没有使用中断。

ISR功能不允许带参数且不能返回值,传递数据需要用到全局变量。变量声明中包含volatile。不使用volatile程序可能也会正常工作,但c编译器可能为了提高性能而将生成的机器代码缓存入一个寄存器中,如果这一缓存过程被中断,则变量可能无法正确更新。

默认情况下sketch中中断处于开启状态,ISR内部中断被自动禁用。可以明确地使用interrupts();nointerrupts()函数开启或关闭中断。

TimerOne让设置定时中断更容易。

3.效率

算法加速:少用浮点数;查找优于计算。

ATmega328端口:DDR数据方向寄存器;PORT寄存器设置输出;PIN端口输入寄存器。 对于c端口,它们分别是:DDRC  PORTC PINC。直接使用端口

而不是:pinMode或digitalWrite。DDRB=B00000100;PORTB=B00001000。

analogRead()函数使用了逐次逼近型ADC,通过和参考电压进行比较调整逼近模拟值,该ADC是有定时器控制,提高频率使转换更快。

降低时钟频率以降低功耗:Prescaler库,#include <Prescaler.h>     setClockPrescaler(CLOCK_PRESCALER_256),256将时钟频率从1时的16MHz降低到1/256即62.5kHz。

关闭一些模块:ATmega芯片具有非常先进的电源管理能力。使用AVR/power.h库控制电源,power_adc_disable();power_timer2_enable;其他还有spi,twi,usart0,all。

Narcoleptic库使用自己的delay函数实际上是定时休眠。如果项目依赖于按键来触发,则不一定要使用外部中断来唤醒休眠。可采用每秒10次的快速休眠。

AVR/sleep.h

4.内存

arduino uno内存2kB,程序直接在32kB闪存上运行而非内存。

 

5.通讯

5.1  iic

5.2  1-wire

5.3  spi

5.4  uart

 

5.5  usb

5.6 wifi

6.数字信号处理

7.管理进程

8.编写程序库

9.器件