Timer1

Timer是应用于ATmega168/328的库文件,主要用于手机16位计数器的常规配置数据。芯片中主要有3中硬件计数器,他们通过不同的配置方式,达到不同的应用功能。开始时这个库主要用于更加快捷方便的更改PWM的周期或频率,但是现在可以用于中断处理或其他特殊功能。它能够很方便的扩展其他计数器的功能。

计数器的精度取决于你的处理器速率和频率。Timer1的时钟频率是由预分频器的设置决定的。预分频器的值可以是1, 8, 64, 256 or 1024。

例如16MHz:

Prescale Time per counter tick Max Period
1 0.0625 uS 8.192 mS
8 0.5 uS 65.536 mS
64 4 uS 524.288 mS
256 16 uS 2097.152 mS
1024 64uS 8388.608mS

In general:

  • Max Period = (Prescale)*(1/Frequency)*(2^17)
  • Time per Tick = (Prescale)*(1/Frequency)

License: GPLv2.0
下载地址 -> TimerOne Google Code download

安装过程:下载完后接下,然后将文件放入  Arduino/hardware/libraries/文件夹内。

分开维护和升级的TimerOne副本还是有效的,它能更有效率地支持更多的硬件。

:: Timer3 ::

我们注意到Timer1能被用在Mega上,但是并不支持所有的OCR1A,OCR1B & OCR1C这三个输出引脚。只有A和B是支持的。在Mega上OCR1A 对应引脚11 ,OCR1B对应引脚 12。使用指定3引脚中的一个,1指向11号引脚,2指向12号引脚。Timer3只在Mega上测试通过。

License: Creative Commons
下载地址-> TimerThree.zip

安装过程:下载完后接下,然后将文件放入  Arduino/hardware/libraries/文件夹内。

修正:

  • Modified June 2011 adding read method and starting google code group – Lex Talionis
  • Modified October 2009 adding TimerThree.zip for ATMega1280 / Arduino Mega support – keshka
  • Modified June 2009 to fix a bug in setPeriod() that caused the timer to stop – thanks Michael Polli
  • Modified March 2009 for ATmega 328 support – thanks Jérôme Despatis
  • Created June 2008 – Jesse Tane

文档 – 简化的描述下列命令的基本功能


initialize(period)

在使用其他函数之前,必须先调用这个函数。你可以在这里指定计时器的周期(微秒),默认设置为1秒。注意,这会中断的Arduino板子上的analogwrite()数字引脚9和10。

setPeriod(period)

用微秒设置周期。这个库支持的最小周期或最高频率是1微秒或1兆赫。最大周期为8388480微秒或约8.3秒。请注意,设置期间将伴随中断,同时也改变PWM输出的频率和占空比。

pwm(pin, duty, period)

让指定的引脚上产生一个PWM波形。PORTB引脚1和2,所以你必须在这两者之间选择一个作为timer1的输出引脚。在Arduino中,选择数字引脚9和10也是可以的。在arduino mega上,从PORTE到2,3和5的引脚作为timer3的输出引脚。占空比可以是0到1023之间的的任意一个10位数值。注意,你可以设置一个微秒级的时间作为函数的最后一个参数。

attachInterrupt(function, period)

在指定的微秒时间内调用函数。注意,不要在太高的频率下执行太复杂的中断函数,否则中央处理器可能永远不会进入主循环,你的程序将“锁定”。注意,你可以设置一个微秒级的时间作为函数的最后一个参数。

setPwmDuty(pin, duty)

如果你已经在早期调用了pwm()函数,那对给定引脚来设置pwm的参数来说是一个捷径。这样就可以避免当你调用pwm()函数时,强制设置PWM的模式,设置数据记录方向,检查最优的调整等等。

detachInterrupt()
使中断失效

disablePwm(pin)

关闭PWM,这样可以空出引脚供其他元件使用。

read()

从最近一次的延时读取时间,单位微秒。


函数使用 – 调用所有函数的约定


void initialize(long microseconds=1000000);
void start();
void stop();
void restart();
unsigned long read();
void setPeriod(long microseconds);
void pwm(char pin, int duty, long microseconds=-1);
void setPwmDuty(char pin, int duty);
void disablePwm(char pin);
void attachInterrupt(void (*isr)(), long microseconds=-1);
void detachInterrupt();


 – 设置 PWM 为,引脚9 ,50% 占空比, ,每0.5秒通过数据引脚10终断一次

/*
 *  Timer1 library example
 *  June 2008 | jesse dot tane at gmail dot com
 */

#include "TimerOne.h"
void setup()
{
  pinMode(10, OUTPUT);
  Timer1.initialize(500000);         // initialize timer1, and set a 1/2 second period
  Timer1.pwm(9, 512);                // setup pwm on pin 9, 50% duty cycle
  Timer1.attachInterrupt(callback);  // attaches callback() as a timer overflow interrupt
}
void callback()
{
  digitalWrite(10, digitalRead(10) ^ 1);
}
void loop()
{
  // your program here...
}

Other sketches/snippets that use Timer1:

0 Comments
Leave a Reply