[Решен] тахометр для намотки катушки

Тед
Сб 08 декабря 2018 г. 18:17
Привет
Этот код является счетчиком импульсов, я могу сосчитать полные импульсы.
Вопрос в том, как считать числа импульсы в секунду ?
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); int state = LOW; int lastState = LOW; int count = 0; void setup() { lcd.begin(16, 2); pinMode(PB12, INPUT_PULLDOWN); state = digitalRead(PB12); } void loop() { if (state == HIGH && lastState == LOW) { count++; } lastState = state; state = digitalRead(PB12); digitalWrite (PB7, HIGH); lcd.setCursor(3, 1); lcd.print(count); //delay(30); }

Mrburnette
Сб 08 декабря 2018 г., 8:17 вечера
Для использования хобби вы можете просто использовать внутренние таймеры Arduino:
http: // форум.Ардуино.CC/INDEX.PHP?Тема = 299311.0

Для более точности вы можете использовать внешний сигнал GPS PPS TTL, чтобы запрягать цикл.

У Dan Drow есть заметки о некоторых из модулей с высокой точностью такта, которые также можно использовать, если GPS не используется (в помещении и т. Д.)
http: // блог.Дан.тонуть.org/rtc-comparison


Луча

Тед
Солнце 09 декабря 2018 12:06
Почти там
Он работает с аналоговым вводом PA6, но у него есть проблема, чтобы заставить его работать с цифровым PB12
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); //this code measures the difference between two rising edges of the digitalised signal coming from hall sensor and then prints the rpm. //pin A0 is the signal pin int refsig = 200; //for converting the analog signal coming from hall sensor to digital through arduino code int val;//the digital value of the incoming analog signals int prev_val = 0; unsigned long t, cur_t; //time variables void setup() { Serial.begin(115200); lcd.begin(16, 2); //pinMode(PA6, INPUT_PULLDOWN); pinMode(PB12, INPUT_PULLDOWN); } void loop()//Measure RPM { //int sig = analogRead(PA6); //read raw value of hall sensor int sig = digitalRead(PB12); if (sig > refsig) val = HIGH; //convert it to digital 0,1 form else val = LOW; if (prev_val == 0 && val == 1) { //check for rising edge cur_t = micros(); Serial.println(1000000 * 60 / (cur_t - t)); //print the rpm lcd.setCursor(8, 1); lcd.print("RPM="); lcd.print(1000000 * 60 / (cur_t - t)); t = micros(); } prev_val = val; }

Айдахоулкер
Солнце 09 декабря 2018 г. 1:50 утра
Как насчет того, чтобы посмотреть на некоторые из частотных библиотек?

Mrburnette
Солнце 09 декабря 2018 г., 3:46
К вашему сведению...

https: // www.Google.com/search?Q = Arduino ... Ensor+Tach
===> https: // maker.Pro/arduino/turniory/как- ... Th-Adruino
Существует много типов датчиков эффекта зала, и определенные типы лучше для определенных применений. Для применений, где скорость обнаружения не является решающей, можно использовать обычные датчики эффекта зала, такие как 44E. Тем не менее, для применений, которые включают высокоскоростное обнаружение, как и в случае спидометров, должны использоваться высокочастотные датчики эффекта зала, такие как US5881 или US1881. Существует два основных типа датчиков эффекта зала: фиксация и не складывание. ИзображениеUS5881 является датчиком эффекта не снятого зала. Датчик дает выходное высокое напряжение всякий раз, когда северный полюс магнита приближается к нему, и переключается низко, когда магнит удаляется. 3144 Цифровой код ввода здесь:
https: // innernemersportal.com/blog/2018/1 ... от-фан

Тед
Солнце 09 декабря 2018 г. 5:08
Спасибо, мистер Бернетт
Последний он работает почти нормально - задержка с длиной задержки, около 5 секунд при объединении с пульсовым счетчиком, который не работает после присоединения к обеим программам IVEN, когда я отделяю входы.
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); ////////////////////////////////////////////// int state = LOW; int lastState = LOW; int count = 0; /////////////////////////////////////////////// // digital pin 2 is the hall pin int hall_pin = PB12; // set number of hall trips for RPM reading (higher improves accuracy) float hall_thresh = 100.0; void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(115200); lcd.begin(16, 2); ////////////////////////////////////////// lcd.begin(16, 2); pinMode(PB4, INPUT_PULLDOWN); state = digitalRead(PB4); ///////////////////////////////////////// // make the hall pin an input: pinMode(hall_pin, INPUT); } // the loop routine runs over and over again forever: void loop() { // preallocate values for tach float hall_count = 1.0; float start = micros(); bool on_state = false; // counting number of times the hall sensor is tripped // but without double counting during the same trip while (true) { if (digitalRead(hall_pin) == 0) { if (on_state == false) { on_state = true; hall_count += 1.0; } } else { on_state = false; } if (hall_count >= hall_thresh) { break; } } ////////////////////////////////////// if (state == HIGH && lastState == LOW) { count++; } lastState = state; state = digitalRead(PB4); digitalWrite (PB7, HIGH); lcd.setCursor(3, 0); lcd.print(count); //delay(30); /////////////////////////////////////// // print information about Time and RPM float end_time = micros(); float time_passed = ((end_time - start) / 1000000.0); Serial.print("Time Passed: "); Serial.print(time_passed); Serial.println("s"); float rpm_val = (hall_count / time_passed) * 60.0; Serial.print(rpm_val); Serial.println(" RPM"); lcd.setCursor(3, 1); lcd.print(rpm_val); //delay(1); // delay in between reads for stability }

Тед
Солнце 09 декабря 2018 г. 5:48 утра
Обе программы работают, стойко ОК, RPM DOG TIRE между чтением -5SEC.
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); ////////////////////////////////////////////// int state = LOW; int lastState = LOW; int count = 0; /////////////////////////////////////////////// // digital pin 2 is the hall pin int hall_pin = PB12; // set number of hall trips for RPM reading (higher improves accuracy) float hall_thresh = 100.0; void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(115200); lcd.begin(16, 2); ////////////////////////////////////////// lcd.begin(16, 2); pinMode(PB12, INPUT_PULLDOWN); state = digitalRead(PB12); ///////////////////////////////////////// // make the hall pin an input: pinMode(hall_pin, INPUT); } // the loop routine runs over and over again forever: void loop() { // preallocate values for tach float hall_count = 1.0; float start = micros(); bool on_state = false; // counting number of times the hall sensor is tripped // but without double counting during the same trip while (true) { if (digitalRead(hall_pin) == 0) { if (on_state == false) { on_state = true; hall_count += 1.0; } } else { on_state = false; } if (hall_count >= hall_thresh) { break; } /////////////////////////////// if (state == HIGH && lastState == LOW) { count++; } lastState = state; state = digitalRead(PB12); digitalWrite (PB7, HIGH); lcd.setCursor(3, 0); lcd.print(count); //delay(30); ///////////////////////////// } ////////////////////////////////////// /////////////////////////////////////// // print information about Time and RPM float end_time = micros(); float time_passed = ((end_time - start) / 100000.0); Serial.print("Time Passed: "); Serial.print(time_passed); Serial.println("s"); float rpm_val = (hall_count / time_passed) * 60.0; Serial.print(rpm_val); Serial.println(" RPM"); lcd.setCursor(3, 1); lcd.print(rpm_val); //delay(1); // delay in between reads for stability }

Rogerclark
Солнце 09 декабря 2018 г. 6:57 утра
[Айдахоулкер - Солнце 09 декабря 2018 г. 1:50 утра] - Как насчет того, чтобы посмотреть на некоторые из частотных библиотек?
+1

Большая часть этого может быть сделана с помощью 2 счетчиков. Один, чтобы подсчитать импульсы, а другой, чтобы указать окно измерения.

Тед
Солнце 09 декабря 2018 14:36
[Айдахоулкер - Солнце 09 декабря 2018 г. 1:50 утра] - Как насчет того, чтобы посмотреть на некоторые из частотных библиотек?
Я сделал, но не нашел хорошего.

Тед
Солнце 09 декабря 2018 14:44
[Rogerclark - Солнце 09 декабря 2018 г. 6:57] -
[Айдахоулкер - Солнце 09 декабря 2018 г. 1:50 утра] - Как насчет того, чтобы посмотреть на некоторые из частотных библиотек?
+1

Большая часть этого может быть сделана с помощью 2 счетчиков. Один, чтобы подсчитать импульсы, а другой, чтобы указать окно измерения.
Первая часть сделана, как я рассматриваю что -то подобное. #include LiquidCrystal lcd(12,11,6,5,4,3); int pwm=9; int pot=A0; float value=0; int percent; float rev=0; int rpm; int oldtime=0; int time; void isr() //interrupt service routine { rev++; } void setup() { lcd.begin(16,2); //initialize LCD attachInterrupt(0,isr,RISING); //attaching the interrupt } void loop() { delay(1000); detachInterrupt(0); //detaches the interrupt time=millis()-oldtime; //finds the time rpm=(rev/time)*60000; //calculates rpm oldtime=millis(); //saves the current time rev=0; value=analogRead(pot); //reads the speed control POT value=value/4; analogWrite(pwm,value); //sets the desired speed percent=(value/255)*100; //finds the duty cycle % lcd.clear(); lcd.setCursor(0,0); lcd.print("___TACHOMETER___cd.setCursor(0,1); lcd.print(rpm); lcd.print(" RPM"); lcd.print(" "); lcd.print(percent); lcd.print("%"); attachInterrupt(0,isr,RISING);

Тед
Солнце 09 декабря 2018 г., 17:10
Это заполняет весь ЖК -дисплей с помощью RPM = 0, начинается с одного обойдного оборота = 0 и добавьте другой каждые 1 секунду, без ответа на входной сигнал
/////////////////////////// #include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); //////////////////////////// int hallsensor = PB12; // Hall sensor at pin 2 volatile byte counter; unsigned int rpm; unsigned long passedtime; void isr() { //Each rotation, this interrupt function is run twice, so take that into consideration for //calculating RPM //Update count counter++; } void setup() { Serial.begin(9600); ///////////////////////////// lcd.begin(16, 2); // pinMode(PB12, INPUT_PULLDOWN); /////////////////////////////// //Intiates Serial communications attachInterrupt(0, isr, RISING); //Interrupts are called on Rise of Input pinMode(hallsensor, INPUT); //Sets hallsensor as input counter = 0; rpm = 0; passedtime = 0; //Initialise the values } void loop() { delay(1000);//Update RPM every second detachInterrupt(0); //Interrupts are disabled rpm = 60 * 1000 / (millis() - passedtime) * counter; passedtime = millis(); counter = 0; Serial.print("RPM="); Serial.println(rpm); //Print out result to monitor lcd.print("RPM="); lcd.print(rpm); attachInterrupt(0, isr, RISING); //Restart the interrupt processing }

Тед
Солнце 09 декабря 2018 г., 18:20
Проблема решена, теперь я могу сделать катушку 50 000 поворотов через 20 минут.
#include LiquidCrystal lcd(PA0, PA1, PA2, PA3, PA4, PA5); int hallsensor = PB12; float value = 0; int percent; float rev = 0; int rpm; int oldtime = 0; int time; void isr() //interrupt service routine { rev++; } void setup() { lcd.begin(16, 2); //initialize LCD attachInterrupt(PB12, isr, RISING); //attaching the interrupt pinMode(hallsensor, INPUT); } void loop() { delay(1000); detachInterrupt(PB12); //detaches the interrupt time = millis() - oldtime; //finds the time rpm = (rev / time) * 60000; //calculates rpm oldtime = millis(); //saves the current time rev = 0; //lcd.clear(); lcd.setCursor(0, 0); lcd.print("RPM="); lcd.print(rpm); attachInterrupt(PB12, isr, RISING); }

Mrburnette
Солнце 09 декабря 2018 г., 19:04
https: // github.com/rogerclarkmelbourne/ ... Т-хандлеры

Тед
Солнце 09 декабря 2018 г., 19:30
Спасибо за ссылку, это поможет понять, что я делаю

Новый Ham-Radio Multimode Beacon