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...
Moderatore:
Paolino
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
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;
}
}
gill90 ha scritto:Se prendi un STM32 della famiglia F334 puoi usare il timer ad alta risoluzione HRTIM, che è particolarmente adatto a questo scopo.
MarcoD ha scritto:Mi sono divertito a scrivere il codice allegato.


MarcoD ha scritto:Avete idea quale sia la velocità massima di rotazione di un encoder, in giri/minuto (RPM) ?
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);
}
Torna a Firmware e programmazione
Visitano il forum: Nessuno e 9 ospiti