буду с ним разбираться, дальнейшее изучение Ардуино всё равно нужно, так как собираю станок чпу фрезер
ну пожалуйста, при ваших вводных (в которых лично я не совсем уверен)
ИИ нагенерил такое
#include <TimerOne.h>
// Параметры схемы
const float V_REF = 5.0; // Опорное напряжение Arduino (5 В)
const float R_REF = 220.0; // Опорный резистор в делителе (Ом)
const int SENSOR_PIN = A0; // Аналоговый пин для датчика
// Параметры датчика (линейная зависимость сопротивление – температура)
const float R_40 = 400.0; // Сопротивление при 40°C
const float R_120 = 51.0; // Сопротивление при 120°C
const float T_MIN = 40.0; // Нижняя граница температуры
const float T_MAX = 120.0; // Верхняя граница температуры
// Параметры выходного ШИМ-сигнала (частота)
const float F_MIN = 17.0; // Частота при T_MIN (Гц)
const float F_MAX = 25.0; // Частота при T_MAX (Гц)
const int PWM_PIN = 9; // Пин для ШИМ (таймер 1)
const int DUTY_CYCLE = 512; // 50% заполнения (0–1023)
// Сглаживание измерений
const int NUM_SAMPLES = 10; // Количество отсчётов для усреднения
void setup() {
Serial.begin(9600); // Для отладки (можно отключить)
Timer1.initialize(); // Инициализация таймера 1
// Устанавливаем начальную частоту (среднюю)
float initFreq = (F_MIN + F_MAX) / 2.0;
Timer1.pwm(PWM_PIN, DUTY_CYCLE, 1000000.0 / initFreq); // период в мкс
}
void loop() {
// 1. Усреднённое чтение аналогового входа
long sum = 0;
for (int i = 0; i < NUM_SAMPLES; i++) {
sum += analogRead(SENSOR_PIN);
delay(1); // Короткая пауза между измерениями
}
float adcValue = sum / (float)NUM_SAMPLES;
// 2. Пересчёт ADC в напряжение
float voltage = adcValue * V_REF / 1023.0;
// 3. Расчёт сопротивления датчика по формуле делителя:
// V_out = V_REF * R_sensor / (R_sensor + R_REF)
// => R_sensor = R_REF * V_out / (V_REF - V_out)
if (voltage >= V_REF) voltage = V_REF - 0.001; // защита от деления на 0
float R_sensor = R_REF * voltage / (V_REF - voltage);
// Ограничиваем сопротивление допустимым диапазоном
if (R_sensor < R_120) R_sensor = R_120;
if (R_sensor > R_40) R_sensor = R_40;
// 4. Расчёт температуры (линейная аппроксимация)
float dR = R_40 - R_120; // = 349 Ом
float dT = T_MAX - T_MIN; // = 80 °C
float temperature = T_MIN + (R_40 - R_sensor) * dT / dR;
// 5. Расчёт требуемой частоты ШИМ (линейно от температуры)
float frequency = F_MIN + (temperature - T_MIN) * (F_MAX - F_MIN) / dT;
// Ограничение частоты заданными пределами
if (frequency < F_MIN) frequency = F_MIN;
if (frequency > F_MAX) frequency = F_MAX;
// 6. Установка частоты ШИМ (период в микросекундах)
Timer1.setPeriod(1000000.0 / frequency); // автоматически обновляет ШИМ
// 7. Отладка – вывод значений в монитор порта
Serial.print("ADC: "); Serial.print(adcValue);
Serial.print(" U: "); Serial.print(voltage);
Serial.print(" R: "); Serial.print(R_sensor);
Serial.print(" T: "); Serial.print(temperature);
Serial.print(" f: "); Serial.println(frequency);
// Пауза перед следующим циклом измерений
delay(200);
}
спасибо огромное! попробую и сообщу результат
ну а вы на что рассчитывали? Что вам код бесплатно подарят?