Помогите решить проблему с тахометром.
- Войдите на сайт для отправки комментариев
Пытаюсь сделать себе на велосипед тахометр на ардуино нано и 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); } }
А разве у ардуины nano питание 3,1 - 4 В? Не понимаю, что значит "Частоту задаю генератором собранным на NE555."
Было бы понятнее если бы схему подключения нарисовали. А то так не понятно как и что к чему подключали.
Если при 5v работает стабильно, то можно стабилизатор напряжения сделать..
Схему могу только от руки, извиняйте :). Ардуино нано прекрасно работает от 3вольт, несмотря на кварц 16МГц, и в слип режиме потребляет всего 180мкА. Блин как сюда вставитт картинку? А если словами, то на вход uln подаются импульсы от NE555. С выхода uln сигнал идет на вход внешнего прерывания int1, который в свою очередь через 10кОм резистор подтянут к питанию. От входа int1 еще подключен светодиод с резистором 100 Ом к питанию. Вот и вся схема, даааа стабилизатор питания на 5в выпаян из нано.
Все оказалось просто. Убрал светодиод с резистором со входа int1.