TIM1互补输出要先开启死区功能才能输出互补通道波形。在TIM1_BDTR寄存器的MOE位和OSSI位必须设置正确,BDTR寄存器的DTG[7:0]设置死区时间,同时要使能死区功能BD(0x09)。
我之前也遇到过这个问题,配置TIM1互补输出只有主通道有波形,互补通道没输出。最后发现没有配置TIM1的BDTR寄存器,特别是MOE主输出使能位和死区功能没有开启。代码如下: TIM1_BDTRConfig(0x00000900); //MOE=1, OSSI=1,死区时间根据需要设置。
STM32F10x的TIM1高级定时器互补输出必须配置BDTR寄存器才能正常输出互补通道。用户代码中缺少TIM_BDTRInitTypeDef的配置和TIM_BDTRConfig函数调用。没有死区配置,互补输出就是不工作。
问题出在没有调用TIM_CtrlPWMOutputs(TIM1, ENABLE); 这个函数必须在配置OC引脚后调用,否则互补输出不会工作。即使配置了死区,也要这个函数配合。
完整配置流程:1.先配置GPIO为复用推挽,2.配置TIM1时基和OC,3.配置BDTR死区,4.TIM_Cmd(TIM1, ENABLE); 5.TIM_CtrlPWMOutputs(TIM1, ENABLE); 缺少第4、5步互补通道不会输出。
用户代码看到GPIO_Pin_8是TIM1_CH1,应该是PA8和PA9或PB13互补。确认GPIO配置了正确的互补引脚,如PA9也要配置成AF_PP。F10x系列TIM1_CH1N是PB13或PA9,要看芯片封装。
另一个常见问题是CCR值设置太小或ARR设置问题,但主要是BDTR没配。贴个标准代码片段:
TIM_BDTRInitTypeDef TIM_BDTRInitStructure; TIM_BDTRInitStructure.TIM_DeadTime = 0x09; TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable; TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF; TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable; TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High; TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable; TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);然后调用TIM_CtrlPWMOutputs(TIM1, ENABLE);
FAQ
Q: 为什么STM32普通定时器没有互补输出?
A: 只有高级定时器TIM1和TIM8才有互补输出和死区功能,普通定时器不支持。
Q: 配置完BDTR后还是没输出怎么办?
A: 确保调用了TIM_CtrlPWMOutputs(TIM1, ENABLE); 和检查GPIO是否正确配置为AF_PP。
Q: 死区时间怎么设置?
A: TIM_DeadTime = 0x0~0xFF,对应72MHz时钟下约0.165us~42us死区时间,根据需要调整。
Q: 互补输出引脚是哪些?
A: TIM1_CH1/CH1N: PA8/PB13或PA9,TIM1_CH2/CH2N: PA9/PB14或PB0,具体看数据手册引脚定义。