本帖最后由 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++;
}
}
|
值得学习