Re: Прерывания в Arduino.
хочу попробовать сделать коммутатор на скутер, суть такова:
1. считать импульс с датчика Холла
2. запустить таймер с учетом количества оборотов, прока что будет без ФУОЗ
3. при срабатывании таймер выдать искру, ну и все по новой.
Главное чтобы это все не тормозило основную программу, вот и подумал сделать через прерывания. Уже что-то началось получаться ;)
Re: Прерывания в Arduino.
А длительность импульса зачем измерять?
Вот на основе этого скетча можно сделать то что тебе нужно
PHP код:
#include <util/delay.h>
volatile unsigned int tachBuf;
unsigned long tachValue;
ISR(TIMER1_CAPT_vect)
{
TCNT1 = 0;
tachBuf = ICR1+2;
}
//********************************************************************
void setup()
{
pinMode(8, INPUT); //Вход для импульсов спидометра
pinMode(6, OUTPUT);//выход ШИМ
TCCR0B = TCCR0B & 0b11111000 | 5;//частота ШИМ
analogWrite(6, 128); //Запустить ШИМ
digitalWrite(8, HIGH); // включить подтяжку входа
Serial.begin(115200);
TIM_Init();//инициализация таймера
_delay_ms(300);
}
//********************************************************************
void loop()
{
cli();
tachValue =250000/tachBuf;
Serial.print("freq=");
Serial.println(tachValue,DEC);
tachBuf=1;
sei();
_delay_ms(300);
}
//********************************************************************
void TIM_Init(void)
{
TIMSK1=(1<<ICIE1);
TCCR1A=(0<<COM1A1)|(0<<COM1A0)|(0<<WGM11)|(0<<WGM10);
TCCR1B=(1<<ICNC1)|(1<<ICES1)|(0<<WGM13)|(0<<WGM12)|(0<<CS12)|(1<<CS11)|(1<<CS10);
TCNT1 = 0;
}
Re: Прерывания в Arduino.
1. этот код работает от 250Гц, это меня не устраивает
2. мне длительность импульса не надо мерить, мб я не совсем точно объяснил. вот что мне надо в идеале:
а. ловим импульс от датчика (пока что буду ловить по спаду)
б. в зависимости от количества оборотов на данный момент запустить таймер
в. когда таймер сработает он должен выдать коротко временный импульс и выключиться
Re: Прерывания в Arduino.
Re: Прерывания в Arduino.
Цитата:
Сообщение от
sirik
...
2. мне длительность импульса не надо мерить,... в зависимости от количества оборотов ...
Длина импульса и есть "количество оборотов": либо длину импульса либо период - что-то одно из двух придётся мерить.
Re: Прерывания в Arduino.
т.е. получается для статистики (т.е. для тахометра) достаточно измерить длину импульса.. спасибо за подсказку, не догадался
Re: Прерывания в Arduino.
Гораздо точнее будут показания если измерять частоту, в моем примере как раз частота и измеряется
Re: Прерывания в Arduino.
Доброго времени Уважаемый Chip, я новичёк в прогрммировании *duino, и уперся в прерывния, есть такая задача зажигать СД на 6-50 мс (регулируется переменником) с паузой 5-60 сек (регулируется другим переменником), значения выводятся на LCD я сделал это с помощью delay, но проц виснит если пауза дольше 30ти сек и вывод на LCD опаздывает (как и регулировка) на длину этих delay, начал копать и до капал до прерыванию по таймеру, но не могу найти хоть что либо похожее под мою ситуацию для примера... Вы не могли бы на брасать хотябы принцип, буду очень благодарен...
Re: Прерывания в Arduino.
Возьми пример с MsTimer2
PHP код:
//Выполнение процедуры по прерыванию таймера.
#include <MsTimer2.h>
void flash_led() //обработчик прерывания
{
digitalWrite(13, HIGH);
delay(30); //длительность импульса
digitalWrite(13, LOW) ;
}
void setup()
{
pinMode(13,OUTPUT);
MsTimer2::set(30000, flash_led); // будет срабатывать каждые 30сек.
MsTimer2::start(); //включить таймер
}
void loop()
{
//здесь может быть Ваш код
}
Re: Прерывания в Arduino.
Цитата:
Сообщение от
Chip
Возьми пример с MsTimer2
Спасибо огромное, по моему то что нужно....