fuquan19801117 发表于 2021-11-18 18:54

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

我是用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-19 08:13
已解决

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

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_TimerBaseInitTypeTMR_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


fuquan19801117 发表于 2021-11-21 18:46

中断中翻转引脚为什么占空比差那么多呢?

fuquan19801117 发表于 2021-11-21 18:49


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_TimerBaseInitTypeTM ...

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

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])(); //²éÕÒÖ¸ÁîÀàÐÍ
}
}

fuquan19801117 发表于 2021-11-22 10:59

const Axis0 Tmr3Int[]={
        MC_DRVACH0, //¾ø¶ÔÏà¶Ô¶¨Î»
};

fuquan19801117 发表于 2021-11-22 11:00

void MC_DRVACH0(void)
{
        if(PluseStr.PluseCont<PluseStr.TolPluse)
        {
                if(Y0portval)
                {
                        PLC_Y0_OFF;
                }
                else
                {
                        PLC_Y0_ON;
                        PluseStr.PluseCont+=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文件都在附件。附件:


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,看这个中断函数总共耗时是多久。
页: [1] 2
查看完整版本: 6定时器同时发50K脉冲,引脚翻转迟钝丢脉冲