INHOUDSOPGAWE:

PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle: 3 stappe
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle: 3 stappe

Video: PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle: 3 stappe

Video: PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle: 3 stappe
Video: Review of 20A DC 10-60V PWM Motor Speed Controller 2024, Julie
Anonim
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle
PWM -seinopwekking met hoë resolusie vir RC -servo's met STM32 -toestelle

Tans bou ek 'n RC -sender/ontvanger gebaseer op die SX1280 RF -chip. Een van die doelwitte vir die projek is dat ek 'n 12 -bits servo -resolusie van die stokkies tot by die servo's wil hê. Deels omdat moderne digitale servo's 'n resolusie van 12 bis het, tweedens gebruik 'n hoë-end sender 12 bits. Ek het ondersoek ingestel na hoe ek PWM -seine met 'n hoë resolusie op STM32 -toestelle kan genereer. Ek gebruik tans 'n swart pil (STM32F103C8T8) vir die prototipe.

Stap 1: Onderdele lys

Hardeware

  • Enige ontwikkelingsbord van STM32F103 (blou pil, swart pil, ens.)
  • 'N USB -kragbank as kragbron
  • STM32 programmeerder (Segger j-links, ST-LINK/V2, of bloot 'n st-link kloon)

Sagteware

  • STM32CubeMX
  • Atollic TrueSTUDIO vir STM32
  • Projekbron van github

Stap 2: Die voor die hand liggende oplossing

Die voor die hand liggende oplossing
Die voor die hand liggende oplossing
Die voor die hand liggende oplossing
Die voor die hand liggende oplossing
Die voor die hand liggende oplossing
Die voor die hand liggende oplossing

Die maklikste oplossing is waarskynlik om een van die timer te gebruik wat PWM-seine kan genereer, soos TIM1-3 op 'n STM32F103. Vir 'n moderne digitale servo kan die raamtempo tot 5 ms daal, maar vir 'n ou analoog servo behoort dit 20 ms of 50 Hz te wees. Dus, as 'n ergste geval, laat ons dit genereer. Met 'n 72 MHz -horlosie en 'n 16 -bit timer -teenresolusie moet ons die voorafkalker van die timer op minimum 23 stel om die raamkoers van 20 ms te dek. Ek het 24 gekies, want dan moet ek die teller vir 20 ms presies op 60000 stel. U kan die CubeMX -opstelling en die gegenereerde 1 en 1,5 ms PWM -seine in die skermkiekies sien. Ongelukkig moet die tydteller vir 1 ms op 3000 gestel word, wat ons slegs 'n resolusie van 11 bit sou gee. Nie sleg nie, maar die doel was 12 bit, so laat ons iets anders probeer.

Natuurlik, as ek 'n mikrobeheerder met 'n 32 -bits timer -teller sou kies, soos STM32L476, kan hierdie resolusie baie hoër wees en die probleem sal opgelos word.

Maar hier wil ek 'n alternatiewe oplossing voorstel wat die resolusie selfs op die STM32F103 verder sal verhoog.

Stap 3: Timers waterval vir hoër resolusie

Deurlopende tydmeters vir hoër resolusie
Deurlopende tydmeters vir hoër resolusie
Deurlopende tydmeters vir hoër resolusie
Deurlopende tydmeters vir hoër resolusie
Deurlopende tydmeters vir hoër resolusie
Deurlopende tydmeters vir hoër resolusie

Die grootste probleem met die vorige oplossing is dat die raamtempo (20 ms) relatief hoog is in vergelyking met die eintlik gegenereerde PWM -sein (tussen 1 en 2 ms), so ons mors 'n paar gewaardeerde stukkies vir die oorblywende 18 ms as ons wag die volgende raam. Dit kan opgelos word deur timers wat deurloop, met behulp van die timer -skakelfunksie vir sinchronisasie.

Die idee is dat ek TIM1 as meester sal gebruik om die raamtempo (20 ms) en TIM2, TIM3 te genereer om die PWM -seine as slawe te hanteer. As die meester die slawe aktiveer, genereer hulle slegs 'n PWM -sein in een polsmodus. Daarom hoef ek slegs 2 ms in hierdie tydsberekeninge te dek. Gelukkig kan u die tydmeters in hardeware onderbreek, sodat hierdie sinchronisasie geen ingryping van die verwerker benodig nie, en dit is ook baie presies; die jitter is in die ps -gebied. U kan die CubeMX -opstelling op die skermkiekies sien.

Soos u kan sien, het ek 3 gekies as prescalar, dus vir die 2 ms moet ek 48000 in die timer se teller stel. Dit gee ons 24000 vir 1 ms, wat eintlik meer is wat ons nodig het vir 'n resolusie van 14 bis. Tadaaaa…

Kyk na die skermkiekies van die ossilloskoop in die inleiding vir die finale uitslag. Die kanaal 3 (pers) is die onderbreking van die meester -tydteller wat die slawe sal veroorsaak om een pols te genereer. Kanaal 1 en 4 (geel en groen balk) is die werklike PWM -seine wat deur verskillende tydtellers gegenereer word. Let op dat hulle gesinkroniseer is, maar dat hulle aan die agterkant gesinkroniseer word, dit is as gevolg van die PWM -modus 2. Dit is nie 'n probleem nie, want die PWM -koers vir die betrokke servo is steeds korrek.

'N Ander voordeel van hierdie oplossing is dat die verandering van die raamkoers slegs beteken dat die tydperk in TIM1 verander word. Vir moderne digitale servo's kan u tot 200-300 Hz daal, maar raadpleeg die handleiding van die servo as u wil verfyn.

Aanbeveel: