mám na robotovi kvadraturní enkodér a pomocí pulse counter periferie na ESP32 z něj dostávám absolutní pozici. Funguje to výborně .
Teď ale chci podle signálu z enkodéru řídit rychlost rotace a narazil jsem na problém s rozlišením enkodéru. Pro řízení ve větších rychlostech plánuju vzorkovat v pravidelných intervalech a rychlost odhadovat jako rozdíl pozice z enkodéru děleno čas mezi vzorky. To ale bude fungovat rozumně jenom dokud bude v jednom vzorkovacím intervalu dost tiků z enkodéru aby se zprůměrovaly chyby vzorkování, nerovnoměrné délky úseků na kolečku enkodéru...
Rozlišení mám přibližně 0.4mm ujetých na tik, rád bych měl rozumně hladké řízení přibližně k rychlosti kolem 1mm/s. To vychází ~2.2Hz frekvence tiků.
Co mě zatím napadlo:
- V nízkých rychlostech to prostě nebude fungovat, se stim smiř.
- Snížit vzorkovací frekvenci někam k 1Hz. To mi přijde nepoužitelně pomalé.
- Při nízké rychlosti se přepnout na měření času mezi změnami hodnoty enkodéru, rychlost odhadovat jako 1 / čas od posledního tiku. Tady ale nevím jak řešit zastavení, protože v takovém případě by mi přestaly chodit aktualizace rychlosti úplně a rychlost by zůstala zaseknutá na nějaké poslední nenulové hodnotě. Navíc tohle bude potenciálně komplikované kvůli konfiguraci MCU (ale dalo by se to zvládnout).
- Průběžně prodlužovat vzorkovací interval, aby mezi dvěma vzorky bylo vždy aspoň pár tiků. Problém je, že když pak šlápnu na plyn, tak bude trvat celý jeden dlouhý interval než se objeví zpětná vazba na změnu vstupu.
- Vzorkovat na stále stejné vysoké frekvenci, ale rychlost nějak vyhlazovat aby "hromada nul, sem tam jednička" dalo skutečnou rychlost. Tady nevím jaké vyhlazování použít, aby se zachovala rychlá reakce na změny. Moje oblíbené exponenciální vyhlazování asi ne? Možná by šlo použít nějaký trik s průměrováním přes tiky enkodéru místo přes čas.
- Nějaká kombinace?
Ve té základní rychlé variantě jsem chtěl nad tou rychlostí mít PI regulátor a aktualizovat ho při každém vzorku. Pokud bych vybral některou z těch pomalejších verzí, je lepší nápad zpomalovat i aktualizace regulátoru, nebo ho nechat běžet stále stejně a jenom mu dávat několikrát za sebou stejné odhady rychlosti?