19,498
社区成员
发帖
与我相关
我的任务
分享
我用STM32F429的TIM1_CH1和TIM1_CH1N输出互补的PWM,在频率低于150KHz的时候,输出都正常,当频率为220KHz的时候,TIM1_CH1无输出,TIM1_CH1N正常输出,不知道什么情况。
void bsp_TIM_PWM_OUT(uint32_t arr, uint32_t psc)
{
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_BDTRInitTypeDef TIM_BDTRInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* 连接到AF功能 */
GPIO_PinAFConfig(GPIOA, GPIO_PinSource8, GPIO_AF_TIM1);
GPIO_PinAFConfig(GPIOA, GPIO_PinSource7, GPIO_AF_TIM1);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_7; /* 带入的形参 */
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP ;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Prescaler = psc;//PSC
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_Period = arr;//ARR
TIM_TimeBaseStructure.TIM_ClockDivision = 0;//设置时钟分割TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;//TIM1 和 TIM8 必须设置
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
TIM_ClearFlag(TIM1,TIM_FLAG_CC1);
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
//TIM_SelectOnePulseMode(TIM1,TIM_OPMode_Single);//单脉冲模式
//TIM_SelectInputTrigger(TIM1,TIM_TS_ITR1);//定时器1内部触发
//TIM_SelectSlaveMode(TIM1,TIM_SlaveMode_Trigger);
/* UTG[7:0]: 死区发生器设置(Dead-time generator setup) 位7:0
这些位定义了插入互补输出之间的死区持续时间。假设DT表示其持续时间:
DTG[7:5]=0xx => DT=DTG[7:0] ×Tdtg,Tdtg = TDTS;
DTG[7:5]=10x => DT=(64+DTG[5:0]) ×Tdtg,Tdtg = 2 ×TDTS;
DTG[7:5]=110 => DT=(32+DTG[4:0]) ×Tdtg,Tdtg = 8 ×TDTS;
DTG[7:5]=111 => DT=(32+DTG[4:0])×Tdtg,Tdtg = 16 ×TDTS;
例:若TDTS = 125ns(8MHZ),可能的死区时间为:
0到15875ns,若步长时间为125ns;
16us到31750ns,若步长时间为250ns;
32us到63us,若步长时间为1us;
64us到126us,若步长时间为2us;
注:一旦LOCK级别(TIMx_BDTR寄存器中的LOCK位)设为1、2或3,则不能修改这些位。
*/
TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
TIM_BDTRInitStructure.TIM_DeadTime = 0;//(168*400)/1000/2=33.6 33.6x(1/168)=0.2us
TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
//TIM1->BDTR |= 1<<15;
/* TIMx enable counter */
TIM_Cmd(TIM1, ENABLE);
TIM_CtrlPWMOutputs(TIM1, ENABLE);
}
bsp_TIM_PWM_OUT(254,2);
TIM_SetCompare1(TIM1,127);