打印
[信息]

求助!

[复制链接]
867|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
flycamelaaa|  楼主 | 2021-6-7 15:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的想法是:
        使用通用定时器输出PWM,其中tiM2_CH1正常输出PWM,TIM2_CH2作为移相计数器,通过TIM2_CH2来触发TIM3,TIM3动作时刻由TIM2_CH2高电平持续时间决定,那么通过控制TIM2捕获比较2的值来改变TIM2_CH2的脉宽,就可以控制移相角度。实现方法涉及到定时器的“主\从”工作模式,也就是通过一个定时器(TIM2)触发另一个定时器(TIM3)。
问题是:
       在程序持续运行的过程中,使用示波器观察,只有第一次给TIM2捕获比较2赋值生效【TIM_SetCompare2(TIM2, TIMCompare2)】,之后再改变TIMCompare2的值就不生效了,是不是哪个标志没有清除掉导致的?
        小弟只有8分积分,都贡献出来了,希望高手能指导12,谢谢啦!
以下为相关代码:
1.定时器配置部分
   TIM_TimeBaseInitTypeDef TimeBaseStruct;

  TIM_OCInitTypeDef TIM_OCInitStructure;

  GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);

  TimeBaseStruct.TIM_Period=90;//200KHz
  TimeBaseStruct.TIM_Prescaler=3;//18MHz
  TimeBaseStruct.TIM_clockDivision=0;
  TimeBaseStruct.TIM_CounterMode=TIM_CounterMode_Up;//ÏòÉϼÆÊýģʽ
  
  //TIM_ARRPreloadConfig(TIM2, ENABLE);
  //TIM_ARRPreloadConfig(TIM3, ENABLE);
  
  TIM_TimeBaseInit(TIM2,&TimeBaseStruct); //³õʼ»¯¶¨Ê±Æ÷  
  TIM_TimeBaseInit(TIM3,&TimeBaseStruct); //³õʼ»¯¶¨Ê±Æ÷
  

  TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;//Êä³öģʽ£¨PWM1£©
  TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//pwmʹÄÜλ
TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;//Êä³ö¼«ÐÔ

  TIM_OC1Init(TIM2,&TIM_OCInitStructure);//ʹÄÜTIM2µÄͨµÀ1
  TIM_OC1PreloadConfig(TIM2,TIM_OCPreload_Enable);//ÖØ×°ÔØ


  //TIM2_CH2
  TIM_OC2Init(TIM2,&TIM_OCInitStructure);//ʹÄÜTIM3µÄͨµÀ2
  TIM_OC2PreloadConfig(TIM2,TIM_OCPreload_Enable);//ÖØ×°ÔØ
  TIM_OC2Init(TIM2,&TIM_OCInitStructure);//ʹÄÜTIM3µÄͨµÀ1
  //TIM3_CH1
  TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;//pwmʹÄÜλ
  TIM_OC1Init(TIM3,&TIM_OCInitStructure);//ʹÄÜTIM3µÄͨµÀ1
  TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);//ÖØ×°ÔØ
  
   TIM_SelectOutputtrigger(TIM2, TIM_TRGOSource_OC2Ref); //使用TIM2_CH2作为触发源
  TIM_SelectMasterSlaveMode(TIM2, TIM_MasterSlaveMode_Enable);  
  TIM_SelectInputTrigger(TIM3, TIM_TS_ITR1);        //当TIM2作为TIM3的触发源的标志位ITR1
  TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Trigger);  
  
  TIM_Cmd(TIM2,ENABLE);//´ò¿ªTIM3

2.主函数部分
   TIM_SetCompare1(TIM2,45);   
     TIM_SetCompare2(TIM2,30);      
     TIM_SetCompare1(TIM3,45);
     while(1)
     {  
        TIM_SetCompare2(TIM2,70);      //实际上只有这一句生效
          Delay_ms(500);  
        TIM_SetCompare2(TIM2,40);     //z这一句不生效
          Delay_ms(500);        
    }

使用特权

评论回复
沙发
討厭和人归類| | 2022-12-22 16:28 | 只看该作者
你赋值之后,那个值清零了没啊?

使用特权

评论回复
板凳
林间有新绿| | 2022-12-22 17:00 | 只看该作者
这个你仿真跟踪一下就好了,应该不是啥大问题

使用特权

评论回复
地板
一枝香| | 2022-12-22 17:32 | 只看该作者
按理来说,还得用jlink调试,不然不行的

使用特权

评论回复
5
偷吻月亮| | 2022-12-22 18:04 | 只看该作者
建议楼主可以这样,把工程发出来,这样能好帮你调试一些

使用特权

评论回复
6
笨蛋无需搭理| | 2022-12-22 18:36 | 只看该作者
我觉得用示波器不行,你只能看程序运行结果,你要是仿真能看运行过程

使用特权

评论回复
7
占得人间第一春| | 2022-12-22 19:08 | 只看该作者
给我的感觉就是数据没清掉呢

使用特权

评论回复
8
喜爱弄人| | 2022-12-22 19:40 | 只看该作者
你用定时器,然后一个全局变量++的方式,实现呗

使用特权

评论回复
9
漫过岁月| | 2022-12-22 20:12 | 只看该作者
你这是不是相当于,每次都初始化一下定时器啊

使用特权

评论回复
10
可爱的白兔先生| | 2022-12-22 20:44 | 只看该作者
你不要这么做,就用个变量加加就好了

使用特权

评论回复
11
情和欲| | 2022-12-22 21:16 | 只看该作者
这么做应该不OK吧,我觉得你不应该这么做,最好是定时器++的操作才行

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

667

主题

2832

帖子

0

粉丝