2 varvräknarfunktioner i samma Arduino.
Postat: 6 augusti 2015, 12:31:45
För något år sedan tillverkade jag varvräknare till 2 motorer. En till varje motor med separata displayer. Jag har nu byggt om lite och tänker använda en liten OLED som är gemensam för 2 motorer.
För att göra det enkelt och billigt så använder jag en Uno-klon. Den har 2 st pinnar för interrupt on change. Min fundering är att om motorerna går på relativt samma varvtal så finns ju risken att interrupt inträffar samtidigt eller i alla fall ett interrupt ramlar in just när man räknar upp det andra.
Ideér och tankar om detta?
Programmet är gjort för en motor men det vore ju enkelt att kopiera in samma rutin för den andra pinnen och skriva RPM på displayens andra rad.
För att göra det enkelt och billigt så använder jag en Uno-klon. Den har 2 st pinnar för interrupt on change. Min fundering är att om motorerna går på relativt samma varvtal så finns ju risken att interrupt inträffar samtidigt eller i alla fall ett interrupt ramlar in just när man räknar upp det andra.
Ideér och tankar om detta?
Programmet är gjort för en motor men det vore ju enkelt att kopiera in samma rutin för den andra pinnen och skriva RPM på displayens andra rad.
Kod: Markera allt
#include "U8glib.h"
U8GLIB_SSD1306_128X64 u8g(U8G_I2C_OPT_NONE);
volatile byte revolutionsA;
unsigned int rpm;
unsigned long timeold;
void draw(void) {
u8g.setFont(u8g_font_unifont);
u8g.setPrintPos(20, 20);
u8g.print("SB ");
u8g.setPrintPos(40, 20);
u8g.print(rpm, DEC);
u8g.setPrintPos(80, 20);
u8g.print("rpm");
}
void setup()
{
attachInterrupt(0, rpm_SB, RISING);
revolutionsA = 0;
rpm = 0;
timeold = 0;
}
void loop()
{
if (revolutionsA >= 20) {
rpm = 30*1000/(millis() - timeold)* revolutionsA;
timeold = millis();
revolutionsA = 0;
}
u8g.firstPage();
do {
draw();
} while( u8g.nextPage() );
}
void rpm_SB()
{
revolutionsA++;
}
//-----------------------------------------------