Firmware                                                                        Laatste wijziging 2023-12-29
 
In het kort:
Enkele opmerkingen over de Arduino firmware.
Zie ook de opmerkingen over de Ontwikkel omvingen die ik gebruik. Je kunt de broncode daar ook downloaden.


Bob Control.

Het meeste werk wordt gedaan in in de timer interrupt routine ISR (TIMER1_COMPA_vect) die in een 10 kHz tempo aangeroepen wordt.
In opvolgende aanroepen (timeslices) worden de 6 analoge kanalen geconverteerd, zodat we 1.66 kHz sample frequentie hebben. We doen 8-bit conversies. De A/D waardes worden niet bewerkt, ze gaan zo naar de OutMessageBuffer

In de state-machine   switch (State) { ....... } doet het belangrijkste werk.
Het centrum signaal is op halve schaal als de Bob ver weg is. Als de Bob nadert stijgt het signaal eerst en gaat dan snel door het halve schaal nivo als de Bob precies over het centrum van de spoel gaat. Terwijl dit gebeurt wordt het signaal gevolgd, de piekwaarde en de passertijd sinds de vorige halve zwaai worden vastgelegd en de PositionCounter wordt op 0 gezet om een nieuwe sequentie te beginnen voor de timen van o.m. de aandrijfpuls.

Het signaal van de Randspoel stijgt ook als de Bob nadert, maar het heeft z'n piek waarde als de Bob er overheen gaat. We volgen dat signaal terwijl het stijgt, en als het weer daalt wordt dat moment vastgelegd als de passer tijd. De behaalde piek-waarde wordt ook vastgelegd.
De tweede Rand passage gaat net zo, alleen is het signaal nu dalend.

Voor het detecteren van de spoel signalen moeten we soms wachten tot de aandrijfpuls is gegeven, want die induceert een spanning in die spoelen en dat zou het detectie proces verstoren. Er zijn ook timing waarden die, als ze bereikt worden zonder dat er een passage gevonden is reden is om een "gemist" rapportage te doen.

De loop () functie roept frequent de functie Update_Messges () aan. Die checkt of er een bericht van het PC-programma is (de GUI) en zoja, analyseert dat bericht, en maakt een nieuw bericht terug aan. Dit gebeurt in een 10 Hz tempo, bepaald door de GUI.
 
Sommige functies kunnen niet vanuit een interrupt handler aangeroepen worden. In dat geval wordt er in de interrupt handler een vlggetje gezet en in loop () wordt daarop getest.

Functies i.v.m. Battery management worden nog niet gebruikt en zijn ook nog niet getest.