[AT32F407] 6定时器同时发50K脉冲,引脚翻转迟钝丢脉冲

[复制链接]
859|20
手机看帖
扫描二维码
随时随地手机跟帖
fuquan19801117|  楼主 | 2021-11-18 18:54 | 显示全部楼层 |阅读模式
我是用TMR3,TMR6,TMR10,TMR11,TMR14,TMR13配置定时器溢出中断(中断中有变量做计数),在中断中反转引脚发脉冲频率50K,并设置脉冲数量1000000个。用TMR2做计数器对其中的一个脉冲引脚计数,TMR2-CNT的数值总会少几个(无规律),但是中断中变量的计数值是正确的和设置的脉冲数一样。这时我用一个定时器发脉冲,然后发现计数器的计数值和发的脉冲数都对,此时感觉是否雅特力的AT32F407VGT7引脚是否反转速度跟不上中断呢?大家测试一下吧!以前是用LPC1768FBD100和STM32还没发现这个情况。

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-19 08:13 | 显示全部楼层
已解决

使用特权

评论回复
vt2017| | 2021-11-19 09:12 | 显示全部楼层

能否说明一下解决方法,或者问题原因呢?

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 13:21 | 显示全部楼层
经过几天的测试并未解决,问题还是在。

使用特权

评论回复
ArterySW| | 2021-11-21 15:10 | 显示全部楼层
fuquan19801117 发表于 2021-11-21 13:21
经过几天的测试并未解决,问题还是在。

你好能把测试代码发一下吗

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 15:43 | 显示全部楼层
void TmrFeqSet(TMR_Type *TIMx,uint32_t Ferq ,FunctionalState NewState)
{
  TMR_TimerBaseInitType  TMR_TMReBaseStructure;
        uint32_t uiTIMxCLK;
        uint16_t usPeriod;
        uint16_t usPrescaler;
        //ÔÝÍ£¶¨Ê±Æ÷
        TMR_Cmd(TIMx, DISABLE);
        /* APB ¶¨Ê±Æ÷ */
        uiTIMxCLK = SystemCoreClock;
        //
        if (Ferq < 100)
        {
                usPrescaler = 10000 - 1;                                        /* ·ÖƵ±È = 1000 */
                usPeriod =  (uiTIMxCLK / 10000) / Ferq  - 1;                /* ×Ô¶¯ÖØ×°µÄÖµ */
        }
        else if (Ferq < 5000)
        {
                usPrescaler = 100 - 1;                                        /* ·ÖƵ±È = 100 */
                usPeriod =  (uiTIMxCLK / 100) / Ferq  - 1;                /* ×Ô¶¯ÖØ×°µÄÖµ */
        }
        else        /* ´óÓÚ5KµÄƵÂÊ£¬ÎÞÐè·ÖƵ */
        {
                usPrescaler = 0;                                        /* ·ÖƵ±È = 1 */
                usPeriod = uiTIMxCLK / Ferq - 1;        /* ×Ô¶¯ÖØ×°µÄÖµ */
        }
        //
        TMR_TimeBaseStructInit(&TMR_TMReBaseStructure);
       
        TMR_SetCounter(TIMx, 0);
        //
  TMR_TMReBaseStructure.TMR_Period = usPeriod;
  TMR_TMReBaseStructure.TMR_DIV = usPrescaler;
  TMR_TMReBaseStructure.TMR_ClockDivision = 0;
  TMR_TMReBaseStructure.TMR_CounterMode = TMR_CounterDIR_Up | (1<<2);
        //
  TMR_TimeBaseInit(TIMx, &TMR_TMReBaseStructure);
        //
        TMR_ARPreloadConfig(TIMx,ENABLE);
  /* Prescaler configuration */
  TMR_DIVConfig(TIMx, usPrescaler, TMR_DIVReloadMode_Immediate);
  /* TMR IT enable */
  TMR_INTConfig(TIMx, TMR_INT_Overflow, NewState);
        //
        TMR_ClearITPendingBit(TIMx, TMR_INT_Overflow);
  /* TMR2 enable counter */
  TMR_Cmd(TIMx, NewState);
}

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 18:45 | 显示全部楼层
92980619a232a76262.png

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 18:46 | 显示全部楼层
中断中翻转引脚为什么占空比差那么多呢?

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 18:49 | 显示全部楼层
62084619a24062e02d.png

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 18:50 | 显示全部楼层
100K的脉冲频率。

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-21 18:53 | 显示全部楼层
ArterySW    这个简单的定时器中断中翻转引脚,自己写一个每秒中断200K次的程序,没中断1次翻转1次引脚。测测吧!希望官方的自己测测

使用特权

评论回复
vt2017| | 2021-11-22 09:22 | 显示全部楼层
fuquan19801117 发表于 2021-11-21 15:43
void TmrFeqSet(TMR_Type *TIMx,uint32_t Ferq ,FunctionalState NewState)
{
  TMR_TimerBaseInitType  TM ...

麻烦再贴一下你的中断代码吧,谢谢

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-22 10:58 | 显示全部楼层
void TMR3_GLOBAL_IRQHandler(void)
{
        //Y2¶Ë¿ÚÂö³å
  if (TMR_GetINTStatus(TIMERx, TMR_INT_Overflow) != RESET)
  {
    TMR_ClearITPendingBit(TIMERx, TMR_INT_Overflow);
                (Tmr3Int[PluseStr.MC_Mode[0]])(); //²éÕÒÖ¸ÁîÀàÐÍ
  }
}

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-22 10:59 | 显示全部楼层
const Axis0 Tmr3Int[]={
        MC_DRVACH0, //¾ø¶ÔÏà¶Ô¶¨Î»
};

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-22 11:00 | 显示全部楼层
void MC_DRVACH0(void)
{
        if(PluseStr.PluseCont[0]<PluseStr.TolPluse[0])
        {
                if(Y0portval)
                {
                        PLC_Y0_OFF;
                }
                else
                {
                        PLC_Y0_ON;
                        PluseStr.PluseCont[0]+=1;                       
                }                       
        }
        else
        {
                PLC_Y0_OFF;
                停止计数器再此
        }
}

使用特权

评论回复
vt2017| | 2021-11-22 11:11 | 显示全部楼层
本帖最后由 vt2017 于 2021-11-22 11:12 编辑

我这边按照你说的配置测试没有发现你说的问题,5us进一次溢出中断,采10s就是会进1000000次中断,然后用Excel计算每次翻转的时间(附件里面表格的C列),基本上都在5us,表格以及main.c文件都在附件。附件: toggle.rar (863.83 KB, 下载次数: 2)

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-22 11:32 | 显示全部楼层
本帖最后由 fuquan19801117 于 2021-11-22 11:47 编辑

好的我再看看

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-22 12:03 | 显示全部楼层
请问如果在代码里加入一个高优先级的定时器以0.1ms的频率定时处理其他函数会不会造成上面的现象?

使用特权

评论回复
fuquan19801117|  楼主 | 2021-11-22 12:43 | 显示全部楼层
多发几次,有时候是正常的

使用特权

评论回复
vt2017| | 2021-11-22 13:50 | 显示全部楼层
fuquan19801117 发表于 2021-11-22 12:03
请问如果在代码里加入一个高优先级的定时器以0.1ms的频率定时处理其他函数会不会造成上面的现象? ...

如果是在高优先级中断里调用的函数执行时间较长的话是会有影响的。可以在这个高优先级的中断函数的开始和结束翻转一个IO,看这个中断函数总共耗时是多久。

使用特权

评论回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则