Тахометр на основе Леонардо?

Я здесь новый. Я не носитель языка, поэтому прошу прощения за мой английский.

Я только что получил мой Ардуино Леонардо сегодня. Я пробовал некоторые базовые вычисления и такие вещи, как моргание и ЖК-интерфейс. Это интересно.

Теперь я пытаюсь сделать тахометр с Леонардо. Я следую этому учебнику .

Я думаю, что доска, которую они использовали, отличается от Arduino Leonardo (т. е. контакт 3 - это interrupt0 в Leonardo, но это pin 2 на плате Arduino Uno, используемом в учебнике). Я попытался изменить контакты на программе и снова подключить схему, но она не работает.

Circuit

Это код из учебника:

/* Optical Tachometer
 *
 * Uses an IR LED and IR phototransistor to implement an optical tachometer.
 * The IR LED is connected to pin 13 and ran continually.
 * Pin 3 (interrupt 0) is connected across the IR detector.
 *
 * Code based on: www.instructables.com/id/Arduino-Based-Optical-Tachometer/
 * Coded by: arduinoprojects101.com
 */

int ledPin = 13; // IR LED connected to digital pin 13
volatile byte rpmcount;
unsigned int rpm;
unsigned long timeold;
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers of the interface pins
LiquidCrystal lcd(7, 8, 9, 10, 11, 12);

void rpm_fun() {
  //Each rotation, this interrupt function is run twice,
  //so take that into consideration for calculating RPM
  //Update count
  rpmcount++;
}

void setup() {
  lcd.begin(16, 2); // intialise the LCD
  //Interrupt 0 is digital pin 2, so that is where the IR detector is connected
  //Triggers on FALLING (change from HIGH to LOW)
  attachInterrupt(0, rpm_fun, FALLING);
  //Turn on IR LED
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, HIGH);
  rpmcount = 0;
  rpm = 0;
  timeold = 0;
}

void loop() {
  //Update RPM every second
  delay(1000);
  //Don't process interrupts during calculations
  detachInterrupt(0);
  //Note that this would be 60*1000/(millis() - timeold)*rpmcount if the interrupt
  //happened once per revolution instead of twice. Other multiples could be used
  //for multi-bladed propellers or fans
  rpm = 30*1000/(millis() - timeold)*rpmcount;
  timeold = millis();
  rpmcount = 0;
  //Print out result to LCD
  lcd.clear();
  lcd.print("RPM=");
  lcd.print(rpm);
  //Restart the interrupt processing
  attachInterrupt(0, rpm_fun, FALLING);
}

Может ли кто-нибудь помочь мне исправить проект? Кто-нибудь здесь пробовал этот проект раньше?

Спасибо!

3 голоса | спросил x0x 10 J000000Thursday14 2014, 19:39:26

1 ответ


0

Во-первых, убедитесь, что ваши ЖК-процедуры и проводка работают, пытаясь отобразить что-то на нем.

Во-вторых, код неверен - он будет иметь некоторые колебания от одного измерения к другому.

Один из способов сделать это - начать отсчет времени только после того, как наступил первый импульс, и остановить синхронизацию только после того, как последний импульс прошел.

Что-то вроде этого.

Пока не упасть.   Время 0 - миллис ()   В то время как для N импульсов пройти   Time0 - миллис () минус time0.

Теперь между time0 и N вы можете рассчитать свои обороты.

edit: вот приведенный выше код на работе, запустив Arduino на PIC24.

 введите описание изображения здесь>> </a> </p>

<p> входной сигнал 10 Гц, 1 импульс на оборот -> aka 600 об /мин. </p>

<p> Как вы можете видеть, отсчет rpm составляет ровно 600 об /мин. Я запускаю код с 8x передискретизацией. </p>

<p>, как я указывал ранее, ваш код вводит неопределенность, равную одному периоду для импульсов. Таким образом, при одном измерении импульсов частота вращения может составлять от 0,5x от истинного значения до 1,0x от истинного значения. </p></body></html>

ответил dannyf 5 J000000Wednesday17 2017, 18:32:13

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132