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****/
定时器配置代码:
#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);
}
截图截长一点吧,这个有点短,不过你这个MOS这么长时间才完全关断确实有些问题,你把MCU发出的PWM和gate driver输出的信号放在一起对比,看一下是不是driver输出信号不正常。MOS关断不完全有可能是gate driver设计的问题。 断开负载和藕和电路,看波形输出是否还这样,如若无,那是负载和藕和电路不合理,如有,改引脚的输出控制试试。 找到问题了,下面这句dai ma的问题,系统滴答定时器,如果不传入能够被168000000(系统时钟)整除的数给计数器,
就会出现问题。很无奈,不知道里面是什么构造,是什么原理。
if (SysTick_Config(840000))//(SystemCoreClock) / 200))//190))//166))//165))
感谢:子曰好人,麦克凯
(可以结贴了吗?)
很赞
页:
[1]