Mały MCU z rozbudowanym PWM (2023 Update)

Znacie coś mniejszego niż ATmega2560 i w miarę dostępnego, co wygeneruje 6 sygnałów PWM dla modułu 3-fazowego mostka IGBT (wstępnie IM818SCC bo w TME mają) użytego jako 3 równolegle połączone step-down? Parami po 2 sygnały dla dolnego i górnego klucza z dead-time, 3 takie pary (ustawione to samo wypełnienie) przesunięte w fazie o 120 stopni względem siebie. ATmega2560 powinien dać radę za pomocą 3 timerów (3, 4, 5) ustawionych na różne wartości początkowe i uruchomionych w jednej chwili. Prototyp więc mile widziane coś łatwo montowanego w DIP. Dostępne mniejsze płytki Arduino z tego co widzę są robione na starszym ATmega328P a nie nowszym PB który ma więcej timerów.

Reply to
M M
Loading thread data ...

A jaka częstotliwość tego PWM? Bo ATmega324 ma 6 kanałów PWM, ale 2*2 są z timerów 8-bit, a tylko jedna para z 16-bit. W TME ostatnio jeszcze sporo w DILu było (jako nieliczny wyjątek). Hmm, były też chyba ATmega88, ale SMD, one chyba też takie PWMy mają. A może łatwiej poprzesuwać fazy?

Reply to
Dawid Rutkowski

W dniu 2022-12-29 o 14:32, M M pisze:

Attiny861A "Peripheral Features – One 8/16-bit Timer/Counter with Prescaler – One 8/10-bit High Speed Timer/Counter with Prescaler • 3 High Frequency PWM Outputs with Separate Output Compare Registers • Programmable Dead Time Generator

To ci wystarczy, sam na nim zrobiłem falownik 3F od 20 do 200Hz.

Reply to
Janusz

Jak szukasz plytki to pierwsze co przychodzi na mysl to "Blue Pill", popularna plytka z STM32F103. Masz Timer 1 ktory na 3 kanaly z wyjsciami komplementarnymi i "dead time". Do tego wejscie "break", ktore blokuje prace timera (do tego wejscia wypadaloby podlaczyc zewnetrzny komparator robiacy zabezpieczenie pradowe).

Plytka jest nieco wieksza niz Arduino Pro Mini czy Nano, tzn. Blue Pill ma pady do 20 nozek z kazdej strony (+ zlacze SWD z jednego krotkiego boku i USB z drugiego). Teraz jest sporo wariantow tych plytek, najtansze na Aliexpress rzedu 1.4 dolara.

Jak szukasz chipow, to STM32F030K6 w LQFP32 powinien wystarczyc. Sa podobne nowsze chipy, ktorys z nich powinien byc dostepny.

Reply to
antispam

czwartek, 29 grudnia 2022 o 15:50:34 UTC+1 Janusz napisał(a):

Ale tu mam DC/DC - wszystkie 3 kanały mają generować to samo wypełnienie, ale nośna ~15 kHz (a nie sygnał modulujący) przesunięta w fazie co 120 stopni. Podobnie jak robią np. step-down do zasilania CPU na płytach głównych, by podzielić obciążenie na więcej mniejszych elementów mocy. Chcąc to zrobić jednym timerem trzeba by mieć niezależnie programowane przy jakich różnych stanach licznika wyjście zmienia stan na 1 i 0 - a tego tam nie widzę. Chyba że przeładowywać "w locie" w przerwaniach w każdym cyklu - ale tego wolę unikać, bo pewnie przy debugowaniu trochę kluczy zdążę spalić.

Reply to
M M

W dniu 2022-12-29 o 17:17, M M pisze:

W czym widzisz problem? ustawiasz odpowiednio rejestry io masz bez przesunięcia.

Cóż, ja ci podałem rozwiązanie a skoro sądzisz że toi zrobisz lepiej to rób.

Opowiadasz głupoty. Klucze spalisz z zupełnie innego powodu.

Reply to
Janusz

czwartek, 29 grudnia 2022 o 17:51:20 UTC+1 Janusz napisał(a):

W tym że z przesunięciem miałbym mniejsze tętnienia bo częściowo się znoszą. 2 kanały co 180 stopni da się zrobić na jednym timerze (bo dalej wszystkie 4 są wycentrowane tak samo) ale 3 co 120 nie widzę jak. Bez przesunięcia to mogę po prostu sterować wszystkie razem, ale wtedy tętnienia nośnej do odfiltrowania będą sporo większe, nie chcę za mocno siać zakłóceniami po okolicy, a instalacja PV to spora antena.

Ja tylko pytam jak na tym ATtiny861A zrobić przesunięcie *nośnej* na 3 kanałach PWM co 120 stopni, bo może faktycznie się da ale na szybko przeglądając nie widzę. Albo pozycja jednego zbocza jest stała (licznik zlicza do MAX i się zeruje) albo oba są przy tym samym stanie licznika (jedno gdy liczy w górę a drugie w dół). Na ATmega2560 mogę 3 timery ustawić tak samo poza różnymi wartościami początkowymi (0, 1/3 i 2/3 okresu w cyklach) i jednocześnie wszystkie wystartować, jak nic lepszego się nie uda wymyślić to tak trzeba będzie.

Chętnie się dowiem na co jeszcze uważać. Robiłem już wcześniej przetwornice ale jednak sporo mniejszej mocy. Jakby był jakiś gotowiec (choćby gotowa płytka mostka IGBT do której dorabiam tylko sterowanie) to bym skorzystał zamiast rzeźbić samodzielnie.

Reply to
M M

W dniu 2022-12-29 o 18:07, M M pisze:

Więcej timerów maja atxmegi i nowe atmegi 3208, 3209 (3+1) czy 4809 czy

4809 (4+1)

Strasznie mieszasz, PWM z 'natury' sieje, dlatego na wyjściu falownika są filtry 'odsiewające' PWM-a. Co do przesunięcia, możesz to próbować robić bezpośrednio na timerach w przerwaniach ale to bez sensu, bo nie jesteś w stanie przerwań odbierać w tym samym czasie, dlatego do timerów są dodane rejestry compare, w tym procku 3, i one sprzętowo ci machają nogami a ty w przerwaniu od przepełnienia timera karmisz je danymi, tu mój falownik

ISR(TIMER1_OVF_vect) {static U16 faza_R=0, faza_S=21845, faza_T=43690; U16 tmp16;

//generacja 3pwm-ow na wyjsciach PB1,PB3,PB5 faza_R+=krok; if (faza_R>32768) faza_R=faza_R-32768; tmp16=pgm_read_byte(&sin256[faza_R>>7]);//*nap; OCR1A=tmp16; faza_S+=krok; if (faza_S>32768) faza_S=faza_S-32768; tmp16=pgm_read_byte(&sin256[faza_S>>7]);//*nap; OCR1B=tmp16;

faza_T+=krok; if (faza_T>32768) faza_T=faza_T-32768; tmp16=pgm_read_byte(&sin256[faza_T>>7]);//*nap; OCR1D=tmp16;

BIT->Bit_ADC_start=1; }

'krok' to zmiana częstotliwości u mnie to od 20 do 255; 'faza_x' to akumulatory fazy, starszą częścią jest adresowana baza sinusów 'sin256', tablica jest 'dodatnia' czyli od 0-255, i obejmuje pełny okres czyli 360 st. Inicjację ich masz w nagłówku w static, wpisując tam inne wartości dosttaniesz inne przesunięcie. Akumulatory specjalnie 'skróciłem' do

32768 żeby uzyskać odpowiedznie częstotliwości i nie przekroczyć czasu wykonania przerwania. OCR1X to są rejestry compare które generują pwm-y

W innych musisz sam zadbać o deadtime-y tu masz jes ustawione, ja dałem

1uS i wejście szybkiego resetu które wyłącza wszystko. Masz przykład mój, główny timer na 64Mhz, procek na 16

// HF PLL Clock dla I/O =64Mhz, Fcpu=16Mhz PLLCSR=(1<<PLLE); _delay_us(200); if (TEST(PLL_test)) //PLLCSR,PLOCK {PLLCSR=(1<<PCKE); } // 64Mhz/8=8Mhz TCCR1A=(1<<PWM1A) | (1<<PWM1B) | (1<<COM1A0) | (1<<COM1B0); // Fclk=8Mhz /256 = fpwm=31 746 OCR1C=255; // DEAD TIME prescaler /8 = 1uS TCCR1B=(1<<DTPS11) | (1<<DTPS10) | (1<<CS12);// | (1<<CS10) ; TCCR1C=(1<<COM1D0)|(1<<PWM1D) | (1<<COM1A1S)|(1<<COM1B1S); TCCR1D=0;//(1<<WGM10); //liczba impulsow DT1=0x11; //1 impuls naprostym, 1 na zanegowanym TIMSK=(1<<TOIE1);

Robiłem już wcześniej przetwornice ale jednak sporo mniejszej mocy. Jakby był jakiś gotowiec (choćby gotowa płytka mostka IGBT do której dorabiam tylko sterowanie) to bym skorzystał zamiast rzeźbić samodzielnie. Marzyciel :)

Reply to
Janusz

czwartek, 29 grudnia 2022 o 14:32:19 UTC+1 M M napisał(a):

.....

Z tego chyba da się sklecić EFM8BB31F16 • 4 Configurable Logic Units • Timers/Counters and PWM: • 6-channel programmable counter array (PCA) supporting PWM, capture/compare, and frequency output modes • 6 x 16-bit general-purpose timers

Reply to
2m

Jeśli nie straszna Ci przesiadka na nowy procesor, zerknij na serię C2000 od TI. To są procesory zaprojektowane do takich zastosowań i nawet najtańszy powinien mieć więcej kanałów PWM niz potrzeba do sterowania jednym silnikiem. Jeśli nie potrzebujesz tysięcy sztuk, to są dostępne w Mouserze, i są tańsze niż 2560. To nie jest zbytnio popularna rodzina w aplikacjach hobbystycznych, ale dość miło się w nich rzeźbi.

Jacek.

Reply to
Jacek Radzikowski

W dniu 2022-12-31 o 17:51, M M pisze:

No to ci tu nie pomogę.

Przecież na tej płytce małej masz zwykły falownik 3F na który wyżej kręciłeś nosem + IGBT na dużej.

Reply to
Janusz

niedziela, 1 stycznia 2023 o 11:17:37 UTC+1 Janusz napisał(a):

Chodzi właśnie o tę dużą - małą dorobić własną. Najlepiej na AVR bo w tym sporo rzeźbiłem (choć w starszych - w nowszych widzę peryferia się mocno pozmieniały, no i trzeba nowy inny programator z UPDI). Wszystkie 3 wyjścia falownika przez 3 dławiki i drugie końce dławików połączone razem to wyjście.

Reply to
M M

Ale mniejszego fizycznie, czy prostszego? Boja się ostatnio zachwycam RP2040. Kosztuje dolara, jest silnym ARMem i NIE MA flash, a więc i problemów flash. Mogę program trzymać w MRAM.

Pozdrawiam, Piotr

Reply to
Piotr Wyderski

Albo dorzeźbić peryferia w FPGA typu MachXO2 albo iCE40. Choć raczej nie w przypadku trzech kanałów PWM.

Pozdrawiam, Piotr

Reply to
Piotr Wyderski

W dniu 01.01.2023 o 18:14, M M pisze:

formatting link
wymaga trochę nauki jeżeli nie widziałeś nigdy z bliska M.

Reply to
m

Aha bo ty coś tam zakopujesz i niby flash nie dożyje tyle?

Reply to
Mirek

W tym sensie. I nie tyle nie dożyje, co nie ma gwarancji, że dożyje, a wymienić się nie da.

Pozdrawiam, Piotr

Reply to
Piotr Wyderski

W dniu 2023-01-01 o 18:14, M M pisze:

W temacie 'chłopy atmegi rzucili' napisałem co jest dostepne, najlepiej sie opłaca płytka z atmegą 4809.

Reply to
Janusz

poniedziałek, 2 stycznia 2023 o 01:03:21 UTC+1 M M napisał(a):

Płytka z ATmega4809, ściślej curiosity nano, była wspomniana jako źródło najtańszego "gotowcowego USB" programatora UPDI (można odłamać). Chyba przy okazji zakupię - choć jeszcze muszę sprawdzić, jaki soft na Linuxie to obsługuje.

Jeszcze rzuć okiem na AT90PWM* któryś tam - jeden typ jest dostępny w TME, SOIC - więc nie PDIP, ale jeszcze nie taki zły. I starszego typu. A że właśnie "PWM" ma w nazwie to ma takie cuś PSC (a nawet chyba dwa, jeden lepszy drugi gorszy) - i wygląda, że dają razem 6 wyjść, chyba 4 z tego lepszego i 2 z gorszego - ale z grubsza to tylko oglądałem.

Reply to
Dawid Rutkowski

M M napisał(a):

"Gwarantowany" dead time mają attiny24/44/84. Podobno nadają się do przetwornic. Widać w notach rejestr dead time generator, być może przeszukanie gógla/microchipa pod to zapytanie zwróci Ci bardziej rozbudowany uC w większą liczbą wyjść.

Reply to
alojzy nieborak

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.