这些代码是写在之前参加电子设计竞赛的时候的,只是有些忘记过去的那些代码,加上最近需要用到,于是。。
让我们先看看百科上的说明:
看门狗定时器(WDT,Watch Dog Timer)是单片机的一个组成部分,它实际上是一个计数器,一般给看门狗一个大数,程序开始运行后看门狗开始倒计数。如果程序运行正常,过一段时间CPU应发出指令让看门狗复位,重新开始倒计数。如果看门狗减到0就认为程序没有正常工作,强制整个系统复位。
简单的来说就是我们需要隔一段时间执行一段代码,所以我们需要用到定时器。
#include
#include
void setup(){
Timer1.initialize(1000); // set a timer of length 100000 microseconds (or 0.1 sec - or 10Hz => the led will blink 5 times, 5 cycles of on-and-off, per second)
MsTimer2::set(20, timeCnt); // 500ms period
MsTimer2::start();
}
float setHerz(float hr){
hr=1048576/(hr/1000000*1048576);//1Mhz=1048576 Mhz to M
Timer1.setPeriod(hr);
return hr;
}
float getTimeHz(float hz,float degree){
float hzTemp=setHerz(hz);
float time=(200/hz)*(degree/360)*1000;
return time;
}
简要的对代码进行一下说明,因为我们需要用到timer1来当PWM调节用,以及timer2拿来当定时器。所以在这里我们需要两个定时器,我们需要在过程中不断修改Timer1的频率以便用来调整速度,因此有下面的函数,同时不要忘记注意pwm的倍数关系
ATmega168有三个时钟,名字分别叫Timer0, Timer1和Timer2。每个时钟都使用了两个寄存器,其中一个是设定值例如128,另一个则从0开始不断递增,到1024之后溢出回到0。那么当两个值相同的时候,Timer就会把某个管脚反相。不同的Timer之间频率是相同的,占空比则根据设置值不同。
定时器的精度取决于你的处理器速度和频率。定时器的时钟速度是通过设置预分频器,或除数定义。这个预分频可以被设置为1,8,64,256或1024。
Timer1使用方法如下:
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();
代码示例
#include
void flash()
{
static boolean output = HIGH;
digitalWrite(led_pin, output);
output = !output;
}
void setup()
{
pinMode(led_pin, OUTPUT);
MsTimer2::set(500, flash); // 500ms period
MsTimer2::start();
}
void loop()
{
}
围观我的Github Idea墙, 也许,你会遇到心仪的项目