Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

STM32F103 push pull i AVR (atmega168) push pull

[es] :: Elektronika :: Mikrokontroleri :: STM32F103 push pull i AVR (atmega168) push pull

Strane: 1 2

[ Pregleda: 6866 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull27.02.2018. u 02:58 - pre 74 meseci
Kad se malo zadje dublje u te tajmere i PWM, onda vidis da je isto tako jednostavno uraditi i full-bridge i jos preko toga dodati jedan PWM za neku "ZVS/ZCS Macolijadu" i sa onim Si8233 drajverima mozes da napravis kilovatni pretvarac za koje hoces napone i struje : ) ... Inace mi fali jedan od 200+A ... :D
Samo se sloze tajmeri i konfigurisu da tacno to rade i to je opako dobra tehnika. Naravno neophodno je prvo poznavanje topologije pretvaraca pa tek onda to sprovesti u ARM code sto sve zajedno nije bas lako, ali tu smo pa pitaj sve sto ti nije jasno.

Moguce je praviti trofazne pretvarace, moguce je uraditi isto jako zanimljive polifazne-buck-ove, moze isto Ćuk konverter da se napravi sa istovremenom buck/bust funkcijom!
Pa su tu jos i LLC, pa onda sve vise potrebna stvar za sinhrone ispravljace u sekundaru i tako dalje.

Jedan MCU moze da odradi prakticno celu logiku pretvaraca za bilo koju topologiju, iskoriste se skoro svi resursi u MCU i samo to radi, tako da LCD/Display/Touch, mreza WiFi, LAN ovo-ono to taj MCU ne moze da radi niti treba to taj MCU da radi : ) Odvoji jeda USART (opciono galvanski razdvojen) pa pricaj sa nekim drugim MCU koji se bavi tim stvarima.

[Ovu poruku je menjao mikikg dana 27.02.2018. u 04:17 GMT+1]
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
109-93-133-79.dynamic.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull27.02.2018. u 09:19 - pre 74 meseci
Citat:
mikikg: Kad se malo zadje dublje u te tajmere i PWM, onda vidis da je isto tako jednostavno uraditi i full-bridge i jos preko toga dodati jedan PWM za neku "ZVS/ZCS Macolijadu" i sa onim Si8233 drajverima mozes da napravis kilovatni pretvarac za koje hoces napone i struje : ) ... Inace mi fali jedan od 200+A ... :D
Samo se sloze tajmeri i konfigurisu da tacno to rade i to je opako dobra tehnika. Naravno neophodno je prvo poznavanje topologije pretvaraca pa tek onda to sprovesti u ARM code sto sve zajedno nije bas lako, ali tu smo pa pitaj sve sto ti nije jasno.

Moguce je praviti trofazne pretvarace, moguce je uraditi isto jako zanimljive polifazne-buck-ove, moze isto Ćuk konverter da se napravi sa istovremenom buck/bust funkcijom!
Pa su tu jos i LLC, pa onda sve vise potrebna stvar za sinhrone ispravljace u sekundaru i tako dalje.

Jedan MCU moze da odradi prakticno celu logiku pretvaraca za bilo koju topologiju, iskoriste se skoro svi resursi u MCU i samo to radi, tako da LCD/Display/Touch, mreza WiFi, LAN ovo-ono to taj MCU ne moze da radi niti treba to taj MCU da radi : ) Odvoji jeda USART (opciono galvanski razdvojen) pa pricaj sa nekim drugim MCU koji se bavi tim stvarima.

[Ovu poruku je menjao mikikg dana 27.02.2018. u 04:17 GMT+1]


što se tiče zvs/zcs, daleko smo od toga ... tek smo provalili malo topologije i zagrebali ispod površine onoga što svaki laik vidi kao "trafo brale" :)
tek smo (persiram sebi) savladali malo topologije half bridge, full bridge ... ma i to nismo dobro baš savladali ...
si8233 mi stoje, nisam ih proučavao zbog nedostatka životnoga vremena, a dizajn koji radim se zasniva baš na "macolijadi 2000" :) malo je to izmenjeno , ali u suštini lepo radi, čak i sa atmega168 kontrolom. planiram kobogda u 62.oj godini :) da počnem da se bavim i invertorima, za početak monofaznim.

dok se proučava literatura od goran_68 i bogdan_kecman, sinoć sam uradio izmenjeni i dopunjeni kod kvalitetnog push pulla za atmega168/328.
MCU sada koriguje pwm ispunu od zadatog do zadatog, a ciklusi kontrole su na 30Khz bukvalno "pulse to pulse". ja radim na 100Khz pa mi ne smeta kontrola na svako tri pulsa. kod je konačan i dobro radi.

Code:
// 26.02.2018
// Pin 9 i 10 su izlazi PWM
// A0 pin meri napon

#define Kristal 16000000            // Kristal Atmega168 NE MENJAJ
#define Frekvencija 100000                                            // PODESI FREKV . DOZVOLJENO JE DO 300kHz

#define VrednostICR1 Kristal/Frekvencija/2
// 47.5% duty cycle

#define PeriodICR1 VrednostICR1 / 2

#define DeadTime 5                              // PODESAVANJE DEADTIME-A. OD 1 DO 10 JE OK.
#define VrednostOCR1A PeriodICR1 + DeadTime
#define VrednostOCR1B PeriodICR1 - DeadTime

unsigned int OstvareniDuty=0,Duty=0;

//-----------------------------------------------------------------------
//
//-----------------------------------------------------------------------
void setup()
{
    pinMode(9, OUTPUT);
    pinMode(10, OUTPUT);

    TCCR1A = 0;
    TCCR1B = 0;
    TCNT1 = 0;

    TCCR1B |= _BV(CS10);


    ICR1 = VrednostICR1;

    OCR1A = VrednostICR1;
    TCCR1A |= _BV(COM1A1) | _BV(COM1A0);

    OCR1B = 0;
    TCCR1A |= _BV(COM1B1);

    TCCR1B |= _BV(WGM13);
    TCCR1A |= _BV(WGM11);
}
//-----------------------------------------------------------------------
//
//-----------------------------------------------------------------------
void loop()
{
    if(PINC & 1)                                  // Arduino A0 pin atmega168&328. Maska je &2 za pin 1, &4 za pin2 itd ...
        {
        OCR1A = VrednostICR1;
        OCR1B = 0;
        OstvareniDuty /= 2;
        }
    else
        {
        if(OstvareniDuty < 50)                // PODESITI MAX DUTY PREMA PRORACUNU SMPS. MAX JE 90%
            OstvareniDuty++;

        Duty = OstvareniDuty;
        Duty *=PeriodICR1;
        Duty /=100;
  
        OCR1A = VrednostICR1-Duty;
        OCR1B = Duty;
        }
}


[Ovu poruku je menjao cukovanny dana 27.02.2018. u 11:39 GMT+1]
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
109-93-146-116.dynamic.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull08.03.2018. u 12:20 - pre 73 meseci
dopuna:

važna stvar: atmegaXXX ima watchdog koji je poseban oscilator na chipu.
naravski, treba za ovakav projekat koristiti istoga:


u include delu koda ide:
Code:
#include <avr/wdt.h>




u setup() delu koda:
Code:
wdt_enable(WDTO_15MS);




na kraju loop() petlje ide:
Code:
wdt_reset();




pade mi na pamet , jer će ovaj smps da ide na 1700m nadmorske đe će da pucaju gromovi letos fino.
videćemo da li će , i koliko preživeti ...



 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
93-87-151-143.dynamic.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull17.03.2018. u 21:23 - pre 73 meseci
hehe osećam se kao da vodim unutrašnji monolog, elem, još uvek dok se proučava CubeMX i Atollic i čeka STLink...
proučavam stm32f10x.h i našao sam vrednosti bitova registra TIM_CCER

/******************* Bit definition for TIM_CCER register *******************/
#define TIM_CCER_CC1E ((uint16_t)0x0001) /*!<Capture/Compare 1 output enable */
#define TIM_CCER_CC1P ((uint16_t)0x0002) /*!<Capture/Compare 1 output Polarity */
#define TIM_CCER_CC1NE ((uint16_t)0x0004) /*!<Capture/Compare 1 Complementary output enable */
#define TIM_CCER_CC1NP ((uint16_t)0x0008) /*!<Capture/Compare 1 Complementary output Polarity */
#define TIM_CCER_CC2E ((uint16_t)0x0010) /*!<Capture/Compare 2 output enable */
#define TIM_CCER_CC2P ((uint16_t)0x0020) /*!<Capture/Compare 2 output Polarity */
#define TIM_CCER_CC2NE ((uint16_t)0x0040) /*!<Capture/Compare 2 Complementary output enable */
#define TIM_CCER_CC2NP ((uint16_t)0x0080) /*!<Capture/Compare 2 Complementary output Polarity */
#define TIM_CCER_CC3E ((uint16_t)0x0100) /*!<Capture/Compare 3 output enable */
#define TIM_CCER_CC3P ((uint16_t)0x0200) /*!<Capture/Compare 3 output Polarity */
#define TIM_CCER_CC3NE ((uint16_t)0x0400) /*!<Capture/Compare 3 Complementary output enable */
#define TIM_CCER_CC3NP ((uint16_t)0x0800) /*!<Capture/Compare 3 Complementary output Polarity */
#define TIM_CCER_CC4E ((uint16_t)0x1000) /*!<Capture/Compare 4 output enable */
#define TIM_CCER_CC4P ((uint16_t)0x2000) /*!<Capture/Compare 4 output Polarity */
#define TIM_CCER_CC4NP ((uint16_t)0x8000) /*!<Capture/Compare 4 Complementary output Polarity */



nađem nekog zemljaka koji iz nekog razloga sa par redova iz stm32duino okruženja lako podešava dva komplementarna PWM sledećim linijama koda:

Code:
#define PWM_OUT PA8                                       //prvi PWM
#define PWM_OUT_COMP PB13                            //invertovani PWM

HardwareTimer timer1 = HardwareTimer(1);
timer1.setPrescaleFactor(1);
timer1.setPeriod(10);                                         //period 10 je 100kHz... 

  
  pinMode(PWM_OUT, PWM);                              // podesimo da je prvi izlaz tipa pwm
 pinMode(PWM_OUT_COMP, PWM);                     // isto drugi izlaz pwm

  
  timer_dev *t = TIMER1;                                //refers t to Timer 8 memory location, how to read back?
  timer_reg_map r = t->regs;
   

  bitSet(r.adv->CCER,0);                                //this should enable complimentary outputs
  bitSet(r.adv->CCER,2);


.... te se uz pomoć gornjih redova koda sada lako podešava ispuna pwm funkcijom na pinu PWM_OUT što automatski prati komplementarna vrednost na pinu PWM_OUT_COMP. funkcija koja se koristi je pwmWrite(gpioPIN,duty);

pitanje> da li se izmenom vrednosti CCER registra na druge vrednosti može lako dobiti push pull na PA8 i PB13 umesto komplementarnog, i ako da koje vrednosti da stavim umesto 0 i 2 ?
 
Odgovor na temu

bogdan.kecman
Bogdan Kecman
"specialist"
Oracle
srbistan

Član broj: 201406
Poruke: 15887
*.com
Via: [es] mailing liste

Sajt: mysql.rs


+2377 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull17.03.2018. u 22:23 - pre 73 meseci
Citat:
da li se izmenom vrednosti CCER registra na druge vrednosti
može lako dobiti push pull na PA8 i PB13 umesto komplementarnog,
i ako da koje vrednosti da stavim umesto 0 i 2 ?


cek, ne razumem, kako mislis push/pull na pa8 i pb13 umesto komplementarnog?

to su dve potpuno razlicite stvari o kojima pricas, push/pull je tip
izlaza pina, hardwerski tip izlaza, da li je pin push/pull (forsirano
vcc za high i forsirano vss za low) ili je open drain (forsirano vss za
low, hiz za high), pa dodatno moze da ima pull-up i pull-down otpornik...

to nema nikakve veze sa logicki sta se nalazi na tom pinu (ako je na pwm
pinu izlaz high na pwm komplementarnom je low - uz eventualnu neku dead
time kalkulaciju)

tako da na sta mislis kada kazes push pull izlaz iz pwm-a ?

znam da to postoji kao "push pull pwm" arhitektura smps uredjaja ali bas
zbog toga valjda i imas taj komplementarni izlaz, da bi jedan vezao na
push tradnzu a drugi na pull trandzu
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull18.03.2018. u 11:58 - pre 73 meseci
Mozda ovo pomogne:
http://we.easyelectronics.ru/_...mere-1-kontrollerov-stm32.html

U push-pull pwm modu Duty mora bit manji od 50% ...
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
79-101-21-72.static.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull19.03.2020. u 06:23 - pre 49 meseci
ajmo još jednom probamo da oživimo temu uz rizik da tražim pomoć iskusnijih kolega bez uloženog truda.
ovo dve godine sam prečešljo internet uzduž i popreko i nikog živog nema da je napravio push pull pwm na STM32F103C (popularni bluepill) u popularnom arduino IDE, a da je to objavio negde....
radimo na tome ja i kolega pomalo kad se ima vremena, ali uglavnom se svede na to da je previše registara, previše datasheet-a, a premalo iskustva sa stm32. po vašim savetima sam jurio i stm32cube ali kako vidim svelo se na to da nazirem jedno 2 godine života spucano na učenje stm32...

ima neko ovde da ima volje komercijalno da prevede ovaj kod u stm32duino okruženje ?
pošto je pandemija korone i kućni pritvor, možda je sad pravi trenutak za to???
ponude na PP.

treba mi ovaj kod preveden da radi u stm32duino okruženje sa stm32f103 (bluepill), tako da imam subrutinu kojoj dam frekvenciju i djuti i vozi !!!

Code:
#include "stm32f10x.h"
#include "stm32_ports.h"

#define TIM1_CH1N_PB        13
#define TIM1_CH1_PA         8
#define TIM1_CH2_PA         9

#define LED1_G_PC           9
#define LED2_B_PC           8

#define PWM_VALUE           20
#define TMR_T               200
#define DEADTIME            20

#define PP_MODE
//#define COMPL_MODE

void main(void)
{
    RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;

    GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);
    GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);
    GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

#ifdef PP_MODE
    //CH1: PWM mode 2, CH2: PWM mode 1, preload enabled on all channels
    TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
    TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;
    TIM1->BDTR=TIM_BDTR_MOE;
    TIM1->CCR1=TMR_T - PWM_VALUE;
    TIM1->CCR2=PWM_VALUE;
    TIM1->ARR=TMR_T;
    TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;
    TIM1->CR1|=TIM_CR1_CEN;
    TIM1->EGR=TIM_EGR_UG;
#endif

#ifdef COMPL_MODE
    //CH1: PWM mode with complementary output & deadtime
    TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1PE;
    TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC1NE;
    TIM1->BDTR=TIM_BDTR_MOE | DEADTIME;
    TIM1->CCR1=PWM_VALUE;
    TIM1->ARR=TMR_T;
    TIM1->CR1=TIM_CR1_ARPE;
    TIM1->CR1|=TIM_CR1_CEN;
    TIM1->EGR=TIM_EGR_UG;
#endif

    while (1)
    {
    }
}
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull19.03.2020. u 13:18 - pre 49 meseci
Vidi ovako, code koji si postavio (verujem da radi) je prilicno jednostavan, ima inicializaciju periferija (RCC, I/O, tajmeri itd) i nakon toga odmah ulazi u konfiguraciju TIM1 periferije i to je sve, dakle kada se upali odmah pocne da vrti tajmer.

Dobra stvar je sto je taj program pisan u stilu CMSIS (to je neki da kazemo low-level pristup) i kao takav moze direktno da se iskoristi u Arduino okruzenju jer su inace Arduinove high-level funkcije pisane u CMSIS, trebalo bi da bude 99% sve isto, ono sto nije isto mogu da budu nazivi registra/flagova ali uz malo kombinatorike i gledanju po header fajlovima moze da se skonta koji je tacan naziv, negde ima crtica, negde nema, fali slovo i tome slicno.

Dakle kreni sa praznim programom u Arduino i onda dodaj jednu po jednu instrukciju.
U sustini ceo taj code treba da ide u setup(), dakle jednom se poziva da izkonfigurise periferije i to je to.

U main() onda lagano kreni sa "korisnickim interfejsom" koji obraduje neke tvoje buttone ili potenciometre i kao rezultat da upisuje nove vrednosti u PWM_VALUE (za menjanje duty).
Menjanje frekvencije je po slicnom principu ali je jedino neophodno da preracunas nove vrednosti za CCR1 i ARR jer su duty i frekvencija medusobno zavisne, ako menjas frekvenciju promenice se i duty.

To bi bilo ukratko, probaj pa ako zapne pitaj ...


Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
79-101-21-72.static.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull19.03.2020. u 18:36 - pre 49 meseci
Citat:
Vidi ovako, code koji si postavio (verujem da radi) je prilicno jednostavan, ima inicializaciju periferija (RCC, I/O, tajmeri itd) i nakon toga odmah ulazi u konfiguraciju TIM1 periferije i to je sve, dakle kada se upali odmah pocne da vrti tajmer.


hi Miki, bio sam ubeđen da se niko neće javiti. nadam se da si ispravan i zdrav u ovo nezgodno vreme...
ljudi imaju otklon prema arduino ide, kao to nije okruženje za profesionalce itd itd.... meni je sve ok što mi je jednostavno i čini mi posao.



Citat:
Dobra stvar je sto je taj program pisan u stilu CMSIS (to je neki da kazemo low-level pristup) i kao takav moze direktno da se iskoristi u Arduino okruzenju jer su inace Arduinove high-level funkcije pisane u CMSIS, trebalo bi da bude 99% sve isto, ono sto nije isto mogu da budu nazivi registra/flagova ali uz malo kombinatorike i gledanju po header fajlovima moze da se skonta koji je tacan naziv, negde ima crtica, negde nema, fali slovo i tome slicno.


proveo sam dosta vremena pokušavajući da iskompajliram ovaj kod kakav jeste u samom arduino okruženju. iskren da budem - ja i ne znam u kom develope okruženju je ovaj kod od ovog rusa pisan. ali radi mu sigurno jer je dao oscilograme komplementarnog moda i PP moda.
da se vratim na kompajliranje u arduino ide - hmm ne ide ... kompajler se non stop žali , traži ovo traži ono , drž ne daj , prolazi to kroz još 12ak dependency fileova , itd itd...
čisto kao info, evo lista zavisnih datoteka koju ovaj kod poziva:

core_cm3.h
core_cmFunc.h
core_cmInstr.h
ioports.h
ioreg.h
stm32f10x.h
startup_stm32f10x.h
static_assert.h
stm32_ports.h
stm32f10x_conf.h
stm32f10x_gpio.h
i još dvetri koje ne vidim jer ne mogu da nateram tabova udesno više...

izgleda da je jedino rešenje jedna po jedna linija , to kako ti kažeš , i da se gledaju nazivi registara, flegovi itd itd...




Citat:
Dakle kreni sa praznim programom u Arduino i onda dodaj jednu po jednu instrukciju.
U sustini ceo taj code treba da ide u setup(), dakle jednom se poziva da izkonfigurise periferije i to je to.


da. to sam skapirao da čitav kod ide u setup(), a u loop() posle jurim djuti preko promenljive PWM_VALUE.



Citat:
U main() onda lagano kreni sa "korisnickim interfejsom" koji obraduje neke tvoje buttone ili potenciometre i kao rezultat da upisuje nove vrednosti u PWM_VALUE (za menjanje duty).
Menjanje frekvencije je po slicnom principu ali je jedino neophodno da preracunas nove vrednosti za CCR1 i ARR jer su duty i frekvencija medusobno zavisne, ako menjas frekvenciju promenice se i duty.


nemam potove ni butone. u suštini projekat je oko solarnog pretvarača napona veće snage oko 1-2kW. na ADC stm32f103 bi merio ulazne napone solarnog stringa i baterija koje puni pa prema tome kalkulisao djuti kako bi čitav sistem bio u dozvoljenim naponima i radio u mppt tački.



Citat:
To bi bilo ukratko, probaj pa ako zapne pitaj ...


oki.
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull19.03.2020. u 23:28 - pre 49 meseci
Evo sredio sam ti ovaj code da moze da se prevede ;)
Sad ti malo nastavi pa vici ako treba pomoc ... Nisam proveravao da li stvarno radi i generise signale na izlazu, to ostavljam tebi ...

Code:

#define TIM1_CH1N_PB        13
#define TIM1_CH1_PA         8
#define TIM1_CH2_PA         9
#define LED1_G_PC           9
#define LED2_B_PC           8
#define PWM_VALUE           20
#define TMR_T               200
#define DEADTIME            20
#define M_IN        0x00
#define M_OUT_2M    0x02
#define M_OUT_10M   0x01
#define M_OUT_50M   0x03
#define IN_ANALOG   0x00
#define IN_FLOATING 0x01
#define IN_PULLED   0x02
#define OUT_GP_PP   0x00
#define OUT_GP_OD   0x01
#define OUT_AF_PP   0x02
#define OUT_AF_OD   0x03
#define SET_CRL(pin_no,mode,conf)           (((mode) | ((conf) << 2)) << (4*(pin_no)))
#define SET_CRH(pin_no,mode,conf)           (((mode) | ((conf) << 2)) << (4*((pin_no)-8)))
#define PIN_MASK(pin_no)                    (1<<(pin_no))
#define PIN_SETMASK(pin_no)                 (1<<(pin_no))
#define PIN_RSTMASK(pin_no)                 (1<<((pin_no)+16))

void setup() {

  RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;
  
  GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);
  GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);
  GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

  //CH1: PWM mode 2, CH2: PWM mode 1, preload enabled on all channels
  TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;
  TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;
  TIM1->BDTR=TIM_BDTR_MOE;
  TIM1->CCR1=TMR_T - PWM_VALUE;
  TIM1->CCR2=PWM_VALUE;
  TIM1->ARR=TMR_T;
  TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;
  TIM1->CR1|=TIM_CR1_CEN;
  TIM1->EGR=TIM_EGR_UG;  
}

void loop() {
  // ... nastavi ...
}



Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
Prikačeni fajlovi
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
79-101-21-72.static.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull20.03.2020. u 06:10 - pre 48 meseci
@mikikg, ti si kralj :)

nego, šta si stavio gore u #include ?
da ! još ovo: da li koristiš stm32 library (arm) originalnu iz arduino ide, ili si "digao" rodger clark -ovu stm32duino library sa githuba ?

javlja mi:


Code:
Arduino: 1.8.12 (Windows 7), Board: "Generic STM32F103C series, STM32F103CB (20k RAM. 128k Flash), Serial, 48Mhz (Slow - with USB), Smallest (default)"


stm32f103_push_pull_MIKIKG:28:3: error: 'RCC' was not declared in this scope

   RCC->APB2ENR|=RCC_APB2ENR_IOPAEN | RCC_APB2ENR_IOPBEN | RCC_APB2ENR_IOPCEN | RCC_APB2ENR_TIM1EN;

   ^

stm32f103_push_pull_MIKIKG:30:10: error: 'struct gpio_dev' has no member named 'CRH'

   GPIOA->CRH=SET_CRH(TIM1_CH1_PA,M_OUT_50M,OUT_AF_PP) | SET_CRH(TIM1_CH2_PA,M_OUT_50M,OUT_AF_PP);

          ^

stm32f103_push_pull_MIKIKG:31:10: error: 'struct gpio_dev' has no member named 'CRH'

   GPIOB->CRH=SET_CRH(TIM1_CH1N_PB,M_OUT_50M,OUT_AF_PP);

          ^

stm32f103_push_pull_MIKIKG:32:10: error: 'struct gpio_dev' has no member named 'CRH'

   GPIOC->CRH=SET_CRH(LED1_G_PC,M_OUT_50M,OUT_GP_PP) | SET_CRH(LED2_B_PC,M_OUT_50M,OUT_GP_PP);

          ^

stm32f103_push_pull_MIKIKG:35:3: error: 'TIM1' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

   ^

stm32f103_push_pull_MIKIKG:35:15: error: 'TIM_CCMR1_OC1M_2' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

               ^

stm32f103_push_pull_MIKIKG:35:34: error: 'TIM_CCMR1_OC1M_1' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                  ^

stm32f103_push_pull_MIKIKG:35:53: error: 'TIM_CCMR1_OC1M_0' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                     ^

stm32f103_push_pull_MIKIKG:35:72: error: 'TIM_CCMR1_OC1PE' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                        ^

stm32f103_push_pull_MIKIKG:35:90: error: 'TIM_CCMR1_OC2M_2' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                                          ^

stm32f103_push_pull_MIKIKG:35:109: error: 'TIM_CCMR1_OC2M_1' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                                                             ^

stm32f103_push_pull_MIKIKG:35:128: error: 'TIM_CCMR1_OC2PE' was not declared in this scope

   TIM1->CCMR1=TIM_CCMR1_OC1M_2 | TIM_CCMR1_OC1M_1 | TIM_CCMR1_OC1M_0 | TIM_CCMR1_OC1PE | TIM_CCMR1_OC2M_2 | TIM_CCMR1_OC2M_1 | TIM_CCMR1_OC2PE;

                                                                                                                                ^

stm32f103_push_pull_MIKIKG:36:14: error: 'TIM_CCER_CC1E' was not declared in this scope

   TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;

              ^

stm32f103_push_pull_MIKIKG:36:30: error: 'TIM_CCER_CC2E' was not declared in this scope

   TIM1->CCER=TIM_CCER_CC1E | TIM_CCER_CC2E;

                              ^

stm32f103_push_pull_MIKIKG:37:14: error: 'TIM_BDTR_MOE' was not declared in this scope

   TIM1->BDTR=TIM_BDTR_MOE;

              ^

stm32f103_push_pull_MIKIKG:41:13: error: 'TIM_CR1_ARPE' was not declared in this scope

   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;

             ^

stm32f103_push_pull_MIKIKG:41:28: error: 'TIM_CR1_CMS_1' was not declared in this scope

   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;

                            ^

stm32f103_push_pull_MIKIKG:41:44: error: 'TIM_CR1_CMS_0' was not declared in this scope

   TIM1->CR1=TIM_CR1_ARPE | TIM_CR1_CMS_1 | TIM_CR1_CMS_0;

                                            ^

stm32f103_push_pull_MIKIKG:42:14: error: 'TIM_CR1_CEN' was not declared in this scope

   TIM1->CR1|=TIM_CR1_CEN;

              ^

stm32f103_push_pull_MIKIKG:43:13: error: 'TIM_EGR_UG' was not declared in this scope

   TIM1->EGR=TIM_EGR_UG;  

             ^

exit status 1
'RCC' was not declared in this scope





[Ovu poruku je menjao cukovanny dana 20.03.2020. u 07:28 GMT+1]
 
Odgovor na temu

mikikg
System administrator
Srbija

Član broj: 3779
Poruke: 5059
*.dynamic.sbb.rs.

Sajt: yu3ma.net


+505 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull20.03.2020. u 07:31 - pre 48 meseci
Za ovaj primer trenutno ne treba nikakav #include

Imao sam stariju verziju Arduino IDE bez STM32 podrske, pratio sam ovo uputstvo za instalaciju:
https://github.com/stm32duino/wiki/wiki/Getting-Started

Po uputstvu sam dodao tamo u preferences URL sa dodatnim paketima, posle sa te URL povuce sve sto treba, nisam nista manualno dodavao ili instalirao, sve odradjeno po uputstvu iz samog Arduino IDE.
Site about Software Defined Radio – SDR
http://yu3ma.net/
https://github.com/yu3ma
On-line LM317 kalkulator
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
79-101-21-72.static.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull20.03.2020. u 08:24 - pre 48 meseci

BRAVO !!!
moraju se instalirati sve stm32 core datoteke i to baš na ovaj način kako si gore napisao.
to je 130+ megabajta prekompajliranih soure-ova.


hajde kad malo razigram ovo i vidim da li radi , pa da mi ukratko iskomentarišeš red po red koda - radi daljeg učenja, a i radi svih koje ovo zanima :)
poz
 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
79-101-21-72.static.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull21.03.2020. u 20:26 - pre 48 meseci
@mikikg

krenuo da testiram kod koji si ti prilagodio da može da se kompajlira, ali shvatio ubrzo da je u slučaju "stm32core for arduino ide" biblioteke - nemoguće upucavati kod u bluepill bez bootloader-a prethodno upucanog u sam bluepill....
aj reko to da instaliramo i podesimo, ali kad videh da su alati za sve to teški preko 170Mb i da ima nekih tisuću podešavanja, reko aj da ja ipak pregledam onaj manual od STM32F103C od 400tinak strana - naučiće se nešto i nema ko drugi to za mene da uradi.
drugo što sam morao da pregledam je ovo http://docs.leaflabs.com/stati...etimer.html#lang-hardwaretimer
treće što sam morao da pregledam je ovo https://github.com/stm32duino/wiki/wiki/HardwareTimer-library

suština je da se iste ili slične stvari podešavaju unutar koda koji ću postovati i onog kojeg si ti prilagodio.
razlika je u tome što je nomenklatura registara i flagova u Rodger Clark "Stm32duino" biblioteci (koja podržava serial ftdi upload) , i ona u "stm32core for arduino ide" - donekle različita.
na kraju sam sklepao kod koji radi i može da se kompajlira sa "stm32duino" bibliotekom.

evo koda:
Code:

// Konachno radi 21.03.2020 - push pull pwm na GPIO PA8 i PA9

#define    Frekvencija        22000                            // Za IGBT u push pull izlazima 
//#define    Frekvencija     70000                          // Za Mosfet u push pull izlazima 


#define Brojach            72000000/4/Frekvencija        // STM32F103 moze raditi na 48Mhz/72Mhz/128Mhz
#define DeadTime        2
#define MaxPwmVrednost        Brojach / 2 - DeadTime

int PWM_Vrednost = 1;
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void SetDuty(int Duty)                            // max. vrednost djutija je 72.000.000/4/zeljena f-ja pwm
{                                                 // primer> f-ja pwm 22khz> 72.000.000/4=18.000.000/22.000=818
    if(Duty > MaxPwmVrednost)                     // dakle, na 22khz push pull-a mozemo "ulaziti" sa
        Duty = MaxPwmVrednost;                    // djutijem od 1-818. 
                                                  // ako je stm32f103 klokovan na 128Mhz, onda je deljenik 128.000.000
    TIMER1_BASE->CCR1 = Brojach - Duty;           // i automatski osim brzine mcu, dupliramo i rezoluciju pwm
    TIMER1_BASE->CCR2 = Duty;  

    TIMER1_BASE->CR1 = 225;
    TIMER1_BASE->EGR = 1;
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void setup()
{

// koga zanima sta se ovde radi - potrudio sam se da dam stranice u manualu
// a manual stm32f103c ima par stotina strana :)
// da nije covid-19 histerije - nikad se ne bi stiglo ovo citati
// sustina je da se pali Timer1 i dozvoli izlaz PortA

    RCC_BASE->APB2ENR = 2076;                   // ??? stranica 112
    GPIOA_BASE->CRH = 187;                      // ??? stranica 172
    TIMER1_BASE->CCMR1 = 26744;                 // ??? stranica 349
    TIMER1_BASE->CCER = 17;                     // ??? stranica 353
    TIMER1_BASE->BDTR = 32768;                  // ??? stranica 359
    TIMER1_BASE->ARR = Brojach;                 // ??? stranica 356
    PWM_Vrednost = 1;
}
// -----------------------------------------------------------------------------
//
// -----------------------------------------------------------------------------
void loop()                                     // loop radi test-a
{
    SetDuty(PWM_Vrednost++);

    if(PWM_Vrednost > MaxPwmVrednost)
        PWM_Vrednost = 1;

    delay(20);                                    // delay radi hvatanja oscilograma 
}


 
Odgovor na temu

cukovanny
svaštar
glx
Planina

Član broj: 44538
Poruke: 966
79-101-21-72.static.isp.telekom.rs.



+39 Profil

icon Re: STM32F103 push pull i AVR (atmega168) push pull07.04.2020. u 21:46 - pre 48 meseci
iz nekog razloga - Bit 9 ADC1EN u registru APB2ENR mora se promeniti na 1, tj dekadna vrednost registra APB2ENR mora biti 2564 (popaljeni bitovi drugi, deveti i jedanaesti) da bi radila ADC konverzija i I2C magistrala koju koristim za ispis vrednosti smps-a za kojeg koristim stm32f103.

dakle, promeniti u pushh pull kodu ovaj red:
RCC_BASE->APB2ENR = 2564;

eto :) ako nekome ikome ovo treba, potroših 2 dana da nađem problem pa rekoh hajde da nekome olakašam ....

[Ovu poruku je menjao cukovanny dana 07.04.2020. u 23:35 GMT+1]
 
Odgovor na temu

[es] :: Elektronika :: Mikrokontroleri :: STM32F103 push pull i AVR (atmega168) push pull

Strane: 1 2

[ Pregleda: 6866 | Odgovora: 34 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.