2 varvräknarfunktioner i samma Arduino.

C, C++, Pascal, Assembly, Raspberry, Java, Matlab, Python, BASIC, SQL, PHP, etc.
SeniorLemuren
Inlägg: 7812
Blev medlem: 26 maj 2009, 12:20:37
Ort: Kristinehamn

2 varvräknarfunktioner i samma Arduino.

Inlägg av SeniorLemuren »

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.

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++;   
 }
//-----------------------------------------------

ToPNoTCH
Inlägg: 4891
Blev medlem: 21 december 2009, 17:59:48

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av ToPNoTCH »

Din oror är sannolikt helt ogrundad.
För det första så är det teoretiska problemet att dina två motorer skulle komma i sådan otrolig synk, inte så realistiskt (även en 16MHz 8-Bit atmel är rätt snabb).

Även om så skulle vara fallet så hanteras varje interrupt som en separat händelse (det finns normalt en prioriteringsordning, men alla tas om hand).

Så i värsta fall så skulle rutin2 få lov att hanteras några ms senare för att du ligger i rutin1.

Det är dock viktigt att inte ha massa kod i dina interrupt rutiner. Helst enkla räknare typ.
Användarvisningsbild
Icecap
Inlägg: 26149
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av Icecap »

Det är i grunden mycket enkelt.
Först o främst måste du ha en räknare som löper konstant. Den ska ha bits nog till att INTE få overrun vid lägsta varvtalet som ska mätas och hög nog hastighet till att ha rätt upplösning.

Sedan ska varje interrupt bara läsa den timer och spara värdet i var sin variabel. Sedan sätts en flagga för aty visa main-loop att interrupten har varit aktiverat, alltså en flagga per interrupt.

Sedan kollar mainloop om flaggan är satt, är den räknas värdet ut o sparas i ytterligare en variabel för visning.
skalman23
Inlägg: 14
Blev medlem: 29 juli 2014, 10:19:38

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av skalman23 »

Har programmerat Arduino en gång och det du beskriver är inte helt enkelt att åstakomma. I alla fall inte om det skall fungera riktigt bra.
skalman23
Inlägg: 14
Blev medlem: 29 juli 2014, 10:19:38

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av skalman23 »

Har programmerat Arduino en gång och det du beskriver är inte helt enkelt att åstakomma. I alla fall inte om det skall fungera riktigt bra.
Användarvisningsbild
adent
Inlägg: 4103
Blev medlem: 27 november 2008, 22:56:23
Ort: Utanför Jönköping
Kontakt:

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av adent »

Jag vet inte om det är krångligare med Arduinomiljön än i vanlig ren C.

Men fördröjningen i interruptet blir fullständigt försumbar i förhållande till motorns varvtal.

MVH: Mikael
Användarvisningsbild
Icecap
Inlägg: 26149
Blev medlem: 10 januari 2005, 14:52:15
Ort: Aabenraa, Danmark

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av Icecap »

Skalman: jag har programmerat väldigt många olika µC och det är lätt! Men det är klart: är din erfarenhet begränsat är allting ju svårt.

Sedan var rådet riktat till SeniorLemuren som jag vet klarar biffen. Men såklart är det att allmänt råd till alla.

När interrupten kommer ska följande ske:
Tidsräknaren läsas.
Det förra värdet flyttas till "Gamla_Värdet" och den nya avläsningen sparas i "Nya_Värdet".
Sedan räknas: "Skillnaden" = "Nya_Värdet" - "Gamla_Värdet".
Sist sätts en flagga som visar att ett värde har tagits om hand.

Dessa funktioner går riktigt snabbt och har man inte en massa andra interrupts kan man få samma latency vid varje interrupt vilket ger stabila värden.

I main-loopen kollas flaggorna och är de aktiverade läser man "Skillnaden" och nollar flaggan, sedan räknar man och visar det som det kommer. Det är inte värd att uppdatera displayen mer än 3 gg/sek så man kan likaväl utjämna lite värden då osv.

Bäst är såklart att använda en Capture-enhet per motor men finns de inte då finns de inte.
BjörnO
Inlägg: 242
Blev medlem: 3 juni 2013, 19:52:42

Re: 2 varvräknarfunktioner i samma Arduino.

Inlägg av BjörnO »

Jag gör så i min varvräknare i båten. Interrupt läser millis och räknar ut tiden sedan förra interrupten. Huvudrutinen filtrerar bort orimliga värden och visar varvtalet. Den hinner också läsa av diverse temperaturer och larma vid övertemp.
Skriv svar