NCOを使って抵抗なしでLチカをする

前回の記事で書き込んだPIC10F322には実はNCOと言うパルス生成装置??がついています。
Youtubeの動画によると周波数ステップがPWMに比べて細かいみたいです…??

説明してる人が無表情すぎて怖い

NCOは20bitのメモリに1クロックに指定された数だけ加算していき、桁あふれになったら出力が指定された数だけ出ることでパルスを生成しているようです。
つまり、99まで数えられるカウンターに1ずつ足していって100(=0)になったらボタンを押すみたいなことになります。

それで…MPLABでのコードはこんな感じになります。

int i;
#define _XTAL_FREQ 1000000
int main(int argc, char** argv) {
    OSCCON = 0b00110000; // 0 011=1MHz 0000
    ANSELA = 0b00000000;
    TRISA  = 0b00000000;
    PORTA  = 0b00000000;
    NCO1CON = 0b01100001; // 0=NCO disable, 1=NCO pin enable, 1=NCO high when enable, 0=Active Low 000 1=Pulse mode
    NCO1CLK = 0b00100001; // 001=2 pulse width, 000 01=use system clock
    NCO1INCH = 0b00100000; // High increment bits
    while(1){
        CLRWDT();
        N1EN = 1; // NCO1 = RA2
	for (i = 0; i < 100; i++){
        	__delay_ms(10);
   	}
        N1EN = 0;
	for (i = 0; i < 100; i++){
        	__delay_ms(10);
   	}
    }
}

コンパイルしたのはこっち

:020000040000FA
:02000000FC29D9
:10036000303090008801860185016130AD00213078
:10037000AE002030AB006400AD17C601C7010430E9
:10038000C5003D30C400C40BC329C50BC329C8290F
:100390000130C6070318C70A0030C7074708803A6C
:1003A000FF0080307F02031DD72964304602031C02
:1003B000DA29DB29BF29AD13C601C7010430C50006
:1003C0003D30C400C40BE229C50BE229E729013006
:1003D000C6070318C70A0030C7074708803AFF005E
:1003E00080307F02031DF62964304602031CF92980
:1003F000FA29DE29BB290028C801C9018301B029D7
:02400E00FE3F73
:00000001FF

NCO1CONでNCOが有効かどうか、NCOのピンが有効かどうか、桁あふれしたときにHighにするかどうか、Active Highかどうか(?)、パルスで出力するか固定デューティー(?)で出力するかが決められます。
よく分からないのがいくつかあるけど動いたからこれでいいや。

NCO1CLKでは出力は何クロック保持するか、何をクロック元にするかを決めます。
保持するクロックを大きくするとそれだけHighの時間が多くなります。(=LEDが明るくなる)クロック元はLED駆動程度だったらシステムクロックを使えばいいと思う。

NCOINCHは1クロックで加算する量を決めます。これを増やすとLEDが明るくなる。ここの数値を1ビットずつ変えると周波数を細かく変えられるんだと思います。精度が足りなかったらNCOINCL(下位ビット)も使えます。

10F322ではRA2にNCO出力があるのでRA2にLEDをつないでN1EN(NCO1CONの最初のビット)を1にするとLEDが抵抗なしでまあまあ明るくつきます。LEDは高速で点滅させると抵抗をつないだときより明るく見えるらしいです。測ってみたら0.2mAでしっかり確認できるぐらいの明るさになりました。

定期的にCLRWDT();を実行するのを忘れてるとに噛み付かれるので気をつけましょう。

結局

何に使うの?
周波数スイープでゆらゆら点滅させるのはめんどうくさいのでやらなかった

コメントを残す