STM32 TIM1使用COM更新设置时,PWM输出延时(不同步)的问题。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了STM32 TIM1使用COM更新设置时,PWM输出延时(不同步)的问题。相关的知识,希望对你有一定的参考价值。

主程序中:
main()

for(;;)

TIM_GenerateEvent(TIM1, TIM_EventSource_COM); //触发COM中断
delay10ms(); //延时10ms



TIM1的COM中断测试程序:
void TIM1_TRG_COM_IRQHandler(void) //TIM1_COM事件

TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
switch(Step)

case D_PHASE_1:
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PORTC.13输出高电平
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); //输出PWM
break;
case 2:
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //PORTC.13输出低电平
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); //禁止PWM
break;
default:
break;

通过模拟:GPIOC.13高低与PWM输出高(有)低(无)完全同步
但是实际测试时,用示波器看到的波形却是:GPIOC.13为高时,PWM无输出,GPIOC.13为低时,PWM有输出,与模拟的结果完全相反,PWM输出延时了180度,请问这个问题该怎么解决?
程序有点问题,更正如下
unsigned char Step=0;
main()

TIM1Init(); //TIM1初始化
for(;;)

Setp++;
if(Setp>2)Setp=1;
TIM_GenerateEvent(TIM1, TIM_EventSource_COM); //触发COM中断
delay10ms(); //延时10ms



TIM1的COM中断测试程序:
void TIM1_TRG_COM_IRQHandler(void) //TIM1_COM事件

TIM_ClearITPendingBit(TIM1, TIM_IT_COM);
switch(Step)

case 1:
GPIO_SetBits(GPIOC,GPIO_Pin_13); //PORTC.13输出高电平
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Enable); //输出PWM
break;
case 2:
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //PORTC.13输出低电平
TIM_CCxCmd(TIM1, TIM_Channel_1, TIM_CCx_Disable); //禁止PWM
break;
default:
break;

参考技术A TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Disable); //如果使能则定时器等待下一次定时器溢出才会发生变化 -- 同步
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); //不使能则会立即发生变化 -- 异步
所以不使能的话就会立刻变化,今天遇到相同的问题翻芯片手册才看到这个。
参考技术B 通道初始化时有效电平位和极性位,改其中之一即可追问

改了,但只是极性和有效电平会发生变化,延时仍然存在.我开始也以为是自已写的程序有问题 我用的是V3.5的库,试了一下EXSAMPLE/TIM/6Steps的例子,加入一个引脚,并在换相时输出高低电平对就换相电平,其它的都没动,发现也存在同样的问题.也就是说,当想进行换相的时候,比如你当前使能了A相,结果在使能B相时,A相才刚开始输出,不信你可以试一下.要实际试才能发现,我用的是KEIL MDK,模拟波形正常,但下载到硬件运行与模拟完全不同.

追答

初始化成互补输出就行了.不要禁止,通道值赋0就关闭了,另外你初始化有没有使能预装载呢?

追问

我是直接使用V3.5固定库里的:EXSAMPLE/TIM/6Steps例子来做的测试,在源程序的基础上增加一个引脚,并在COM事件换相时改变引脚高低电平,这么说,是CH1(如果互补CH1N与CH1同步)与加入的引脚在高低电平上不同步,比如CH1使能输出,外加引脚输出高电平,禁止输出低电平,就这么简单,但实际观察两者有相位差,比如我每隔10ms进行一次换相,两者就差10ms,也就是引脚先高电平,过10ms PWM才出来.预装载有使能,但通道值赋0是指什么,怎么做?

追答

使能与装载后就是差一个周期,因为是下一个更新周期才实际变化

追问

所有换相都有一个周期性的延时.问题来了,比如我过零检测到AB相需要换相,换相后AB驱动却没有输出,过零过了一个周期到AC相过零时,AC相换相的结果就是输出的是AB相的驱动,BC换相却是AC驱动...其后果就是电机不能正常转动.如果会延时一个周期,COM事件中的换相有什么意义?虽然我已经通过别的方法解决了电机正确换相的问题,但我不明白的是,如何使用COM来对电机进行换相?有没有可用的,现成的例子参考一下,这个问题我纠结了很久了.

追答

啥叫换相啊?不太明白你的问题.你是做三相步进电机控制吧,要是我写这个程序就是在更新中断里刷新三个通道值,这三个值从spwm表中取出的值各差120度相位,如果每次更新是各通道指针+就正传如果-就反转了.spwm的表中相位0的数据点是可知的,啥时更改正负输出也是已经知道的了.

追问

前面没有说清楚,三相无刷直流电机无位置检测的启动和速度控制,比如硬盘用的电机.我现在也是在更新中断中刷新相位,一切正常.但COM中断难道不是用来控制电机用的?这个问题以后我自己再研究了,谢谢你的回答,过年快到了,先祝你新年快乐!

本回答被提问者采纳

以上是关于STM32 TIM1使用COM更新设置时,PWM输出延时(不同步)的问题。的主要内容,如果未能解决你的问题,请参考以下文章

stm32做PWM,比如我用TIM1来产生PWM,那么是否PWM的频率就是TIM1的频率?

STM32F207使用定时器1产生PWM波形

STM32F1高级定时器做普通PWM输出配置(例TIM1)

stm32通用定时器产生pwm时 模式1和模式2有啥区别

STM32笔记之PWM输出,调节频率及占空比

stm32寄存器版学习笔记05 PWM