STM32 TIM1使用COM更新设置时,PWM输出延时(不同步)的问题。
主程序中:main(){for(;;){TIM_GenerateEvent(TIM1,TIM_EventSource_COM);//触发COM中断delay10ms();...
主程序中:
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;
} 展开
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;
} 展开
2个回答
展开全部
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Disable); //如果使能则定时器等待下一次定时器溢出才会发生变化 -- 同步
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); //不使能则会立即发生变化 -- 异步
所以不使能的话就会立刻变化,今天遇到相同的问题翻芯片手册才看到这个。
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable); //不使能则会立即发生变化 -- 异步
所以不使能的话就会立刻变化,今天遇到相同的问题翻芯片手册才看到这个。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
通道初始化时有效电平位和极性位,改其中之一即可
更多追问追答
追问
改了,但只是极性和有效电平会发生变化,延时仍然存在.我开始也以为是自已写的程序有问题 我用的是V3.5的库,试了一下EXSAMPLE/TIM/6Steps的例子,加入一个引脚,并在换相时输出高低电平对就换相电平,其它的都没动,发现也存在同样的问题.也就是说,当想进行换相的时候,比如你当前使能了A相,结果在使能B相时,A相才刚开始输出,不信你可以试一下.要实际试才能发现,我用的是KEIL MDK,模拟波形正常,但下载到硬件运行与模拟完全不同.
追答
初始化成互补输出就行了.不要禁止,通道值赋0就关闭了,另外你初始化有没有使能预装载呢?
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询