arduino pid风扇调速


#define spd 2 //外部中断0,速度信号,引脚2
int count = 0; //脉冲计数值
int rpm = 0;

int error,integral,out;
unsigned long timenew = 0, old_time = 0; // 时间标记
unsigned long time = 0; // 时间标记
void setup() {
Serial.begin(9600); // 启动串口通信,波特率为9600b/s
pinMode(spd,INPUT);//cesuxinhao
pinMode( 9 , OUTPUT);
setPwmFrequency(9, 1);
attachInterrupt(0, Code1, FALLING);//脉冲中断函数
}

void loop() {
timenew = millis();//以毫秒为单位,计算当前时间
//计算出每一秒钟编码器码盘计得的脉冲数
if(abs(timenew - old_time) >= 1000) // 如果计时时间已达1秒
{
detachInterrupt(0); // 关闭外部中断0
//把每一秒钟编码器码盘计得的脉冲数,换算为当前转速值
//转速单位是每分钟多少转,即r/min。
rpm =(float)count;
//设定值为50
error = 50-rpm;//误差
integral += error;//积分
//P=0.5 I=0.05 PI算法
out = out + 0.5 * error + 0.05 * integral;//输出值
if (out>255)out=255;
if (out<0)out=0;
Serial.print(out);
Serial.print(",");
analogWrite(9 , out);
Serial.println(rpm);
//恢复测速的初始状态
count = 0; //把脉冲计数值清零,以便计算下一秒的脉冲计数
old_time= millis(); // 记录每秒测速时的时间节点
attachInterrupt(0, Code1,FALLING); // 重新开放外部中断0
}
}
// 左侧车轮电机的编码器码盘计数中断子程序
void Code1()
{
//为了不计入噪音干扰脉冲,
//当2次中断之间的时间大于5ms时,计一次有效计数
if((millis()-time)>5)
//当编码器码盘的OUTA脉冲信号下跳沿每中断一次,
count += 1; // 编码器码盘计数加一
time==millis();
}

// Note that the base frequency for pins 3, 9, 10, and 11 is 31250 Hz
// Note that the base frequency for pins 5 and 6 is 62500 Hz
// Set pin 9's PWM frequency to 3906 Hz (31250/8 = 3906)
// Set pin 6's PWM frequency to 62500 Hz (62500/1 = 62500)
void setPwmFrequency(int pin, int divisor) {
byte mode;
if(pin == 5 || pin == 6 || pin == 9 || pin == 10) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 64: mode = 0x03; break;
case 256: mode = 0x04; break;
case 1024: mode = 0x05; break;
default: return;
}
if(pin == 5 || pin == 6) {
TCCR0B = TCCR0B & 0b11111000 | mode;
} else {
TCCR1B = TCCR1B & 0b11111000 | mode;
}
} else if(pin == 3 || pin == 11) {
switch(divisor) {
case 1: mode = 0x01; break;
case 8: mode = 0x02; break;
case 32: mode = 0x03; break;
case 64: mode = 0x04; break;
case 128: mode = 0x05; break;
case 256: mode = 0x06; break;
case 1024: mode = 0x7; break;
default: return;
}
TCCR2B = TCCR2B & 0b11111000 | mode;
}
}

此条目发表在待分类分类目录。将固定链接加入收藏夹。