Ребята, а как прописать в скетче чтобы не дискретно значения на ШИМ выдавались 50,100, 250.... и т.д., а плавно изменялись от 50 к 100, от 100 к 150? ну т.е. значения те же, но переход от одного к другому - плавно?
Ребята, а как прописать в скетче чтобы не дискретно значения на ШИМ выдавались 50,100, 250.... и т.д., а плавно изменялись от 50 к 100, от 100 к 150? ну т.е. значения те же, но переход от одного к другому - плавно?
С уважением, Дмитрий.
тел. 8 9I6 855 7Ч 95
в цикле изменяй хоть от 0 до 255
Хм. Ты имеешь ввиду выполнять цикл при росте температуры на 1 градус? Ну хорошо, а в обратную сторону если температура пойдет? Мне думается как то проще должно быть.
С уважением, Дмитрий.
тел. 8 9I6 855 7Ч 95
Можно повеситься на прерывание таймера и в отдельных переменных хранить текущее состояние шима и необходимое состояние шима. И по таймеру текущее сдвигать к необходимому.
А можно пример кода? А то я не силен в таком подходе.
С уважением, Дмитрий.
тел. 8 9I6 855 7Ч 95
В общем, в рабочем режиме выявлен недостаток "плавания" напряжения на датчике температуры которое показывает ардуина. В то время как обычный мультиметр показывает стабильно. Думаю нужно перейти на усредненное значение за определенное время. Сегодня буду дорабатывать скетч. В т.ч. попробую сделать плавный ШИМ.
С уважением, Дмитрий.
тел. 8 9I6 855 7Ч 95
Не знаю как повесить на таймер в ардуине функцию. Я разрабатываю не в среде ардуино, а в 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 включать, в интернете тоже легко найти.
Вот так можно отфильтровать помеху
sensor = analogRead(EngineTempSensorPin); // замер
delay(1);
sensor_crt = analogRead(EngineTempSensorPin); // контрольный замер
if(sensor == sensor_crt) // если замеры равны, то значит нет ошибки
Обновил скетч в первом посте. Добавил усредненное значение от датчика, упростил код для ШИМ вычисления, ну и так по мелочи подправил...
Попробовал, но все таки остановился на усредненном значении и скорее всего добавлю РЦ фильтр по входу.
Спасибо. Смысл понятен, но прикрутить с пол пинка не удалось. Может подскажет кто-нибудь как работать с функциями таймера?
Последний раз редактировалось paranom; 15.08.2010 в 05:00.
С уважением, Дмитрий.
тел. 8 9I6 855 7Ч 95
Выполнение процедуры по таймеру.
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()
{
//Здесь будет ваш код
}
Последний раз редактировалось Chip; 15.08.2010 в 12:27.
Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)