打印
[STM32F1]

STM32进入时间会飘

[复制链接]
1143|18
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
dck380394085|  楼主 | 2015-5-13 10:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
STM32进入定时器时间会飘,如何使其进入时间稳定,比如我输出75Hz  当用示波器看到的是在74.96到75.01之间飘动   而且频率也大,飘动的值也大 定时器里就做了一件输出取反   整个程序就只做了一个定时器工作 没有其他的东西
沙发
dck380394085|  楼主 | 2015-5-13 10:16 | 只看该作者

void Timer3_Init(unsigned int arr,unsigned int psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        NVIC_InitTypeDef NVIC_InitStructure;

        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能

        TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         计数到5000为500ms
        TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  10Khz的计数频率  
        TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = Tck_tim
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

        TIM_ITConfig(  //使能或者失能指定的TIM中断
                TIM3,
                TIM_IT_Update  |  //TIM 中断源
                TIM_IT_Trigger,   //TIM 触发中断源
                ENABLE  //使能
                );
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;  //从优先级1级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure);  //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器

        TIM_Cmd(TIM3, ENABLE);  //使能TIMx外设
                                                         
}

void TIM3_IRQHandler(void)   //TIM3中断
{
/*        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源
        {
                TIM_ClearITPendingBit(TIM3, TIM_IT_Update  );//清除TIMx的中断待处理位:TIM 中断源
                Spwm_Buffur_Out();
               
        }           */
        if(TIM3->SR&0X0001)
        {
        //        Spwm_Buffur_Out();       
                        LED1 = ~LED1;
                       
        }
        TIM3->SR = ~(1<<0);          
}

使用特权

评论回复
板凳
wowow| | 2015-5-13 14:40 | 只看该作者
将中断优先级设到最高可以改善,但也不可能绝对不飘。如果要得到稳定的波形最好用TIM的比较器输出。

使用特权

评论回复
地板
dck380394085|  楼主 | 2015-5-14 08:39 | 只看该作者
中断优限级我是过不行的   TIM的比较器输出你是指PWM输出吗  可是我这个是要控制的是精确时间   有什么办法做的精确时间  除了加延时程序以外  还有什么办法吗

使用特权

评论回复
5
dck380394085|  楼主 | 2015-5-14 08:40 | 只看该作者
wowow 发表于 2015-5-13 14:40
将中断优先级设到最高可以改善,但也不可能绝对不飘。如果要得到稳定的波形最好用TIM的比较器输出。
...


中断优限级我是过不行的   TIM的比较器输出你是指PWM输出吗  可是我这个是要控制的是精确时间   有什么办法做的精确时间  除了加延时程序以外  还有什么办法吗

使用特权

评论回复
6
神的兄弟| | 2015-5-14 09:47 | 只看该作者
比较器PWM输出要比定时器准,3楼正解

使用特权

评论回复
7
dck380394085|  楼主 | 2015-5-14 10:18 | 只看该作者
神的兄弟 发表于 2015-5-14 09:47
比较器PWM输出要比定时器准,3楼正解

可是我这个不是要输出波形  而是进如定时器时间做其他事情

使用特权

评论回复
8
神的兄弟| | 2015-5-14 12:02 | 只看该作者
dck380394085 发表于 2015-5-14 10:18
可是我这个不是要输出波形  而是进如定时器时间做其他事情

那我觉得你应该主要看看硬件部分,晶振和电源是否稳定,时钟稳定是一切时序的基础,有干扰就会不准,然后再做软件优化,把定时器中断函数写的小一点,减小中断时间,提高优先级,看看其他中断是否对程序流程有影响,我觉得主要问题还是偏向硬件多一些

使用特权

评论回复
9
dck380394085|  楼主 | 2015-5-14 14:13 | 只看该作者
神的兄弟 发表于 2015-5-14 12:02
那我觉得你应该主要看看硬件部分,晶振和电源是否稳定,时钟稳定是一切时序的基础,有干扰就会不准,然后 ...

当我如果不在定时器里面做的话  用延时程序做 这样就很稳定  比如
while(1)
{
   LED0 = ~LED0;

}

使用特权

评论回复
10
dck380394085|  楼主 | 2015-5-14 14:13 | 只看该作者
dck380394085 发表于 2015-5-14 14:13
当我如果不在定时器里面做的话  用延时程序做 这样就很稳定  比如
while(1)
{

while(1)
{
   LED0 = ~LED0;
   delay(10);
}

使用特权

评论回复
11
神的兄弟| | 2015-5-14 14:59 | 只看该作者
dck380394085 发表于 2015-5-14 14:13
while(1)
{
   LED0 = ~LED0;

:L你的中断函数里有一个Spwm——Buffur——Out()函数,这个函数是否执行的时间太长,考虑是否改写成中断标志位形式执行,然后再主程序中查询标志位再执行的方式

使用特权

评论回复
12
天四明| | 2015-5-14 16:19 | 只看该作者
有可能和晶振有关系,实在不行就用滴答

使用特权

评论回复
13
dck380394085|  楼主 | 2015-5-18 15:27 | 只看该作者
神的兄弟 发表于 2015-5-14 14:59
你的中断函数里有一个Spwm——Buffur——Out()函数,这个函数是否执行的时间太长,考虑是否改写成中 ...

你没看到我把他屏蔽了吗 ?   

使用特权

评论回复
14
dck380394085|  楼主 | 2015-5-18 15:28 | 只看该作者
dck380394085 发表于 2015-5-18 15:27
你没看到我把他屏蔽了吗 ?

屏蔽了 就剩下LED =~LED了  一样的效果

使用特权

评论回复
15
wowow| | 2015-5-18 16:22 | 只看该作者
你的要求没说清楚,不过TIM的比较器输出就是用于“精确时间"的脉冲啊,至于是用PWM还是其它模式,取决于你需要得到的波形。

使用特权

评论回复
16
runningwzf| | 2015-5-18 16:35 | 只看该作者
电平在中断程序里面控制,肯定会有一定的不稳定
如果你要准确,就要用定时器自己去控制引脚的电平

使用特权

评论回复
17
Thor9| | 2015-5-18 19:35 | 只看该作者
建议用定时器中断

使用特权

评论回复
18
tototm| | 2015-5-18 20:30 | 只看该作者
用定时器比较输出应该准些

使用特权

评论回复
19
dck380394085|  楼主 | 2015-5-20 15:15 | 只看该作者
runningwzf 发表于 2015-5-18 16:35
电平在中断程序里面控制,肯定会有一定的不稳定
如果你要准确,就要用定时器自己去控制引脚的电平 ...

什么意思  不明白

使用特权

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

本版积分规则

3

主题

19

帖子

0

粉丝