|
> No.711[元記事へ]
nekosanさん
お世話になります。
一定割合の誤差が出るので,5.86%だけ強制的に増えるようにして,ほぼ理論上の値が
出るようにしました。ちょっと対処療法過ぎて気持ち悪いのですが,まだ先があるので,
この先を作りたいと思います。
(他の掲示板にも投稿してみたいのですが,よろしいでしょうか?)
__eds__ unsigned long dat [16384] __attribute__((eds)); /*dat[0]-dat[16384]が使用可能*/
volatile unsigned long low=0, high=0;
volatile unsigned long old=0, new=0, dif=0;
volatile unsigned short num=0;
void __attribute__ ((__interrupt__,__no_auto_psv__)) _IC1Interrupt(void)
{
IFS0bits.IC1IF = 0; // Reset respective interrupt flag
low = IC1BUF; // Read capture entry
high = IC2BUF; // Read capture entry
new = (high<<16)|low;
new= new+(new>>4)-(new>>8);//5.86%強制補正
dif = new-old;
old = new;
dat[num++]=dif;
num&=0x3fff;//上位ビットを消して0-16383までにする
}
int main(int argc, char** argv)
{
initCLK();
initLED();
initLCD();
initPushSW();
initDipSW();
initCaptureControl();
clrscr();
while(1){
waitms(200);
gotoxy(0,0); lcdprintf("%u %5u",_RF5,num-1);
gotoxy(0,1); lcdprintf("%u %10lu",_RF5,dat[num-1]);
ledFlow();
}
return (EXIT_SUCCESS);
}
> --------------------------
> 32MHzの内部クロックを32ビットカウンタでカウントしてキャプチャ。
> FGのクロックの立ち上がりでキャプチャ。-5.5%位の誤差が出る。
>
> FG有効数字 FG(Hz) 計測↑キャプチャ値 見た目の変動 理論上↑キャプチャ値 差分%
> 2 10 3031700 ±400 3200000 -5.259375
> 3 100 302370 ±40 320000 -5.509375
> 4 1000 30215 ±5 32000 -5.578125
> 4 10000 3020 ±1 3200 -5.625
> --------------------------
|
|