2024-08-14 08:00 AM - edited 2024-08-14 08:01 AM
Hi in custom design arrive problem , that seems as hard to solve. TIM3 CH1 and CH2 config:
TIM_TimeBaseStructInit(&timer);
timer.TIM_Prescaler = 1-1; //48Mhz/1/2000=24kHz
timer.TIM_Period = 2000-1;
timer.TIM_ClockDivision = 0;
timer.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM3, &timer);
TIM_OCStructInit(&timerPWM);
timerPWM.TIM_OCMode = TIM_OCMode_PWM1;
timerPWM.TIM_OutputState = TIM_OutputState_Enable;
timerPWM.TIM_Pulse = 1000;
timerPWM.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OC1Init(TIM3, &timerPWM);
TIM_OC1PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_OC2Init(TIM3, &timerPWM);
TIM_OC2PreloadConfig(TIM3, TIM_OCPreload_Enable);
TIM_Cmd(TIM3, ENABLE); /* TIM3 counter enable */
TIM_CtrlPWMOutputs(TIM3, ENABLE); /* TIM3 Main Output Enable */
TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE);
/* Enable the TIM3 Trigger and commutation interrupt */
NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);
and irq for speed up two phase sinewave from low to target speed.
All vars is volatile float except int16 deltaC.
void TIM3_IRQHandler(){
TIM_ClearITPendingBit(TIM3, TIM_IT_Update);
if(angle >= 360.0f) angle-=360.0f;
temp = (powerL1+deltaL1)*deg(angle);
TIM3->CCR1=floatToPWM(temp);
temp = (powerL1+deltaL1)*deg(angle+90.0f);
TIM3->CCR2=floatToPWM(temp);
angle+=anglestep+anglespd;
periodcnt++;
//error correction float
if((periodcnt%64)==0) angle-= 1.112620037940625e-7f;
if(deltaC==1) deltaL1=0.0f;
if(deltaC>0) deltaC--;
}
other irq on prio 1 handle anglestep speedup values. But issue is with line
temp = (powerL1+deltaL1)*deg(angle+90.0f);
on channel 2 sinewave shifted 90 deg. Code works ok, but on CH2 random jumps in signal and signal isnt shifted copy of perfect CH1. But only in speedup time = anglestep is changed repeatly. After speed is ok anglestep leave constant and CH1 CH2 works ok. Too if removed +90 both channels work equal. deg is in real sint func.
Have somebody any idea pls?
Solved! Go to Solution.
2024-08-14 08:55 AM - edited 2024-08-15 07:44 AM
Ofcourse i test subtract problem not solved, and header sint say supported -5400 to +5400 degree...
Mystery solved. My fault, speed up routine shift phase in max area of CH1 amplitude, and this result to invisible change on CH1 , but on CH2 +90 deg result to big jumps. Then no issue here, thanks.
2024-08-14 08:08 AM
Show the floatToPWM function. Does it handle angles over 360 appropriately?
Might as well show the deg function while you're at it.
2024-08-14 08:19 AM - edited 2024-08-14 08:41 AM
floatToPWM do convert +- 1.0f to 0-2000 PWM
deg is sint from STM32. Про синус / Хабр (habr.com)
But project is in KEIL , then maybe some float glitch...
2024-08-14 08:51 AM
Problem is deg/sint doesn't handle angles over 360. Need to check angle + 90 and subtract 360 if necessary before calling deg/sint.
No chance it's a float glitch.
2024-08-14 08:55 AM - edited 2024-08-15 07:44 AM
Ofcourse i test subtract problem not solved, and header sint say supported -5400 to +5400 degree...
Mystery solved. My fault, speed up routine shift phase in max area of CH1 amplitude, and this result to invisible change on CH1 , but on CH2 +90 deg result to big jumps. Then no issue here, thanks.