Sida 1 av 1

Enklare tidtagning för en grej, tips?

Postat: 13 mars 2019, 00:51:40
av Henry
Har en turbopump som använder sig av 3 hallsensorer för styrning av motorn men en av dessa sensorer har lämnat in så pumpen går bara upp till 65%. Det går inte att komma åt kortet som dessa sensorer sitter på för att byta ut den felaktiga utan att behöva plocka isär hela pumpen men då måste en balansering av hela pumpen till som kostar runt en 5000:- vilket inte är speciellt lockande. Billigare då med tex en ATTiny10 eller dylik som är liten och som kan fixa den saknade pulsen baserat på tiden det tar mellan de andra sensorerna var planen.

Jag har med lite besvär åtkomst till kablarna till sensorerna och tycker att det utan problem borde gå att fixa till den saknade signalen mha de andra två eller tom bara en av sensorerna.


Mina högst underutvecklade programtankar går då så här:
När sensor 1 går hög kolla vad millis står på.

Samma mikrosekund sensor 1 blir låg kolla vad millis står på nu.

Alternativt: samma mikrosekund som sensor två går hög kolla vad millis står på nu.

Beräkna tiden mellan dessa två värden och håll utgång X hög denna mängd av tid.

När sensor 1 går hög igen (alternativt efter att tiden gått ut, vet ej om de är samma) går utgång X låg och allt upprepas.
Så tänkt principiell kod:

Kod: Markera allt

if digitalRead(1, HIGH) { (om sista sensorn före den som havererat går hög)

tid_start = millis  (registrera vad tiden är nu)
}

if digitalRead(1, LOW) { (när sensorn går låg) 

tid_slutet = millis  (kolla vad tiden är nu)

Beräkna hur lång tid det gick mellan tid_start och tid_slut och 
håll utgång X hög den tiden som det tog. (får dock bara inte ihop denna mening kodmässigt)

Utgång X = LOW (kanske inte behövs men för säkerhets skull kanske)
}
Dock måste nog digitalRead(1, HIGH) förekomma före LOW annars flippar nog turbokontrollern ut. Ett annat alternativ till principkod skulle då ev kanske kunna vara nedan högst liknande:

Kod: Markera allt

if digitalRead(1, HIGH) { (om första sensorn går hög)

tid_start = millis  (registrera vad tiden är nu)
}

if digitalRead(2, HIGH) { (när andra sensorn går hög oavsett om den andra gått låg eller ej) 

tid_slutet = millis  (kolla vad tiden är nu)

Beräkna hur lång tid det gick mellan tid_start och tid_slut och 
håll utgång X hög den tiden som det tog. (får dock bara inte ihop denna mening kodmässigt)

Utgång X = LOW (kanske inte behövs men för säkerhets skull)
}
På ovan vis kan det då bara detekteras på rätt sätt, tror jag, samt få exakt tid mellan varje sensor detektering då jag inte vet om tiden mellan av och på för en sensor är den samma som mellan 2 sensorer.

Allt detta är nu säkert skitenkel kod men jag får bara inte ihop det sista. Vet iof inte heller om resten av kodprincipen hade funkat som tänkt, inte rakt av förstås men i det grova stora.

Tips, idéer?

Re: Enklare tidtagning för en grej, tips?

Postat: 13 mars 2019, 07:06:27
av Icecap
Jag hade tagit en PLL och kopplat till en av de OK signaler och sedan stegat upp frekvensen till en högre som sedan kördes genom en state-mashine (en räknare + grindar) och saken var biff.

Kolla på 4046 CMOS logisk krets.

Re: Enklare tidtagning för en grej, tips?

Postat: 13 mars 2019, 09:54:26
av Henry
Jo något sådant hade ju visserligen också kunnat fungera, men problemet är tyvärr dock att det är extremt lite plats och jag vill helst ha allt inne i pumpen. Bara tex en liten SOIC hade inte fått plats men allt mindre hade så som tex en ATTiny10 och den borde också utan problem kunna köra en sådan här enkel kod. Kanske då med en mikro kristalloscillator och inte den interna för lite bättre noggrannhet eller nåt även om jag inte tror det är nödvändigt som så.


Edit: jag tror jag kan få ihop detta själv, så svårt är det ju liksom inte. Man skall inte hålla på med programmering kl 1 på morgonen när man är trött, kunde bara inte få ihop något för det stod helt still men nu funkar det bra bättre där uppe.

Edit2: hittade av en slump pulseIn() som jag inte hade en aning om existerade och som ju gör det hela nästan för enkelt, men får gå för denna gång då jag egentligen inte kan lägga ned för mycket tid på detta.