Помогите решить проблему с тахометром.
- Войдите на сайт для отправки комментариев
Пытаюсь сделать себе на велосипед тахометр на ардуино нано и 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.