初级会员

- 积分
- 105
- 金钱
- 105
- 注册时间
- 2016-2-19
- 在线时间
- 19 小时
|
3金钱
代码中 t1 是1s钟定时。我在主函数中 if(t1==10)led(ON); 但是,我按下复位的同时按下手机的秒表,发现当秒表计时8s多,led就亮了。
如果改成 if(t1==20)时,在秒表计时到 18s 多led点亮。 当 if(t1==15) 时,在13s多就点亮led了。 总有个时间差。。。
我的解决办法是增加定时精度,当我把 t1 换成 1ms 定时的时候,if(t1==5000),基本就是过5s就点灯,时间差看不出来了
不知道为什么,虽然可以经过加减时间差或其他方式来解决,但是总感觉不安啊。有大神知道为什么吗?
[mw_shl_code=c,true]#include "Timing.h"
#include "stm32f10x.h"
uint16_t T=0,t1=0; //
#define PERIOD 10000 // 1s 定时
void Timing_Config(void)
{
TIM_TimeBaseInitTypeDef TIM_T;
NVIC_InitTypeDef NVIC_I;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM_T.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_T.TIM_CounterMode=TIM_CounterMode_Up;
TIM_T.TIM_Period=PERIOD;
TIM_T.TIM_Prescaler=7199;
//TIM_T.TIM_RepetitionCounter
TIM_TimeBaseInit(TIM2,&TIM_T);
NVIC_I.NVIC_IRQChannel=TIM2_IRQn;
NVIC_I.NVIC_IRQChannelCmd=ENABLE;
NVIC_I.NVIC_IRQChannelPreemptionPriority=0;
NVIC_I.NVIC_IRQChannelSubPriority=1;
NVIC_Init(&NVIC_I);
TIM_ITConfig(TIM2,TIM_IT_Update,ENABLE);
TIM_Cmd(TIM2,ENABLE);
TIM2->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));// DISABLE
TIM_ClearITPendingBit (TIM2,TIM_IT_Update);
}
void Timing_Open(void)
{
TIM2->CR1 |= TIM_CR1_CEN;// ENABLE
}
void Timing_Close(void)
{
TIM2->CR1 &= (uint16_t)(~((uint16_t)TIM_CR1_CEN));// DISABLE
t1=0;
}
void TIM2_IRQHandler(void)
{
if(TIM_GetITStatus(TIM2,TIM_IT_Update)==1)
{
TIM_ClearITPendingBit(TIM2,TIM_IT_Update);
t1++;
if(t1==10000)
{
t1=0;
}
}
}[/mw_shl_code]
|
最佳答案
查看完整内容[请看2#楼]
一般这样的计时方式误差在中断周期时间以内,在你的情况就是1s以内。
假设在第0秒你的t1值为0,在第1秒时刻,你的t1值为1,而当你在第1.5秒时读t1的值,其值还是1,这样你在第2秒时刻时,t1变为2,从你读取t1值得变化来看是变化了2-1= 1秒,而实际是过了500ms,所以在这样的情况下,你定10秒就会在9.5秒出结束。所以会有一个固定偏差。
当你设定中断周期为1ms的话,那偏差就会在1ms之内。时差感觉就很小了。
但你这里偏差大于1s ...
|