// ra3g_6_04_2017_пи - регулятор оборотов для двигателя охлаждения лампы int analogPin = 0; // номер порта к которому подключен терморезистор(10ком) float kInt = 0.05; // коэф. интегральной части float kPr = 0.8; // коэф. пропорцианальной части float setTemp = 3.22;//зад. темп. float measureTemp = 3.4;// измер темп. float regTempErr;// разница темпр float speedInt;//интегр часть float speedPr;//пропор часть float Speed;//скорость вентилятора int minSpeed = 27;// минимальная скорость int maxSpeed = 150; //максим. скорость void setup() { Serial.begin(38400); // установка связи по serial // ШИМ 8 разрядов, 7,8125 кГц TCCR1A = TCCR1A & 0xe0 | 1; TCCR1B = TCCR1B & 0xe0 | 0x0a; analogWrite(9, minSpeed); // на выводе 9 ШИМ резистор 1ком на синий провод } void loop() { measureTemp = (float)(5 * analogRead(analogPin))/1024; // счит темп, переводим в вольты regTempErr = setTemp - measureTemp; // считаем ошибку if(measureTemp < setTemp) speedInt = speedInt + regTempErr * kInt; else speedInt = 0;// если ошибка отрицательна, выключаем регулятор speedPr = regTempErr * kPr ; Speed= minSpeed + 255*(speedInt + speedPr)/5 ; if (Speed > maxSpeed) Speed = maxSpeed; if (Speed < minSpeed) Speed = minSpeed; analogWrite(9, Speed); Serial.print("temp=");Serial.print(measureTemp,2); Serial.print(" Err=");Serial.print(regTempErr,2); Serial.print(" speedInt=");Serial.print(speedInt,2); Serial.print(" speedPr=");Serial.print(speedPr,2); Serial.print(" Speed=");Serial.print(Speed,2); Serial.println(" "); delay (1000); }