Тед
Сб 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
Луча
http: // форум.Ардуино.CC/INDEX.PHP?Тема = 299311.0
Для более точности вы можете использовать внешний сигнал GPS PPS TTL, чтобы запрягать цикл.
У Dan Drow есть заметки о некоторых из модулей с высокой точностью такта, которые также можно использовать, если GPS не используется (в помещении и т. Д.)
http: // блог.Дан.тонуть.org/rtc-comparison
Луча
Тед
Солнце 09 декабря 2018 12:06
Почти там
Он работает с аналоговым вводом PA6, но у него есть проблема, чтобы заставить его работать с цифровым PB12
Он работает с аналоговым вводом 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 ... от-фан
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, когда я отделяю входы.
Последний он работает почти нормально - задержка с длиной задержки, около 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
Тед
Солнце 09 декабря 2018 г., 19:30
Спасибо за ссылку, это поможет понять, что я делаю