TIMSKx 定时器/计数器中断屏蔽寄存器;启用/禁用定时器中断
TIFRx 定时器/计数器中断标志寄存器;表示挂起的定时器中断
这里给个 Timer0 的寄存器,更多请参考技术文档。
2、预分频系数与比较匹配器
Arduino UNO 时钟以16MHz运行。计数器的一个刻度值表示 1 / 16,000,000秒(~63ns),跑完1s需要计数值16,000,000。
(1)Timer0 和 Timer2 是8位定时器,可以存储最大计数器值255。
(2)Timer1 是一个16位定时器,可以存储最大计数器值65535。
一旦计数器达到其最大值,它将回到零(这称为溢出)。因此,需要对时钟频率进行分频处理,即预分频器。通过预分频器控制定时计数器的增量速度。预分频器与定时器的计数速度如下:
定时器速度(HZ) = Arduino UNO时钟速度(16MHz) / 预分频器系数
因此,1预分频器将以16MHz递增计数器,8预分频器将在2MHz递增,64预分频器= 250kHz,依此类推。
定时器 Timer0 的预分频系数配置如表:
现在您可以用以下公式计算中断频率:
中断频率(Hz)=(Arduino时钟速度16MHz)/(预分频器*(比较匹配寄存器+ 1))
重新排列上面的等式,给出你想要的中断频率,你可以求解比较匹配寄存器值:
比较匹配寄存器= [16,000,000Hz /(预分频器*所需的中断频率)] - 1
当你使用定时器0和2时,这个数字必须小于256,对于timer1小于65536。
所以如果你想每秒一次中断(频率为1Hz):
比较匹配寄存器= [16,000,000 /(预分频器 * 1)] -1
预分频器为1024,你得到:
比较匹配寄存器= [16,000,000 /(1024 * 1)] -1 = 15,624
因为256 <15,624 <65,536,你必须使用timer1来实现这个中断。
3、定时器模式
定时器可以配置为不同的模式。
(1)PWM模式。 纸浆宽度调制模式。 OCxy输出用于生成PWM信号
(2)CTC模式。 比较匹配时清除计时器。 当定时器计数器到达比较匹配寄存器时,定时器将被清除。
定时器 Timer0 的模式选择配置如表:
3。3 定时器的配置
int toggle0,toggle1,toggle2;
void setup(){
cli();关闭全局中断
//设置定时器0为10kHz(100us)
TCCR0A = 0;//将整个TCCR0A寄存器设置为0
TCCR0B = 0;//将整个TCCR0B寄存器设置为0
TCNT0 = 0;//将计数器值初始化为0
//设置计数器为10kHZ,即100us
OCR0A = 24;//比较匹配寄存器= [16,000,000Hz /(预分频器*所需中断频率)] - 1
//比较匹配寄存器=24,中断间隔=100us即中断频率10khz
TCCR0A |= (1 << WGM01);//打开CTC模式
TCCR0B |= (1 << CS01) | (1 << CS00); //设置CS01位为1,CS00位为1(64倍预分频)
TIMSK0 |= (1 << OCIE0A);//启用定时器比较中断
//设置定时器1为1kHz
TCCR1A = 0;//将整个TCCR1A寄存器设置为0
TCCR1B = 0;//将整个TCCR1B寄存器设置为0
TCNT1 = 0;//将计数器值初始化为0