Помогите решить проблему с тахометром.

skodec
Offline
Зарегистрирован: 26.07.2015

Пытаюсь сделать себе на велосипед тахометр на ардуино нано и oled дисплее. Код написал проверил работает. Проверял когда подключен через юсб, показания совпадают с действительными. Подключаю через регулируемый  блок питания и обнаруживаю такую вещь. При напряжении питания в диапазоне 3.1в - 4в (планировал питать от одной акб er14250 3.6в) показания завышаются практически в 2 раза. Я так понимаю это из-за несовпадения лог уровней. На входе  стоит uln2003, а вход внешнего прерывания подтянут к питанию. Частоту задаю генератором собранным на NE555.  Может стабилитрон поставить 3вольта на питание, но это я так понимаю лишние потери батарейки. Подскажите или укажите как решить такую проблему. Заранее благодарен.



#include <avr/interrupt.h>
#include <MsTimer2.h>
#include <SPI.h>
#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
// If using software SPI (the default case):
#define OLED_MOSI   9
#define OLED_CLK   10
#define OLED_DC    11
#define OLED_CS    12
#define OLED_RESET 7
Adafruit_SSD1306 display(OLED_MOSI, OLED_CLK, OLED_DC, OLED_RESET, OLED_CS);

#define XPOS 0
#define YPOS 1
#define DELTAY 2

#if (SSD1306_LCDHEIGHT != 64)
#error("Height incorrect, please fix Adafruit_SSD1306.h!");
#endif


volatile int count3=0;          //счетчик переполнения таймера
volatile unsigned int tah=0;   // счетчик прерываний от внешнего входа 

void taho()
{
  tah++;
}
void frq()                     // программа выбора положения курсора на дисплее
{
  if(tah>9999)
{
  display.setCursor(30,28);
 display.println("ERR");
}
 if(tah>=1000 && tah<=9999)
{
  display.setCursor(18,28);
  display.println(tah);
}
if(tah<1000 && tah>=100)
{
  display.setCursor(30,28);
  display.println(tah,1);
}
if(tah<100 && tah>=10)
{
  display.setCursor(42,28);
 display.println(tah,1);
}
if(tah<10)
{
  display.setCursor(60,28);
  display.println(tah,1);
} 
}
void tim()                 // программа обработки прерывания таймера2 через каждые 25мс
{
  count3++;  
}

void setup() {
  Serial.begin(9600);
  MsTimer2::set(25, tim);        //инициализируем и настраиваем таймер2 на прерывание через каждые 25мс
  pinMode(6, OUTPUT); 
  digitalWrite(6,HIGH);
 delay(1);
 display.begin(SSD1306_SWITCHCAPVCC);
  display.clearDisplay();
  delay(5);
   MsTimer2::start(); 
  attachInterrupt(1,taho, FALLING);
}

void loop()
{
  if(count3>=40)           // если насчитали 1 секунду
    {
    detachInterrupt(1);
    display.clearDisplay();
    display.setTextSize(2);
    display.setTextColor(WHITE);
    display.setCursor(40,1);
    display.println("TAHO");      
    display.setTextSize(4); 
     frq();
    display.display();
    count3=0;    
    tah=0; 
    attachInterrupt(1,taho, FALLING);   
    }
}

 

gena
Offline
Зарегистрирован: 04.11.2012

   А разве у ардуины nano питание 3,1 - 4 В? Не понимаю, что значит "Частоту задаю генератором собранным на NE555." 

Zhigalo_Alexey
Offline
Зарегистрирован: 11.07.2015

Было бы понятнее если бы схему подключения нарисовали. А то так не понятно как и что к чему подключали.

Если при 5v работает стабильно, то можно стабилизатор напряжения сделать.. 

skodec
Offline
Зарегистрирован: 26.07.2015

Схему могу только от руки, извиняйте :). Ардуино нано прекрасно работает от 3вольт, несмотря на кварц 16МГц, и в слип режиме потребляет всего 180мкА. Блин как сюда вставитт картинку? А если словами, то на вход uln подаются импульсы от NE555. С выхода uln сигнал идет на вход внешнего прерывания int1, который в свою очередь через 10кОм резистор подтянут к питанию. От входа int1 еще подключен светодиод с резистором 100 Ом к питанию. Вот и вся схема, даааа стабилизатор питания на 5в выпаян из нано.

 

skodec
Offline
Зарегистрирован: 26.07.2015

Все оказалось просто. Убрал светодиод с резистором со входа int1.