完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
做个双积分ADC,对被测信号进行20ms固定时间积分,然后切换到基准信号通道,测量反向积分时间。
固定时间积分用的是T0定时器,测量方向积分时间用的也是T0定时器。 现在是在切换到基准信号通道前将TL0,TH0清零,切换到基准信号通道后立刻置位TR0,然后等待INT1中断,在INT1中断里将等待信号复位。 用示波器测量波形如下图,下坡是20Ms固定积分,现在将被测信号与基准信号正好相反,理论上上坡也是20ms,测量显示是略多于20ms. [C] 纯文本查看 复制代码 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);}}[C] 纯文本查看 复制代码 void tm0_isr() interrupt 1 using 2{TR0 = 0;TIMERFLAG = 0;} [C] 纯文本查看 复制代码 void exint1() interrupt 2{TR0 = 0;temp1 = TH0;temp2 = TL0;INT1FLAG = 1;} 现在串口发送上来的数据大约是0x 3C02,转换为十进制数 然后 乘12 除FOSC 11059200 ,约等于16.6ms。 中断优先级按默认来,没有做修改。 用到的中断有,INT1外部中断,接受外部信号跳变,用来触发停止计时; T0定时器中断,用来产生20ms的延时; 串口中断; |
|
相关推荐
1个回答
|
|
找到问题了,但还没明白是怎么影响的。
ADC_Process(temp1, temp2); 这个函数可能比较费时间,但不知道为何会影响到计时值。 额,好象是这句太占时间。对基准信号多积分了一段时间,下次记分周期的初始值不在零位了。可能不改用while语句延时... |
|
|
|
只有小组成员才能发言,加入小组>>
3280 浏览 9 评论
2958 浏览 16 评论
3460 浏览 1 评论
9004 浏览 16 评论
4052 浏览 18 评论
1115浏览 3评论
573浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
571浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2303浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1859浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-25 13:58 , Processed in 2.409355 second(s), Total 80, Slave 60 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号