Dankzij de vakantiedagen is er eindelijk weer wat tijd om nog enkele nieuwe zaken uit te zoeken. Eén daarvan was het integreren van een Futaba S.bus koppeling die ik in de toekomst uit kan breiden naar spectrum, enz. Hier ben ik een poos geleden al mee gestart maar nog onvoldoende aandacht gegeven om dit echt goed te integreren in het totale plaatje.
Hieronder staat een afbeelding van de testopstelling:
Inmiddels heb ik een S.Bus naar ppm convertor gemaakt met individuele digitale schakeluitgangen. Het ppm signaal en de digitale signalen zijn vervolgens weer in te lezen in de flight controller. Ook ben ik nu in staat om bij het verlies van het zendersignaal een melding te genereren voor bijvoorbeeld een return to home.
Kort samengevat is S.Bus een 100.000bps signaal dat geïnverteerd is (in rust hoog). Iedere 16ms worden er 25 bytes verzonden. Iedere byte bestaat uit: 1 startbit, 8 databits, 1pariteitsbit en 2 stopbits. Ofwel 8E2. Het verzenden van het signaal duurt hierdoor precies 3ms.
startbyte – databyte 1 – databyte 2 ….. databyte 22 – flagbyte – stopbyte
Iedere kanaal gebruikt 11 bits wat resulteert in een waarde van 0 t/m 2047. Kanaal 1 gebruikt 8 bits van databyte 1 en 3 bits van databyte 2. Kanaal 2 gebruikt 5 bits van databyte 2 en 6 van databyte 3, enz. Ieder kanaal zet ik vervolgens om in een puls van 20 t/m 2000us zoals op de afbeelding van de scope te zien is.
Scope opname van geïnverteerd S.Bus signaal en ppm signaal:
Daarnaast gebruik ik digitale uitgangen als schakelcontacten voor bijvoorbeeld auto level, gps hold, camera, verlichting, enz.
De grootste uitdaging was het 100% nauwkeurig krijgen van de pulsuitgang. Mijn streven was het ppm signaal zo nauwkeurig mogelijk te maken. Inmiddels ben ik er achter dat dit eenvoudiger lijkt dan dat het werkelijk is.
Veel taken maken bij een processor gebruik van interrupts. Bijvoorbeeld voor het registreren van tijd. Iedere 1.024us voert de processor een korte bewerking uit om de tijdregistratie en correctie uit te voeren.
Ook voor het inlezen van het S.Bus signaal gebruikt de processor interrupts. Iedere verandering op de datalijn genereert een interrupt. Iedere 10us maakt de processor een kleine uitstap om de seriële data te verwerken.
Door gebruik te maken van de tijdfuncties van de Arduino software kwam ik niet verder dan een nauwkeurigheid van ongeveer 12us. Na veel testen ben ik er achter gekomen dat de interrupts het tijdsignaal behoorlijk verstoren. Maar het lastige is dat de interrupts nodig zijn om het S.Bus signaal in te lezen en het ppm signaal te genereren.
Conclusie:
Timer0 heb ik uit gezet waardoor er geen tijdregistratie – en dus interrupts- worden gegenereerd. Na het inlezen van de seriële data zet ik ook de seriële poort uit. Hierdoor vervallen de interrupts van de seriële poort.
Nu alle interrupts inactief zijn is het mogelijk om de pulsen met een nauwkeurigheid van 2us te genereren door middel van korte programma loops. Na het afronden van het ppm signaal kan de seriële poort weer aan en wacht het programma op de volgende reeks data.
Hieronder staat een afbeelding van de testopstelling:
Inmiddels heb ik een S.Bus naar ppm convertor gemaakt met individuele digitale schakeluitgangen. Het ppm signaal en de digitale signalen zijn vervolgens weer in te lezen in de flight controller. Ook ben ik nu in staat om bij het verlies van het zendersignaal een melding te genereren voor bijvoorbeeld een return to home.
Kort samengevat is S.Bus een 100.000bps signaal dat geïnverteerd is (in rust hoog). Iedere 16ms worden er 25 bytes verzonden. Iedere byte bestaat uit: 1 startbit, 8 databits, 1pariteitsbit en 2 stopbits. Ofwel 8E2. Het verzenden van het signaal duurt hierdoor precies 3ms.
startbyte – databyte 1 – databyte 2 ….. databyte 22 – flagbyte – stopbyte
Iedere kanaal gebruikt 11 bits wat resulteert in een waarde van 0 t/m 2047. Kanaal 1 gebruikt 8 bits van databyte 1 en 3 bits van databyte 2. Kanaal 2 gebruikt 5 bits van databyte 2 en 6 van databyte 3, enz. Ieder kanaal zet ik vervolgens om in een puls van 20 t/m 2000us zoals op de afbeelding van de scope te zien is.
Scope opname van geïnverteerd S.Bus signaal en ppm signaal:
Daarnaast gebruik ik digitale uitgangen als schakelcontacten voor bijvoorbeeld auto level, gps hold, camera, verlichting, enz.
De grootste uitdaging was het 100% nauwkeurig krijgen van de pulsuitgang. Mijn streven was het ppm signaal zo nauwkeurig mogelijk te maken. Inmiddels ben ik er achter dat dit eenvoudiger lijkt dan dat het werkelijk is.
Veel taken maken bij een processor gebruik van interrupts. Bijvoorbeeld voor het registreren van tijd. Iedere 1.024us voert de processor een korte bewerking uit om de tijdregistratie en correctie uit te voeren.
Ook voor het inlezen van het S.Bus signaal gebruikt de processor interrupts. Iedere verandering op de datalijn genereert een interrupt. Iedere 10us maakt de processor een kleine uitstap om de seriële data te verwerken.
Door gebruik te maken van de tijdfuncties van de Arduino software kwam ik niet verder dan een nauwkeurigheid van ongeveer 12us. Na veel testen ben ik er achter gekomen dat de interrupts het tijdsignaal behoorlijk verstoren. Maar het lastige is dat de interrupts nodig zijn om het S.Bus signaal in te lezen en het ppm signaal te genereren.
Conclusie:
Timer0 heb ik uit gezet waardoor er geen tijdregistratie – en dus interrupts- worden gegenereerd. Na het inlezen van de seriële data zet ik ook de seriële poort uit. Hierdoor vervallen de interrupts van de seriële poort.
Nu alle interrupts inactief zijn is het mogelijk om de pulsen met een nauwkeurigheid van 2us te genereren door middel van korte programma loops. Na het afronden van het ppm signaal kan de seriële poort weer aan en wacht het programma op de volgende reeks data.
Laatst bewerkt door een moderator: