[PIC®/AVR®/dsPIC®产品] PIC16F单片机AD测正弦波频率,定时器TMR0计时问题

[复制链接]
1606|10
 楼主| yy005566 发表于 2019-5-11 12:17 | 显示全部楼层 |阅读模式
本帖最后由 yy005566 于 2019-5-11 17:12 编辑

目前,在调好正弦波(0-5v)频率,能保证200个AD数据中完全出现一个周期
思路:用定时器算出了,200次A/D检测和存数组的时间T,一次检测时间为T/200。
          根据数组出现最大值和最小值的位置相差的绝对值add, 则可算出正弦波的半个周期的时间为add*T/200。
问题:感觉这样算出的频率不正确,测试过定时器Timer0和跑表的计时不一致,请问是定时器设置的不对还
          是怎样?还是思路有问题?
注:查看过AD检测的200组数据,波形规律正常
{        cout_num0 = 0;               //定时变量
        OPTION_REG =  0;           //4M,不分频,一次100us
        OPTION_REGbits.PSA = 1;
        OPTION_REGbits.PS = 0;
        INTCONbits.TMR0IF = 0;
        INTCONbits.TMR0IE = 1;
        INTCONbits.PEIE = 1;
        INTCONbits.GIE = 1;
        TMR0 = 0xAA;       //计时开始,跑表开始
        while(number<=200)
        {
            ADCON0bits.GO_nDONE = 1;
            while(ADCON0bits.GO_nDONE);  //
            adc_value = ADRESH;
            adc_value <<=8;
            adc_value| =ADRESL;
            adc_sort[number++] = adc_value;
            NOP();
        }   NOP(); //此时count_num0 = 280, TMR0 = 0xC6,时间T = 280*100+(0xC6-0xaa)/(0xff-0xaa)*100 = 28024 us ; 跑表为21794us,不知道该以哪个为标准?
........
}

void interrupt ISR(void)
{
    if(INTCONbits.TMR0IF== 1)
    {
        TMR0=0xAA;  //
        TMR0IF = 0;
        count_num0++;     
    }
}





评论

值得学习  发表于 2019-5-21 22:10
淘猫汤姆 发表于 2019-5-11 19:59 来自手机 | 显示全部楼层
直接整成矩形波,测周期不就简单多了?
 楼主| yy005566 发表于 2019-5-11 21:38 | 显示全部楼层
淘猫汤姆 发表于 2019-5-11 19:59
直接整成矩形波,测周期不就简单多了?

没有这个条件
CoolSilicon 发表于 2019-5-13 09:47 | 显示全部楼层

PIC有几个新的单片机内置ZCD过零点检测单元, 直接就可以测交流信号的过零点的说.
淘猫汤姆 发表于 2019-5-13 11:35 来自手机 | 显示全部楼层
很多芯片都自带比较器,不难实现
 楼主| yy005566 发表于 2019-5-14 15:26 | 显示全部楼层
谢谢各位,已解决,结贴
oxygenzz 发表于 2019-5-14 18:05 | 显示全部楼层
楼主的问题采用什么方法解决的? 能分享一下吗?谢谢!
xuanhuanzi 发表于 2019-5-14 23:39 | 显示全部楼层
以实际为准比较好
 楼主| yy005566 发表于 2019-5-19 20:47 | 显示全部楼层
oxygenzz 发表于 2019-5-14 18:05
楼主的问题采用什么方法解决的? 能分享一下吗?谢谢!

配置字中使能了4*pLL功能,导致实际频率为16M。
internally 发表于 2019-5-23 15:27 | 显示全部楼层
定时器配置时钟弄错了?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

27

主题

80

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部