Ты бы лучше описал для чего тебе это нужно, возможно что уже давно все написано
Ты бы лучше описал для чего тебе это нужно, возможно что уже давно все написано
хочу попробовать сделать коммутатор на скутер, суть такова:
1. считать импульс с датчика Холла
2. запустить таймер с учетом количества оборотов, прока что будет без ФУОЗ
3. при срабатывании таймер выдать искру, ну и все по новой.
Главное чтобы это все не тормозило основную программу, вот и подумал сделать через прерывания. Уже что-то началось получаться![]()
А длительность импульса зачем измерять?
Вот на основе этого скетча можно сделать то что тебе нужно
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;
}
Последний раз редактировалось Chip; 11.03.2012 в 16:45.
1. этот код работает от 250Гц, это меня не устраивает
2. мне длительность импульса не надо мерить, мб я не совсем точно объяснил. вот что мне надо в идеале:
а. ловим импульс от датчика (пока что буду ловить по спаду)
б. в зависимости от количества оборотов на данный момент запустить таймер
в. когда таймер сработает он должен выдать коротко временный импульс и выключиться
Этот код работает от 4Гц
т.е. получается для статистики (т.е. для тахометра) достаточно измерить длину импульса.. спасибо за подсказку, не догадался
Гораздо точнее будут показания если измерять частоту, в моем примере как раз частота и измеряется
Доброго времени Уважаемый Chip, я новичёк в прогрммировании *duino, и уперся в прерывния, есть такая задача зажигать СД на 6-50 мс (регулируется переменником) с паузой 5-60 сек (регулируется другим переменником), значения выводятся на LCD я сделал это с помощью delay, но проц виснит если пауза дольше 30ти сек и вывод на LCD опаздывает (как и регулировка) на длину этих delay, начал копать и до капал до прерыванию по таймеру, но не могу найти хоть что либо похожее под мою ситуацию для примера... Вы не могли бы на брасать хотябы принцип, буду очень благодарен...
Возьми пример с 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()
{
//здесь может быть Ваш код
}
Последний раз редактировалось Chip; 19.06.2012 в 00:13.
Эту тему просматривают: 2 (пользователей: 0 , гостей: 2)