Re: Как точно вычислить температуру со штатного датчика двигателя?
Ребята, а как прописать в скетче чтобы не дискретно значения на ШИМ выдавались 50,100, 250.... и т.д., а плавно изменялись от 50 к 100, от 100 к 150? ну т.е. значения те же, но переход от одного к другому - плавно?
Re: Как точно вычислить температуру со штатного датчика двигателя?
в цикле изменяй хоть от 0 до 255
Re: Как точно вычислить температуру со штатного датчика двигателя?
Хм. Ты имеешь ввиду выполнять цикл при росте температуры на 1 градус? Ну хорошо, а в обратную сторону если температура пойдет? Мне думается как то проще должно быть.
Re: Как точно вычислить температуру со штатного датчика двигателя?
Можно повеситься на прерывание таймера и в отдельных переменных хранить текущее состояние шима и необходимое состояние шима. И по таймеру текущее сдвигать к необходимому.
Re: Как точно вычислить температуру со штатного датчика двигателя?
А можно пример кода? А то я не силен в таком подходе.
Re: Как точно вычислить температуру со штатного датчика двигателя?
В общем, в рабочем режиме выявлен недостаток "плавания" напряжения на датчике температуры которое показывает ардуина. В то время как обычный мультиметр показывает стабильно. Думаю нужно перейти на усредненное значение за определенное время. Сегодня буду дорабатывать скетч. В т.ч. попробую сделать плавный ШИМ.
Re: Как точно вычислить температуру со штатного датчика двигателя?
Не знаю как повесить на таймер в ардуине функцию. Я разрабатываю не в среде ардуино, а в AVR Studio. Для обработки прерываний в Arduino есть какие-то функции, поищи, тут на форуме было обсуждение таймера.
Ну а осуществить плавную регулировку просто
int CurrentVentPWM;
int TargetVentPWM;
void Timer(void) // эта функция должна вызываться определенное количество раз в секунду (сколько - сам считай, 10-20-50?)
{
if (CurrentVentPWM>TargetVentPWM)
{
CurrentVentPWM--;
AnalogOutput(CurrentVentPWM,???) // не помню что туда надо писать
}
if (CurrentVentPWM<TargetVentPWM)
{
CurrentVentPWM++;
AnalogOutput(CurrentVentPWM,???) // не помню что туда надо писать
}
}
Теперь по поводу дрожания.
Причины может быть две:
1. На самом деле вольтметр не ловит какую-то быструю помеху. Он ведь измеряет постоянное напряжение и если есть постоянная помеха с частотой 100 герц, он ее показать не должен. А ардуина очень быстро выполняет преобразование и помеху даже в 2000Гц она поймает по-полной. Решение - пустить сигнал с датчика через RC цепочку. Что это такое можешь почитать на сайте easyelectronics.ru. Я перед тамошним автором кепку снимаю, насколько доступно он умудряется объяснять.
2. Может быть так, что помеха идет по питанию ардуины. Для того, чтобы таких помех не ловить, надо задемфировтаь вывод aRef и переключить АЦП, чтобы он в качестве опорного напряжения брал не Vcc (напряжение питания МК), а этот aRef. Цепочку, которую надо на aRef включать, в интернете тоже легко найти.
Re: Как точно вычислить температуру со штатного датчика двигателя?
Вот так можно отфильтровать помеху
Цитата:
sensor = analogRead(EngineTempSensorPin); // замер
delay(1);
sensor_crt = analogRead(EngineTempSensorPin); // контрольный замер
if(sensor == sensor_crt) // если замеры равны, то значит нет ошибки
Re: Как точно вычислить температуру со штатного датчика двигателя?
Обновил скетч в первом посте. Добавил усредненное значение от датчика, упростил код для ШИМ вычисления, ну и так по мелочи подправил...
Цитата:
Сообщение от
Chip
Вот так можно отфильтровать помеху
Попробовал, но все таки остановился на усредненном значении и скорее всего добавлю РЦ фильтр по входу.
Цитата:
Сообщение от
SBorovkov
Не знаю как повесить на таймер в ардуине функцию...
Спасибо. Смысл понятен, но прикрутить с пол пинка не удалось. Может подскажет кто-нибудь как работать с функциями таймера?
Re: Как точно вычислить температуру со штатного датчика двигателя?
Выполнение процедуры по таймеру.
PHP код:
//Выполнение процедуры по таймеру.
#include <MsTimer2.h>
static boolean output = HIGH;
void flash_led()
{
digitalWrite(13, (output==HIGH) ? output=LOW : output=HIGH);
}
void setup()
{
MsTimer2::set(500, flash_led); // 500ms интервал вызова процедуры
MsTimer2::start();
}
void loop()
{
//Здесь будет ваш код
}