设计小工人 2022-08-15 22:37 采纳率: 0%
浏览 74

STM32F4输出PWM问题。

我用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);
  • 写回答

1条回答 默认 最新

  • zhujinsheng1988 2022-08-16 14:08
    关注

    考虑速度是否达不到,主频时钟有多少?经过分频和一个周期的计数值PWM最大的输出频率能达到多少?然后尝试调整你的分频值和周期计数值。希望能帮到你。

    评论

报告相同问题?

问题事件

  • 创建了问题 8月15日

悬赏问题

  • ¥15 2020长安杯与连接网探
  • ¥15 关于#matlab#的问题:在模糊控制器中选出线路信息,在simulink中根据线路信息生成速度时间目标曲线(初速度为20m/s,15秒后减为0的速度时间图像)我想问线路信息是什么
  • ¥15 banner广告展示设置多少时间不怎么会消耗用户价值
  • ¥16 mybatis的代理对象无法通过@Autowired装填
  • ¥15 可见光定位matlab仿真
  • ¥15 arduino 四自由度机械臂
  • ¥15 wordpress 产品图片 GIF 没法显示
  • ¥15 求三国群英传pl国战时间的修改方法
  • ¥15 matlab代码代写,需写出详细代码,代价私
  • ¥15 ROS系统搭建请教(跨境电商用途)