Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

STM32 PWM in quadratura

Raccolta di codici sorgenti

Moderatore: Foto UtentePaolino

0
voti

[11] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteHad3s » 4 giu 2025, 18:00

luxinterior ha scritto: Quindi se tu vuoi simulare l'encoder con i timer STM32 devi variare il clock o il preset che divide il clock dei timer non il set del Timer


Ho capito che intendi, allora devo implementare un codice che cambia il prescaler...
Avatar utente
Foto UtenteHad3s
35 5
New entry
New entry
 
Messaggi: 67
Iscritto il: 20 ago 2021, 11:50

0
voti

[12] Re: STM32 PWM in quadratura

Messaggioda Foto Utentegill90 » 4 giu 2025, 20:49

Se prendi un STM32 della famiglia F334 puoi usare il timer ad alta risoluzione HRTIM, che è particolarmente adatto a questo scopo. Ha la possibilità di settare in automatico il 50% di PWM senza dover scrivere nel registro, si adatta automaticamente a seconda del periodo che imposti. Possiede un Master Timer per la sincronizzazione e 5 timer con uscite indipendenti.
Se hai bisogno di una evaluation c'è la Discovery, io l'ho usata e mi sono trovato molto bene, anche per loop digitali di regolazione con risoluzione molto precisa.
Avatar utente
Foto Utentegill90
4.146 3 7 12
G.Master EY
G.Master EY
 
Messaggi: 1134
Iscritto il: 1 set 2011, 16:18

0
voti

[13] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteMarcoD » 4 giu 2025, 21:11

Codice: Seleziona tutto
void gen_fasi() //genera le 4 fasi delle due onde quadre sfasate fra loro di 90 gradi
{
CNTFASI = CNTFASI +1; if (CNTFASI >3){CNTFASI = 0;}
switch( CNTFASI)
{
  case 0:  U1 =1; if (CCW = 0){ U2=0;} else { U2=1;} ; break;
  case 1:  U1 =1; if (CCW = 0){ U2=1;} else { U2=0;} ; break;
  case 2:  U1 =0; if (CCW = 0){ U2=1;} else { U2=0;} ; break;
  case 3:  U1 =0; if (CCW = 0){ U2=0;} else { U2=1;} ; break;
  default: break;

}



Mi sono divertito a scrivere il codice allegato. Il codice è scritto nell'ambiente di arduino, è solo la parte che controlla le onde quadre, l'ho compilato, ma non è stato provato.
Non è elegante, spero sia di aiuto.
Avatar utente
Foto UtenteMarcoD
12,2k 5 9 13
Master EY
Master EY
 
Messaggi: 6696
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[14] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteHad3s » 5 giu 2025, 10:28

gill90 ha scritto:Se prendi un STM32 della famiglia F334 puoi usare il timer ad alta risoluzione HRTIM, che è particolarmente adatto a questo scopo.


Purtroppo sono vincolato all'uso di questa scheda, grazie comunque.
Avatar utente
Foto UtenteHad3s
35 5
New entry
New entry
 
Messaggi: 67
Iscritto il: 20 ago 2021, 11:50

0
voti

[15] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteHad3s » 5 giu 2025, 10:33

MarcoD ha scritto:Mi sono divertito a scrivere il codice allegato.

Grazie, vedrò come posso includerlo nel mio codice.
Avatar utente
Foto UtenteHad3s
35 5
New entry
New entry
 
Messaggi: 67
Iscritto il: 20 ago 2021, 11:50

0
voti

[16] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteHad3s » 5 giu 2025, 10:34

intanto ho trovato molto utile questa guida :

https://deepbluembedded.com/stm32-pwm-phase-shift-timer-synchronized-example-code/

devo solo verificare con un oscilloscopio per vedere se funziona tutto regolarmente.
Avatar utente
Foto UtenteHad3s
35 5
New entry
New entry
 
Messaggi: 67
Iscritto il: 20 ago 2021, 11:50

0
voti

[17] Re: STM32 PWM in quadratura

Messaggioda Foto Utenteharpefalcata » 10 giu 2025, 14:58

Non so quanto questa discussione sia ancora attiva, comunque i moduli timer piu evoluti del controller, se non sbaglio hanno un canale negato che funziona erediando in tutto e per tutto le configurazioni del canale principale, ma negando l'uscita. Avrai quindi due canali, del medesimo timer, in quadratura, che occuperanno due pin distinti del timer.
Avatar utente
Foto Utenteharpefalcata
326 1 3 6
Stabilizzato
Stabilizzato
 
Messaggi: 422
Iscritto il: 28 lug 2015, 21:03

0
voti

[18] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteMarcoD » 10 giu 2025, 15:16

Avete idea quale sia la velocità massima di rotazione di un encoder, in giri/minuto (RPM) ?
Avatar utente
Foto UtenteMarcoD
12,2k 5 9 13
Master EY
Master EY
 
Messaggi: 6696
Iscritto il: 9 lug 2015, 16:58
Località: Torino

0
voti

[19] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteHad3s » 11 giu 2025, 11:50

MarcoD ha scritto:Avete idea quale sia la velocità massima di rotazione di un encoder, in giri/minuto (RPM) ?


Quello è il prossimo problema che devo risolvere... :D

Per ora il PWM funziona come deve, l'oscilloscopio riporta due segnali con duty cycle del 50% ma la quadratura non è perfetta, a 1 kHz.. non ho ancora idea del perché, avendo usato due timer in configurazione master/slave credevo che eventuali imperfezioni si sarebbero notate a frequenze più alte..

Comunque tra qualche giorno mi dedico totalmente alla periferica dell'encoder, tenendo presente che l'encoder di riferimento per il progetto ha un grado di precisione elevato.
Avatar utente
Foto UtenteHad3s
35 5
New entry
New entry
 
Messaggi: 67
Iscritto il: 20 ago 2021, 11:50

0
voti

[20] Re: STM32 PWM in quadratura

Messaggioda Foto UtenteHad3s » 16 giu 2025, 18:55

Salve, come ho asserito nel precedente messaggio il PWM master/slave funziona con due segnali PWM in uscita in quadratura sulle due porte da TIM1 e TIM2 (che sono riuscito a sistemare ( frequenza di clock a 48 MHz, allego immagini delle settings di TIM1 da cube ide)), sto tentando di implementare una funzione che cambia la frequenza dei due segnali, riportata di seguito:
Codice: Seleziona tutto
void ChangePWMFrequency(uint32_t new_frequency) {
    pwm_freq = new_frequency;
    arr = SystemCoreClock / pwm_freq;  //  SystemCoreClock is your timer clock frequency
    ccr = arr / 2; // Keeping duty cycle at 50%

    // Disable PWM output
    HAL_TIM_PWM_Stop(&htimx, TIM_CHANNEL_1);
    HAL_TIM_OC_Stop(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Stop(&htim2, TIM_CHANNEL_1);

    // Update ARR and CCR registers
    __HAL_TIM_SET_AUTORELOAD(&htim1, arr);
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, ccr);
    __HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, ccr/2); // Keeping quadrature between the two

    // Re-enable PWM output
    HAL_TIM_PWM_Start(&htimx, TIM_CHANNEL_1);
    HAL_TIM_OC_Start(&htim1, TIM_CHANNEL_2);
    HAL_TIM_PWM_Start(&htim2, TIM_CHANNEL_1);
}


al momento sto cercando ancora di far partire la funzione gestendola con un interrupt, se ci sono considerazioni sulla funzione così come riportata, sono tutt'orecchi.

Screenshot at 2025-06-16 18-40-59.png
Modo operativo di TIM1

Screenshot at 2025-06-16 18-41-23.png
Configuration settings di TIM1


allego anche la tabella che riporta l'ordine delle connessioni tra i timer in modalità trigger
Screenshot at 2025-06-16 18-51-31.png
tabella dal reference manual del stm32f401x


* in un altro caso seguendo le stesse istruzioni ma cambiando i valori ( frequenza di clock a 16 MHz, auto reload register = 15999 e i pulse sistemati in modo da mantenere le stesse caratteristiche di duty cycle e quadratura ) TIM1 da in uscita il segnale PWM di 1 kHz ma da TIM2 non c'è alcuna uscita e la cosa mi rosica molto...
Avatar utente
Foto UtenteHad3s
35 5
New entry
New entry
 
Messaggi: 67
Iscritto il: 20 ago 2021, 11:50

PrecedenteProssimo

Torna a Firmware e programmazione

Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti