Не могу разобраться с правильной схемой и расчетами обвязки.Дано: шим на ардуино нано опторазвязка PC817 дальше мосфет IRF1404 , нагрузка электровентилятор 12 вольт 24 ампера ,диод шотки. управление от штатного датчика температуры.Даже подходящей схемы не нашел. Может кто поможет, обьяснит как расчитать сопротивления обвязки.
‘’’
// Конфигурация пинов
const int fanPwmPin = 9; // Пин ШИМ для управления вентилятором
const int tempSensorPin = A0; // Пин датчика температуры
// Параметры работы
const float tempMinPWM = 65.0; // Температура включения вентилятора на 20 % (°C)
const float tempMaxPWM = 80.0; // Температура включения вентилятора на 100 % (°C)
const int pwmMin = 51; // Минимальная ШИМ-заполненность: 20 % от 255 ≈ 51
const int pwmMax = 255; // Максимальная ШИМ-заполненность: 100 %
// Характеристики датчика температуры
const float voltageAt100C = 0.7; // Напряжение при 100 °C (В)
const float voltageAt20C = 3.5; // Напряжение при 20 °C (В)
// Переменные
float currentTemp = 0;
int pwmValue = 0;
void setup() {
pinMode(fanPwmPin, OUTPUT);
Serial.begin(9600); // Для отладки
analogReference(DEFAULT); // Опорное напряжение 5 В (стандартное для Arduino Nano)
}
void loop() {
readTemperature(); // Считываем температуру
calculatePWM(); // Рассчитываем значение ШИМ
applyPWM(); // Подаём сигнал на вентилятор
printDebugInfo(); // Выводим отладочную информацию
delay(1000); // Задержка 1 с между измерениями
}
// Функция считывания температуры с учётом характеристик датчика
void readTemperature() {
int sensorValue = analogRead(tempSensorPin);
float voltage = sensorValue * (5.0 / 1023.0); // Преобразование в напряжение (0–5 В)
// Линейная интерполяция для расчёта температуры
// При 20 °C → 3.5 В, при 100 °C → 0.7 В
if (voltage >= voltageAt20C) {
currentTemp = 20.0; // Если напряжение выше 3.5 В, считаем температуру 20 °C
} else if (voltage <= voltageAt100C) {
currentTemp = 100.0; // Если напряжение ниже 0.7 В, считаем температуру 100 °C
} else {
// Расчёт температуры по линейной зависимости
float tempRange = 100.0 - 20.0;
float voltageRange = voltageAt100C - voltageAt20C;
currentTemp = 20.0 + (voltage - voltageAt20C) * tempRange / voltageRange;
}
}
// Расчёт значения ШИМ в зависимости от температуры
void calculatePWM() {
if (currentTemp < tempMinPWM) {
pwmValue = 0; // Вентилятор выключен, если температура ниже 65 °C
} else if (currentTemp >= tempMaxPWM) {
pwmValue = pwmMax; // Максимальная скорость (100 %), если температура ≥ 80 °C
} else {
// Линейная зависимость между tempMinPWM и tempMaxPWM
float tempRange = tempMaxPWM - tempMinPWM;
float pwmRange = pwmMax - pwmMin;
pwmValue = pwmMin + (int)((currentTemp - tempMinPWM) * pwmRange / tempRange);
}
}
// Подача ШИМ-сигнала на вентилятор
void applyPWM() {
analogWrite(fanPwmPin, pwmValue);
}
// Вывод отладочной информации в Serial Monitor
void printDebugInfo() {
Serial.print(“Напряжение датчика: “);
Serial.print(analogRead(tempSensorPin) * (5.0 / 1023.0), 2);
Serial.print(” В, Температура: “);
Serial.print(currentTemp, 1);
Serial.print(” °C, ШИМ: “);
Serial.print(pwmValue);
Serial.print(” (”);
Serial.print((pwmValue * 100.0) / 255.0, 1);
Serial.println(“% )”);
}
‘’’


