Chip , а набросай пожалуйста скетч, как считать импульсы через прерывание? Если не затруднит!
Chip , а набросай пожалуйста скетч, как считать импульсы через прерывание? Если не затруднит!
ну напишите ктонить, как считать импульсы прерываниями??????7
Импульсы от датчика холла штатного тахометра нужно подать на вход D2, желательно через оптрон или через диод (анодом к D2)
Для теста скетча предусмотрел имитацию датчика холла, на выходе D5 постоянно выходят импульсы с частотой 61Гц, для проверки этот вывод нужно соединить с выводом D2
PHP код:
//http://www.compcar.ru/forum/showpost.php?p=86448&postcount=33
//LOW — вызов прерывания по низкому уровню напряжения;
//CHANGE – прерывание вызывается при любом изменении значения на входе;
//RISING – вызов прерывания при изменении уровня напряжения с низкого (LOW) на высокий(HIGH)
//FALLING – вызов прерывания при изменении уровня напряжения с высокого (HIGH) на низкий (LOW)
#include <MsTimer2.h>
#define PinA 2
static boolean output = HIGH;
word count = 0; // счетчик импульсов
void setup()
{
Serial.begin (115200);
pinMode(5, OUTPUT); //выход ШИМ
TCCR0B = TCCR0B & 0b11111000 |5; //настроить ШИМ на частоту 61Гц
pinMode(PinA, INPUT);
digitalWrite(PinA, HIGH); // подключить подтягивающий резистор
attachInterrupt(0, int_on, RISING); // настроить прерывание interrupt 0 на pin 2
MsTimer2::set(500, flash); // таймер будет срабатывать через каждые 500ms
MsTimer2::start();//запустить таймер
}
void loop()
{
//......здесь будет код Вашей программы
analogWrite(5,10); //имитация датчика холла на пине D5
}
// обработка внешнего прерывания
void int_on()
{
count++; //увеличить счетчик
}
void flash() //обработка прерывания таймера
{
Serial.println(count*120); //посмотреть результат
count=0;//обнулить счетчик
}
Последний раз редактировалось Chip; 27.09.2011 в 08:26.
Приведенный мной выше способ подсчета оборотов простой , но имеет много минусов.
Лучше считать время между импульсами , так будет без погрешности , без инертности и без дискретности
Спасибо! мне кажется, что поргрешность будет из-за большой дискретности!!!!!! (count*120)!!!!
А вот если считать время между импульсами, то получается что , значение будет уменьшаться и совершенно не линейно!!!!! Как с этим быть?
А зачем тебе линейность этого значения? Достаточно по формуле переводить это значение в частоту и обороты
слушай эдуард, я вот еще хотел спросить, а mills() и miсros(), это один и тот же счетчик? тоесть его нельзя использовать в разных функциях, в разное время?
и сколько таких счетчиков?
Я беру данные с проводочка на тахометр!
ЗАранние спасибо!
Функции mills() и miсros() используют Timer0 контроллера
А зачем использовать обе функции вместе? достаточно использовать только miсros() 1000=miсros() это то же самое что 1=mills()
Таймеров в Atmega328 всего 3шт. Timer0, Timer1, Timer2
Спасибо! -я думал их можно в разное время исползовать!
Тоесть милс и микрос это одно и тоже, только разной длинны, и оно одно в Atmega328?
А в МЕГА ардуине сколько ?
В меге 6 таймеров
Эту тему просматривают: 4 (пользователей: 0 , гостей: 4)