


実験の様子と回路図
オシロスコープがRA2(NCO1)につながるようにJPに接続します
10F322にはCPUコアとは独立に動作する周辺機能である、CLC、CWG/COG、NCO、HRPWMが搭載されています。
NCO(Numerically Controlled Oscillator)は16bit分解能の数値制御の矩形波オシレータです。
NCO自体はクロックさえ動いていればCPUとは独立に動作可能です。
NCOは最高500KHzまで発振できます。今回は16ビットの数値を0から65535まで変化させてスイープさせてみました。ステップは約7.6Hzとなります。
今回は、タイマ0を使用したディレイ関数を組み込み、好みのスピードでスイープできるようにしました。

スイープ画像
このようにNCOを使えば簡単に可変周波数発信器が作れます。
ソースコード(スイーパー)
mian.c
#include <pic.h>
__CONFIG (FOSC_INTOSC & BOREN_OFF & WDTE_OFF & PWRTE_OFF & MCLRE_OFF & CP_OFF & WRT_OFF & LVP_OFF);
#define LED_RED PORTA1
unsigned int TimerCount;
unsigned int inc_val;
//Timer0 Interrupt handller
void interrupt Timer0_ISR(void)
{
if(TMR0IF && TMR0IE)
{
TMR0IF = 0;
TimerCount++;
}
}
//mS delayer
void Delay_ms(unsigned int delay)
{
TimerCount = 0;
TMR0 = 0; // x256
OPTION_REGbits.PS = 0x3; // x16 -> Fosc/4(0.25uS) x 256 x 16 = 1.024ms
OPTION_REGbits.T0CS = 0;
OPTION_REGbits.PSA = 0;
GIE = 1; //Interrupt Enable
TMR0IE = 1; //Timer0 Enable
while(TimerCount < delay){};
TMR0IE = 0; //Timer0 Disable
}
void main(void)
{
OSCCON = 0x70; // Fosc = 16 MHz(T=63nS)
LATA1 = 0;
TRISA = 0;
N1CKS1 = 0; //Clock source is Fosc
N1CKS0 = 1;
N1OE = 1; //NCO1 Output Enable
N1EN = 1; //NCO1 Enable
while(1)
{
for(inc_val = 0; inc_val < 65535; inc_val++)
{
if(inc_val == 0)
{
NCO1INCH = 0;
NCO1INCL = 1;
}
else
{
NCO1INCH = inc_val;
NCO1INCL = 0;
}
Delay_ms(30); //adjust sweep speed
}
}
}
(JF1VRR)