STM32F4输出PWM问题。

设计小工人 2022-08-15 22:37:07

我用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);

 

...全文
100 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
CSDN-Ada助手 2023-01-13
  • 打赏
  • 举报
回复
您可以前往 CSDN问答-嵌入式 发布问题, 以便更快地解决您的疑问

19,498

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 嵌入开发(WinCE)
社区管理员
  • 嵌入开发(WinCE)社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧