Ви не увійшли.
Здравствуйте, помогите пожалуйста с кодом для обработки датчика Холла(измеряю частоту вращения вала, в диапазоне 5-40 тыс.об./мин.). Есть Ардуино Уно, необходимо преобразовать сигнал с двух датчиков Холла, и есть вот такой пример кода:
#include <MsTimer2.h> //библиотека таймера
unsigned int state=0;
unsigned int rmp=0;
unsigned int time=0;
unsigned long timpause=1000; // 1c
void flash() //обработка прерывания таймера
{
detachInterrupt(0); //остановить прерывания 2
Serial.print("rmp:");
Serial.println(rmp*60);
rmp=0;
attachInterrupt(0, blink, RISING ); //вкл 2 прерывания
}
void setup() {
Serial.begin(9600);
attachInterrupt(0, blink, RISING ); //прерывания на 2м порту - с датчика холла
MsTimer2::set(1000, flash); // 1 c
MsTimer2::start(); //включаем прерывания по таймеру
}
void loop() { }
void blink() //прерывания с датчика холла
{
++rmp; //увеличиваем счетчик на 1
}
Необходимо подогнать его под 2 датчика Холла, по всякому уже пробовал менять код, но ничего не получилось, прошу помощи, очень нужно.
Еще есть пример, который работал на DUE, но на 16 мГц платах этот скетч измеряет частоту вращения только до частоты 545 Гц (32640 тыс.об/мин), потом выдает минусовые значения.
volatile int rpmcount = 0;
int rpm = 0;
unsigned long lastmillis = 0;
float rpm2 = 0;
int rrr = 1;
void setup(){
Serial.begin(9600);
attachInterrupt(0, rpm_fan, FALLING);//interrupt cero (0) is on pin two(2).
}
void loop(){
if (millis() - lastmillis == 1000){ /*Uptade every one second, this will be equal to reading frecuency (Hz).*/
detachInterrupt(0); //Disable interrupt when calculating
rpm = rpmcount * 60;
rpm2 = rpm *(rrr);/* Convert frecuency to RPM, note: this works for one interruption per full rotation. For two interrups per full rotation use rpmcount * 30.*/
Serial.print("RPM =\t"); //print the word "RPM" and tab.
Serial.print(rpm); // print the rpm value.
Serial.print("\t Hz=\t"); //print the word "Hz".
Serial.println(rpmcount); /*print revolutions per second or Hz. And print new line or enter.*/
rpmcount = 0; // Restart the RPM counter
lastmillis = millis(); // Uptade lasmillis
attachInterrupt(0, rpm_fan, FALLING); //enable interrupt
}
}
void rpm_fan(){ /* this code will be executed every time the interrupt 0 (pin2) gets low.*/
rpmcount++;
}
Помогите пожалуйста, буду очень благодарен
Остання редакція plaztik (2016-04-11 15:58:50)
Неактивний
этот пример некорректный
в основном цикле отключение прерываний,
посмотрите на
https://arduino-info.wikispaces.com/Timers-Arduino
наиболее простой вариант
2 прерывания на ваши датчики
таймер настроен на счет UP
при поступлении interrupts от датчика сохраняете текущее значения счетчика таймера
при переполнении таймера в значение времени добавляете разницу от размерности счетчика и записанного значения счетчика при прерывании
при поступлении следующего прерывания к времени с учетом переполнения если было ) добавляете время текущего значения счетчика
ну и признак какой то поставьте что пришел сигнал
надеюсь не запутал )
думаю что то подобное должно быть реализовано примерах для IR пульта, попробуйте там поискать
и никаких отключений прерываний в рабочем цикле!
поищите что то должно быть
ключевые слова
Arduino Timer Interrupts
timer overflow interrupt
быстрый просмотр сети не дал готового решения, но уверен что что то похожее должно быть )
Неактивний
базовый принцип
код в переполнении счетчика
TimePeriod += 0x10000 - HARDWARE_TIMER_COUNT_Start; HARDWARE_TIMER_COUNT_Start = 0;
0x10000 - максимальное значения счетчика, 0x10000 для максимума 0xFFFF
void Begin ( void )
{
HARDWARE_TIMER_COUNT_Start = HARDWARE_TIMER_COUNT;
TimePeriod = 0;
}
void End ( )
{
// если было переполнение то HARDWARE_TIMER_COUNT_Start = 0
TimePeriod += ( HARDWARE_TIMER_COUNT - HARDWARE_TIMER_COUNT_Start);
TimePeriod_pulse = TimePeriod;
// начало для следующего испульса
HARDWARE_TIMER_COUNT_Start = HARDWARE_TIMER_COUNT;
TimePeriod = 0;
}
Begin при старте
в прерывании от сетчика End вызывайте, там уже реализован сброс для следующего импульса
запустите для одного, второй разберетесь
TimePeriodExecuted - время между импульсами
HARDWARE_TIMER_COUNT_Start - значение счетчика
TimePeriod - временно значение счетчика
вариант compare пошустрее, но вам, как я написал будет проще именно такой
TimePeriod_pulse ваше время для расчета RPM
признак что есть новый импульс сами придумайте
где то так, успехов
Неактивний
этот пример некорректный
в основном цикле отключение прерываний,
посмотрите на
https://arduino-info.wikispaces.com/Timers-Arduinoнаиболее простой вариант
2 прерывания на ваши датчикитаймер настроен на счет UP
при поступлении interrupts от датчика сохраняете текущее значения счетчика таймера
при переполнении таймера в значение времени добавляете разницу от размерности счетчика и записанного значения счетчика при прерывании
при поступлении следующего прерывания к времени с учетом переполнения если было ) добавляете время текущего значения счетчика
ну и признак какой то поставьте что пришел сигнал
надеюсь не запутал )
думаю что то подобное должно быть реализовано примерах для IR пульта, попробуйте там поискать
и никаких отключений прерываний в рабочем цикле!
поищите что то должно быть
ключевые слова
Arduino Timer Interrupts
timer overflow interrupt
быстрый просмотр сети не дал готового решения, но уверен что что то похожее должно быть )
немного тяжело все сразу понять, буду пытаться найты, спасибо!
Неактивний
что то будет в проекте кроме подсчета частоты и вероятно вывод на экран?
многие библиотеки используют таймера, и могу испоганить настройку таймера
Экрана нету, пока необходимо выводить только в COM порт
Неактивний
тогда начинайте так
по примерам запускайте таймер из свободных, по хорошему мне бы это попробовать, но некогда (
сделайте чтение их регистра таймера
программная пауза в коде на ~700 Гц
это 0,0014 с
delayMicroseconds(140);
и повторное чтение -
вывод 2 результатов в порт,
пауза стандартная, дельта должена быть одинакова, если только нет перехода через сброс счетчика
если все в порядке до добавляете мой код что скидывал для одного счетчика,
запустите один канал, второй должен так же запуститься, нет сложных вычислений, и косяков алгоритма, контроллер справится
Неактивний
что то похожее есть, посмотрите на этот код
http://www.avdweb.nl/arduino/libraries/ … unter.html
вот вариант для варианта пошустрее )
https://www.pjrc.com/teensy/td_libs_FreqCount.html
Неактивний
что то похожее есть, посмотрите на этот код
http://www.avdweb.nl/arduino/libraries/ … unter.htmlвот вариант для варианта пошустрее )
https://www.pjrc.com/teensy/td_libs_FreqCount.html
Спасибо большое, очень помогла инфа! Всех благ Вам и успехов!
Неактивний