PIC 10F322によるスイーパー

投稿日 2013/05/09

6ピン 超小型PIC(実験は8ピンDIPを使用)10F322をスイーパーにしてみました。

PIC_10F322_6.gif
PIC_10F322_3.jpg

実験の様子と回路図

 


オシロスコープが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を使用したディレイ関数を組み込み、好みのスピードでスイープできるようにしました。

PIC_10F322_5.gif

スイープ画像

 

このように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)