打印
[51单片机]

定时器测量时间不准...

[复制链接]
1975|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
any_014|  楼主 | 2015-4-25 11:33 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 any_014 于 2015-4-25 11:49 编辑

做个双积分ADC,对被测信号进行20ms固定时间积分,然后切换到基准信号通道,测量反向积分时间。
固定时间积分用的是T0定时器,测量方向积分时间用的也是T0定时器。
现在是在切换到基准信号通道前将TL0,TH0清零,切换到保基准信号通道后立刻置位TR0,然后等待INT1中断,在INT1中断里将等待信号复位。

用示波器测量波形如下图,下坡是20Ms固定积分,现在将被测信号与基准信号正好相反,理论上上坡也是20ms,测量显示是掠夺与20ms.

但串口发过来的数,我算了下,才17ms左右。

void main()
{
        Init();
        while(1)
        {
                RUNLED = 0;
                TIMERFLAG = 1;
                TL0 = T20MS;
                TH0 = T20MS >> 8;
                P1 &= 0xf0;                                                  //Çл»µ½±»²âµçѹÐźÅͨµÀ
                P1 |= 0x02;
                TR0 = 1;                                                  //¶¨Ê±Æ÷T0 20msÑÓʱ
                while(TIMERFLAG);

                RUNLED = 1;
                INT1FLAG = 0;
                TL0 = 0;
                TH0 = 0;
                P1 &= 0xf0;                                                  //Çл»µ½»ù×¼µçѹÐźÅͨµÀ
                P1 |= 0x07;
                TR0 = 1;
                while(!INT1FLAG);

                SendData(temp1);
                SendData(temp2);

                ADC_Process(temp1, temp2);
        }
}
void tm0_isr() interrupt 1 using 2
{
        TR0 = 0;
        TIMERFLAG = 0;
}
void exint1() interrupt 2
{
        TR0 = 0;       
        temp1 = TH0;
        temp2 = TL0;
        INT1FLAG = 1;
}


相关帖子

沙发
any_014|  楼主 | 2015-4-25 11:40 | 只看该作者
本帖最后由 any_014 于 2015-4-25 11:43 编辑

现在串口发送上来的数据大约是0x 3C02,转换为十进制数 然后 乘12 除FOSC 11059200 ,约等于16.6ms。
中断优先级按默认来,没有做修改。
用到的中断有,INT1外部中断,接受外部信号跳变,用来触发停止计时;
                        T0定时器中断,用来产生20ms的延时;
                        串口中断;

使用特权

评论回复
板凳
any_014|  楼主 | 2015-4-25 16:03 | 只看该作者
本帖最后由 any_014 于 2015-4-25 16:06 编辑

找到问题了,但还没明白是怎么影响的。
ADC_Process(temp1, temp2); 这个函数可能比较费时间,但不知道为何会影响到计时值。
屏蔽掉这一句计时就是十分接近20ms了。

额,好象是这句太占时间。对基准信号多积分了一段时间,下次记分周期的初始值不在零位了。
可能不改用while语句延时...

使用特权

评论回复
地板
any_014|  楼主 | 2015-4-25 16:15 | 只看该作者
现在是有2个中断函数,T0定时器中断和INT1外部中断。想在两个中断函数里写切换通道部分,这样运算就不会影响通道切换了。不知道这样行不行。

使用特权

评论回复
5
mcu5i51| | 2015-4-25 17:47 | 只看该作者
在执行AD前不要在执行其它的东东,
用定时器计时要求高的时候,请在开始计时后执行进入待机模式,下次时间到了以后可以是同一个时刻

使用特权

评论回复
6
jpaekeo| | 2016-9-2 21:44 | 只看该作者
楼主:你为什么不打开定时器0的中断,利用中断计时呢

使用特权

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

本版积分规则

17

主题

132

帖子

3

粉丝