Turinys:

Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais: 3 žingsniai
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais: 3 žingsniai

Video: Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais: 3 žingsniai

Video: Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais: 3 žingsniai
Video: Review of DPS5020 50V 20A DC Buck converter with PC USB and Mobile app software | WattHour 2024, Liepa
Anonim
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais
Aukštos skiriamosios gebos PWM signalų generavimas RC servos su STM32 įrenginiais

Šiuo metu kuriu RC siųstuvą/imtuvą pagal SX1280 RF mikroschemą. Vienas iš projekto tikslų yra tai, kad noriu 12 bitų servo rezoliucijos nuo lazdų iki servo. Iš dalies todėl, kad šiuolaikiniai skaitmeniniai servo įrenginiai turi 12 bitų skiriamąją gebą, antra, aukščiausios klasės siųstuvas vis tiek naudoja 12 bitų. Aš tyrinėjau, kaip galiu sukurti didelės skiriamosios gebos PWM signalus STM32 įrenginiuose. Šiuo metu prototipui naudoju juodą piliulę (STM32F103C8T8).

1 žingsnis: dalių sąrašas

Techninė įranga

  • Bet kokia STM32F103 kūrimo plokštė (mėlyna piliulė, juoda piliulė ir kt.)
  • USB maitinimo blokas kaip maitinimo šaltinis
  • STM32 programuotojas („Segger j-links“, ST-LINK/V2 arba tiesiog st-link klonas)

Programinė įranga

  • STM32CubeMX
  • „Atollic TrueSTUDIO“, skirtas STM32
  • Projekto šaltinis iš „github“

2 žingsnis: akivaizdus sprendimas

Akivaizdus sprendimas
Akivaizdus sprendimas
Akivaizdus sprendimas
Akivaizdus sprendimas
Akivaizdus sprendimas
Akivaizdus sprendimas

Tikriausiai lengviausias sprendimas yra naudoti vieną iš laikmačių, galinčių generuoti PWM signalus, pvz., TIM1-3 ant STM32F103. Šiuolaikinio skaitmeninio servo kadrų dažnis gali sumažėti iki maždaug 5 ms, tačiau senos analoginės servo atveju jis turėtų būti 20 ms arba 50 Hz. Taigi, kaip blogiausią scenarijų, sugeneruokime tai. Turėdami 72 MHz laikrodį ir 16 bitų laikmačio skaitiklio skiriamąją gebą, turime nustatyti laikmačio išankstinį mastelį iki mažiausiai 23, kad padengtume 20 ms kadrų dažnį. Aš pasirinkau 24, nes tada 20 ms turiu tiksliai nustatyti skaitiklį iki 60000. Ekrano kopijose galite pamatyti „CubeMX“sąranką ir sugeneruotus 1 ir 1,5 ms PWM signalus. Deja, 1 ms laikmačio skaitiklis turėtų būti nustatytas į 3000, o tai suteiktų mums tik 11 bitų skiriamąją gebą. Neblogai, bet tikslas buvo 12 bitų, tad pabandykime ką nors kita.

Žinoma, jei pasirinkčiau mikrovaldiklį su 32 bitų laikmačio skaitikliu, pvz., STM32L476, ši skiriamoji geba gali būti daug didesnė ir problema būtų išspręsta.

Bet čia norėčiau pasiūlyti alternatyvų sprendimą, kuris dar labiau padidins skiriamąją gebą net ir STM32F103.

3 žingsnis: aukštesnės skiriamosios gebos kaskadiniai laikmačiai

Aukštesnės skiriamosios gebos kaskadiniai laikmačiai
Aukštesnės skiriamosios gebos kaskadiniai laikmačiai
Aukštesnės skiriamosios gebos kaskadiniai laikmačiai
Aukštesnės skiriamosios gebos kaskadiniai laikmačiai
Aukštesnės skiriamosios gebos kaskadiniai laikmačiai
Aukštesnės skiriamosios gebos kaskadiniai laikmačiai

Pagrindinė ankstesnio sprendimo problema yra ta, kad kadrų dažnis (20 ms) yra palyginti didelis, palyginti su faktiškai generuojamu PWM signalu (nuo 1 iki 2 ms), todėl laukdami likusių 18 ms eikvojame kai kuriuos vertingus bitus. kitą kadrą. Tai galima išspręsti pakopiniais laikmačiais, naudojant sinchronizavimo laikmačio nuorodos funkciją.

Idėja yra ta, kad aš naudosiu TIM1 kaip pagrindinį, kad sugeneruočiau kadrų dažnį (20 ms), o TIM2, TIM3, kad galėčiau susidoroti su PWM signalais kaip vergai. Kai šeimininkas paleidžia vergus, jie generuoja PWM signalą tik vieno impulso režimu. Todėl šiuose laikmačiuose man reikia tik 2 ms. Laimei, jūs galite kaskaduoti tuos laikmačius aparatinėje įrangoje, todėl šiam sinchronizavimui nereikia jokio procesoriaus įsikišimo, jis taip pat yra labai tikslus, nervingumas yra ps srityje. „CubeMX“sąranką galite pamatyti ekrano kopijose.

Kaip matote, aš pasirinkau 3 kaip išankstinį skalę, todėl 2 ms turiu nustatyti 48000 laikmačio skaitiklyje. Tai suteikia mums 24000 1 ms, o tai iš tikrųjų yra tai, ko mums reikia 14 bitų skirčiai. Tadaaaa…

Norėdami pamatyti galutinį rezultatą, pažvelkite į įvado osciloskopo ekrano kopijas. 3 kanalas (purpurinis) yra pagrindinio laikmačio pertraukimas, dėl kurio tepalai sugeneruos vieną impulsą. 1 ir 4 kanalas (geltona ir žalia šviesa) yra faktiniai PWM signalai, kuriuos generuoja skirtingi laikmačiai. Atkreipkite dėmesį, kad jie sinchronizuojami, tačiau yra sinchronizuojami galiniuose kraštuose, tai yra dėl PWM režimo 2. Tai nėra problema, nes konkretaus servo PWM dažnis vis tiek yra teisingas.

Kitas šio sprendimo privalumas yra tas, kad pakeitus kadrų dažnį, būtų pakeistas tik TIM1 laikotarpis. Naudodami šiuolaikinius skaitmeninius servoservis galite nusileisti net iki 200–300 Hz, tačiau, jei norite tiksliai sureguliuoti, perskaitykite servo vadovą.

Rekomenduojamas: