Extrao 发表于 2019-10-17 16:36:03

6步PWM波形奇异的事情

在用官方例程里面的输出6-PWM时发现一个问题(我用的是H-PWM,L-ON),就是上桥的输出波形右下角,这里的引脚好像没有马上关断,
电压是缓慢下降的,并且,这个异常的出现是有规律的,每间隔6个PWM-ON出现一次异常波形,然后每隔1个PWM-ON出现,然后再隔4个PWM-ON出现一次。我不知道是线间干扰,还是有寄生电容,还是代码写的有问题,我想这样来驱动电机势必出现混乱,心里十分不安,希望前辈指点。




定时器配置代码:

中断函数代码


/* Includes ------------------------------------------------------------------*/
#include "stm32f4xx_it.h"
//#include "main.h"

/** @addtogroup Template_Project
* @{
*/

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
__IO uint32_t uwStep = 0;


/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/

/******************************************************************************/
/*            Cortex-M4 Processor Exceptions Handlers                         */
/******************************************************************************/

/**
* @briefThis function handles NMI exception.
* @paramNone
* @retval None
*/
void NMI_Handler(void)
{
}

/**
* @briefThis function handles Hard Fault exception.
* @paramNone
* @retval None
*/
void HardFault_Handler(void)
{
/* Go to infinite loop when Hard Fault exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles Memory Manage exception.
* @paramNone
* @retval None
*/
void MemManage_Handler(void)
{
/* Go to infinite loop when Memory Manage exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles Bus Fault exception.
* @paramNone
* @retval None
*/
void BusFault_Handler(void)
{
/* Go to infinite loop when Bus Fault exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles Usage Fault exception.
* @paramNone
* @retval None
*/
void UsageFault_Handler(void)
{
/* Go to infinite loop when Usage Fault exception occurs */
while (1)
{
}
}

/**
* @briefThis function handles SVCall exception.
* @paramNone
* @retval None
*/
void SVC_Handler(void)
{
}

/**
* @briefThis function handles Debug Monitor exception.
* @paramNone
* @retval None
*/
void DebugMon_Handler(void)
{
}

/**
* @briefThis function handles PendSVC exception.
* @paramNone
* @retval None
*/
void PendSV_Handler(void)
{
}

/**
* @briefADC1 的看门狗中断.
* @paramNone
* @retval None
*/
void ADC_IRQHandler(void)
{
       
        ADC_ITConfig(ADC1, ADC_IT_AWD, DISABLE);
       
        if(SET == ADC_GetFlagStatus(ADC1, ADC_FLAG_AWD))
        {
                ADC_ClearFlag(ADC1, ADC_FLAG_AWD);
                ADC_ClearITPendingBit(ADC1, ADC_IT_AWD);
               
                GPIO_SetBits(GPIOD, GPIO_Pin_8);
                GPIO_ResetBits(GPIOD, GPIO_Pin_9);
        }
       
        ADC_ITConfig(ADC1, ADC_IT_AWD, ENABLE);
       
}

/**
* @briefThis function handles SysTick Handler.
* @paramNone
* @retval None
*/
void SysTick_Handler(void)
{
TIM_GenerateEvent(TIM1, TIM_EventSource_COM);
}

/******************************************************************************/
/*               STM32F4xx Peripherals Interrupt Handlers                   */
/*Add here the Interrupt Handler for the used peripheral(s) (PPP), for the*/
/*available peripheral interrupt handler's name please refer to the startup */
/*file (startup_stm32f4xx.s).                                             */
/******************************************************************************/

/**
* @briefThis function handles TIM1 Trigger and commutation and TIM11
*         global interrupts requests.
* @paramNone
* @retval None
*/


void TIM1_TRG_COM_TIM11_IRQHandler(void)
{
/* Clear TIM1 COM pending bit */
TIM_ClearITPendingBit(TIM1, TIM_IT_COM);

if (uwStep == 1)
{
    /* Next step: Step 2 Configuration -------------------------------------- */
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);

    TIM_ForcedOC2Config(TIM1, TIM_ForcedAction_Active);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
               
    uwStep++;
}
else if (uwStep == 2)
{
    /* Next step: Step 3 Configuration -------------------------------------- */
    TIM_ForcedOC2Config(TIM1, TIM_ForcedAction_Active);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Enable);
   
    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
               
    uwStep++;
}
else if (uwStep == 3)
{
    /* Next step: Step 4 Configuration -------------------------------------- */
    TIM_SelectOCxM(TIM1, TIM_Channel_3, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);

    TIM_ForcedOC1Config(TIM1, TIM_ForcedAction_Active);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);
               
    uwStep++;
}
else if (uwStep == 4)
{
    /* Next step: Step 5 Configuration -------------------------------------- */
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Disable);

    TIM_ForcedOC1Config(TIM1, TIM_ForcedAction_Active);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Enable);

    TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
               
    uwStep++;
}
else if (uwStep == 5)
{
    /* Next step: Step 6 Configuration -------------------------------------- */
    TIM_ForcedOC3Config(TIM1, TIM_ForcedAction_Active);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);

    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
               
    TIM_SelectOCxM(TIM1, TIM_Channel_2, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
               
    uwStep++;
}
else
{
    /* Next step: Step 1 Configuration -------------------------------------- */
    TIM_SelectOCxM(TIM1, TIM_Channel_1, TIM_OCMode_PWM1);
    TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable);
    TIM_CCxNCmd(TIM1, TIM_Channel_1, TIM_CCxN_Disable);
               
                TIM_ForcedOC3Config(TIM1, TIM_ForcedAction_Active);
    TIM_CCxCmd(TIM1, TIM_Channel_3, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_3, TIM_CCxN_Enable);
               
    TIM_CCxCmd(TIM1, TIM_Channel_2, TIM_CCx_Disable);
    TIM_CCxNCmd(TIM1, TIM_Channel_2, TIM_CCxN_Disable);
   
    uwStep = 1;
}
}







/**
* @}
*/


/************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE****/



Extrao 发表于 2019-10-17 16:37:38

定时器配置代码:

#define rsp_tim_GLOBAL

#include "rsp_tim.h"

//static uint8_t Conversion_SW = 1;
static void SysTickConfig(void);
static void TIMx_MODE_Config(void);
static void TIMx_GPIO_Config(void);

void TIMx_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        NVIC_InitTypeDef NVIC_InitStructure;
       
        RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);
        // 开启定时器时钟,即内部时钟CK_INT,等于168M
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);

       
        /* 定时器功能引脚初始化 */       
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;   
        GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
        /* 上桥 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9 | GPIO_Pin_11 | GPIO_Pin_13;// | GPIO_Pin_14;       
        GPIO_Init(GPIOE, &GPIO_InitStructure);
/* 下桥 */
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_10 | GPIO_Pin_12;       
        GPIO_Init(GPIOE, &GPIO_InitStructure);
/* 刹车 */
//GPIO_InitStructure.GPIO_OType = GPIO_OType_OD;
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;       
        GPIO_Init(GPIOE, &GPIO_InitStructure);
       
       
        /* 指定引脚复用功能 */
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource9,GPIO_AF_TIM1);   //TIM1_CH1
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource11, GPIO_AF_TIM1);   //TIM1_CH2
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource13, GPIO_AF_TIM1);   //TIM1_CH3
        //GPIO_PinAFConfig(GPIOE, GPIO_PinSource14, GPIO_AF_TIM1);   //TIM1_CH4
       
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource8,GPIO_AF_TIM1);   //TIM1_CH1N
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource10, GPIO_AF_TIM1);   //TIM1_CH2N
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource12, GPIO_AF_TIM1);   //TIM1_CH3N
        GPIO_PinAFConfig(GPIOE, GPIO_PinSource15, GPIO_AF_TIM1);   //TIM1_BKIN
       
        /* Enable the TIM1 Trigger and commutation interrupt */
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
        NVIC_InitStructure.NVIC_IRQChannel = TIM1_TRG_COM_TIM11_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitStructure);   
}

void TIMx_MODE_Config(void)
{
        TIM_TimeBaseInitTypeDefTIM_TimeBaseStructure;
TIM_OCInitTypeDef      TIM_OCInitStructure;
        TIM_BDTRInitTypeDef      TIM_BDTRInitStructure;
       
       
        /* Time Base configuration */
        /* 预分频器不分频 */
TIM_TimeBaseStructure.TIM_Prescaler = 1-1;
        /* 向上计数 */
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
        /* PWM周期 */
TIM_TimeBaseStructure.TIM_Period = 8400-1;
        /* 分频因子 */
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
        /* 不使用重复计数器 */
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);

       
/* Channel 1, 2,3 and 4 Configuration in PWM mode */
        /* 输出比较模式 */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_Timing;
        /* 主、互输出使能 */
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
        /* 主、互输出,高为有效电平 */
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
        /* 主、互输出被禁止时的电平状态 */
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
       
        /* 输出比较1占空比 */
TIM_OCInitStructure.TIM_Pulse = 1600;
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
       
TIM_OCInitStructure.TIM_Pulse = 1600;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);

TIM_OCInitStructure.TIM_Pulse = 1600;
TIM_OC3Init(TIM1, &TIM_OCInitStructure);

/* Automatic Output enable, Break, dead time and lock configuration*/
        /* 运、空模式下关闭状态的选择 */
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
        /* 锁定配置 */
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
        /* 死区时间 */
TIM_BDTRInitStructure.TIM_DeadTime = 9;
        /* 刹车使能 */
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
        /* Break引脚为高电平,禁止输出 */
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
        /* 自动输出 */
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;

TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);

TIM_CCPreloadControl(TIM1, ENABLE);

TIM_ITConfig(TIM1, TIM_IT_COM, ENABLE);

/* TIM1 counter enable */
TIM_Cmd(TIM1, ENABLE);

/* Main Output Enable */
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}

void TIMx_Config(void)
{
        SysTickConfig();
        TIMx_GPIO_Config();
        TIMx_MODE_Config();
}

static void SysTickConfig(void)
{
/* Setup SysTick Timer for 100 msec interrupts*/
if (SysTick_Config((SystemCoreClock) / 190))//166))//165))
{
    /* Capture error */
    while (1);
}

NVIC_SetPriority(SysTick_IRQn, 0);
}

子曰好人 发表于 2019-10-18 09:01:19

截图截长一点吧,这个有点短,不过你这个MOS这么长时间才完全关断确实有些问题,你把MCU发出的PWM和gate driver输出的信号放在一起对比,看一下是不是driver输出信号不正常。MOS关断不完全有可能是gate driver设计的问题。

mikecai 发表于 2019-10-18 09:18:39

断开负载和藕和电路,看波形输出是否还这样,如若无,那是负载和藕和电路不合理,如有,改引脚的输出控制试试。

Extrao 发表于 2019-10-18 17:05:30

找到问题了,下面这句dai ma的问题,系统滴答定时器,如果不传入能够被168000000(系统时钟)整除的数给计数器,

就会出现问题。很无奈,不知道里面是什么构造,是什么原理。

if (SysTick_Config(840000))//(SystemCoreClock) / 200))//190))//166))//165))

感谢:子曰好人,麦克凯




(可以结贴了吗?)

herman2019 发表于 2019-10-18 20:05:53

很赞
页: [1]
查看完整版本: 6步PWM波形奇异的事情