定时器延时抖动

2019-07-20 16:26发布



实现功能:STM32上升沿触发开启定时器,延时5us后在相应通道输出脉冲信号
做      法:使用STM32定时器单脉冲方式
问      题:用示波器观察延时精度,在时间轴上存在~15ns抖动
请问有没有可能完全去除抖动或者竟可能减小抖动,定时器相应的配置如下:
[mw_shl_code=applescript,true]void Onepulse_TIM4_Init(u16 arr,u16 psc)
{
        //此部分需手动修改IO口设置
        RCC->APB1ENR|=1<<2;         //TIM14时钟使能   
        RCC->AHB1ENR|=1<<1;           //使能PORTB时钟       

       
        //GPIO B6,B7初始化设置
        GPIO_AF_Set(GPIOB,6,2);        //PB6复用定时器4
        GPIO_Set(GPIOB,PIN6,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出


        GPIO_Set(GPIOB,PIN7,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
        GPIO_AF_Set(GPIOB,7,2);        //PB7复用定时器4

        GPIO_Set(GPIOB,PIN8,GPIO_MODE_AF,GPIO_OTYPE_PP,GPIO_SPEED_100M,GPIO_PUPD_PU);//复用功能,上拉输出
        GPIO_AF_Set(GPIOB,8,2);        //PB8复用定时器4
       
/*---------------------------------------------------------------
        TIM4定时器时钟为 84M
        TIM4_CH2配置成输入捕获模式  TIM4_CH1配置为PWM2输出模式
        TIM4_CH2检测到一个上升沿后,经过一定的延时时间,输出一个脉冲
        PWM2模式增计数下,计数值小于比较值为无效电平及低电平
-----------------------------------------------------------------*/
        TIM4->CR1|=1<<3;         //选择定时器为单脉冲模式
    TIM4->SMCR|=6<<4;                //选择触发源为IC2
        TIM4->SMCR|=6<<0;                //(触发模式),使用 TI2FP2 启动计数器



//-------------------------------------------------------------------------
         
         //TIM4->CCMR1|=1<<2;   //不延时输出
       
//--------------------------------------------------------------------------               
               
        //定时器设置
        TIM4->ARR=arr;                  //设定计数器自动重装值   
        TIM4->PSC=psc;                  //预分频器
        TIM4->CR1|=0<<8;         //不分频
        TIM4->CR1|=0<<4;         //增计数模式       
               
        //输入配置
        TIM4->CCMR1|=1<<8;                //CC2S=01         选择输入端 IC2映射到TI2上
        TIM4->CCER|=0<<5;                 //CC2P=0        上升沿捕获        CC2P=1        下降沿捕获       
        TIM4->CCMR1|=0<<12;                 //IC2F=0000 配置输入滤波器 不滤波
        TIM4->CCMR1|=0<<10;         //IC2PS=00         配置输入分频,不分频
        TIM4->CCER|=0<<7;                 //CC2NP=0       
        TIM4->CCER|=1<<4;                 //CC2E=1         允许捕获计数器的值到捕获寄存器中
                       
        //输出配置
        TIM4->CCMR1|=7<<4;          //CH1 PWM2模式                    
        TIM4->CCMR1|=1<<3;         //CH1 预装载使能               
        TIM4->CCER|=1<<0;           //OC1 输出使能       
        TIM4->CCER|=0<<1;           //OC1 高电平有效       
       
       
                        //输出配置CH3
        TIM4->CCMR2|=7<<4;          //CH1 PWM2模式                    
        TIM4->CCMR2|=1<<3;         //CH1 预装载使能               
        TIM4->CCER|=1<<8;           //OC3 输出使能       
        TIM4->CCER|=0<<9;           //OC3 高电平有效       
       
       
        TIM4->CR1|=1<<7;           //ARPE使能
}
[/mw_shl_code]
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
5条回答
kingnike
1楼-- · 2019-07-20 17:23
 精彩回答 2  元偷偷看……
正点原子
2楼-- · 2019-07-20 22:29
 精彩回答 2  元偷偷看……
周瑛子
3楼-- · 2019-07-21 03:22
正点原子 发表于 2017-3-6 18:17
15ns已经很小的了吧?  试试不用中断服务函数,直接改为全部硬件的方式,看看吧。

我没有使用中断方式,直接用单脉冲方式实现
周瑛子
4楼-- · 2019-07-21 06:01
kingnike 发表于 2017-3-6 16:11
IO口外部加上拉,切换为开漏输出模式,有可能是驱动力不够导致的。我猜

我明天试试。。。。另外延时时间上存在50ns误差,请问你觉得是什么原因造成的?
kingnike
5楼-- · 2019-07-21 09:51
周瑛子 发表于 2017-3-6 20:21
我明天试试。。。。另外延时时间上存在50ns误差,请问你觉得是什么原因造成的?

先检查下你的初始化代码,然后再看下是不是你的其他任务太多挤占了CPU,没有全部代码和环境,不好下结论。

一周热门 更多>