非常好的
Arduino与labview的直流电机转速控制文章,可以借鉴,非常清楚详细
如程序代码2:转速测量程序
#include
long counter_val[2] = {0,0}; //定义数组,用于存放外部中断计数值
byte CurCnt = 0; //定义当前计数器标志,用于判断当前正在计数的数组
int j=0; //定义定时器中断标志,用于判断是否发生中断
void setup() {
delay(2000);
Serial.begin(115200);//初始化波特率为115200
attachInterrupt(0, counter, RISING);//设置中断方式为上升沿
timer1.initialize(1000000); // 设置定时器中断时间,单位微秒,此处为1秒
Timer1.attachInterrupt( timerIsr ); // 打开定时器中断
interrupts(); //打开外部中断
}
void loop()
{
long lTemp = 0; //定义临时存储数据变量
if(j==1) //判断是否发生定时器中断,即定时时间是否到达
{
j=0; //清除定时器中断标志位
if((CurCnt&0x01) == 0) //当前使用的是偶数计数器,则上次频率值存放在第二个元素中
{
lTemp = counter_val[1]; //读取数组第二个元素中的数值
counter_val[1]=0; //读完清除原来的数值,以便下次使用
}
else //当前使用的是奇数计数器,则上次频率值存放在第一个元素中
{
lTemp = counter_val[0]; //读取数组第二个元素中的数值
counter_val[0]=0; //读完清除原来的数值,以便下次使用
}
Serial.print("S"); //发送帧头大写S
Serial.print( lTemp); //发送频率数据,并回车换行
}
}
//外部中断处理函数
void counter()
{
//通过当前计数器来实现对外部中断计数值存储的切换
counter_val[CurCnt& 0x01] += 1; //发生一次中断则加1
}
//定时器中断处理函数
void timerIsr()
{
j=1; //置位定时器中断标志位
CurCnt++; //当前计数器的值加1,实现另一个计数值切换
}