Har länge sett att det kommer små fel i PWM signalen lite till och från.
Och efter min Motor H-bridge lösning som jag posta tidigare så har detta kommit mer än tidigare, troligtvis iaf.
Saken är att jag uppdaterar PWM duty cycle varje ms, och i bland verkar inte PWM signalen funka efter uppdateringen.
utan hoppar igång nästa uppdatering ist.
felet är inte regelbundet utan kommer och går.
Jag har länge letat efter hur man uppdaterar PWM kanalerna på STM32 mcu som jag jobbar mot.
Har sett detta problem tidigare på andra konstruktioner när jag har styrt buzzers via PWM, då löste jag det med att inte uppdatera så ofta vilket minimera problemet.
Men de vill/kan jag inte göra här.
Jag har ytterligare ett kort som jag har testat och det är samma fel där, så det är inte fel på chippet om det inte är en bugg.
Jag har kollat direkt på utgången på STM32 och det är samma fel där.

här kan man se att signalen är tyst i en millisekund

vid dessa tester så uppdaterar jag med samma värden , duty = 50%
Någon som har koll på hur man uppdaterar PWM timer på bästa sätt ?
uppdaterings koden
Kod: Markera allt
void SetMotorPWM(signed int MotorA, signed int MotorB)
{
TIM_OCInitTypeDef TIM_OCInitStructure;
// Normalize values
if(MotorA < -2000)
{MotorA = -2000;}
else if(MotorA > 2000)
{MotorA = 2000;}
if(MotorB < -2000)
{MotorB = -2000;}
else if(MotorB > 2000)
{MotorB = 2000;}
/* PWM1 Mode configuration: Motor Channel A */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse = (unsigned int)(MotorA + 2000);
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
/* PWM1 Mode configuration: Motor Channel B */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_Pulse = (unsigned int)(MotorB + 2000);
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
}
Init koden som jag använder för TIM2 och kanal 2 & 3
Kod: Markera allt
void MotorPWMInit(void)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
unsigned int PrescalerValue;
// Configure the Motor A PWM output pin
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_PWM_A, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = PWM_A_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PWM_A_PORT, &GPIO_InitStructure);
// Configure the Motor B PWM output pin
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIO_PWM_B, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = PWM_B_PIN;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(PWM_B_PORT, &GPIO_InitStructure);
// Timer clock
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_AFIO, ENABLE);
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);
/* Time Base configuration */
TIM_TimeBaseStructure.TIM_Period = 4000;
TIM_TimeBaseStructure.TIM_Prescaler = 0;
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure);
/* PWM1 Mode configuration: Channel1 */
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_Pulse = 2000;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Reset;
// Motor A channel
TIM_OC2Init(TIM2, &TIM_OCInitStructure);
TIM_OC2PreloadConfig(TIM2, TIM_OCPreload_Enable);
// Motor B channel
TIM_OC3Init(TIM2, &TIM_OCInitStructure);
TIM_OC3PreloadConfig(TIM2, TIM_OCPreload_Enable);
TIM_ARRPreloadConfig(TIM2, ENABLE);
/* TIM1 enable counter */
TIM_Cmd(TIM2, ENABLE);
/* TIM1 Main Output Enable */
TIM_CtrlPWMOutputs(TIM2, ENABLE);
}