上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
PIC16F1705のオペアンプを使ってゲルマラジオの出力をADCでとりこみ、ちょっとした信号処理をしてDACで出力すれば低周波増幅段になるかな、と思いついて実験してみました。
 
まずは回路。普通のゲルマラジオを同調回路とダイオードをつけて、OPAMP2を入力段として非反転増幅回路で受けています。

 
ブレッドボードはこんな感じです。かなりごちゃついてきました。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




動作波形です。下がADC入力、上がDAC出力です。ADC入力をそのまま出すのも面白くないのでソフトで4倍のゲインをつけています。

音は。。。AFNの音楽を聴いていて高音はいまいちのような気がしますが、まあ普通にAMラジオとして聞えています。




ソースは以下の通りです。
//*************************************************
// PIC16F1705 DAC/ADC RADIO test
// 2015/01/11
//*************************************************

// *** INCLUDEはファイル名を<>で囲んでください。
#include xc.h
#include stdio.h
#include stdlib.h
#include math.h

#define _XTAL_FREQ 32000000

#pragma config FOSC = INTOSC // use intosc , clkout = IO
#pragma config WDTE = OFF // WDT off
#pragma config PWRTE = ON // PWT on
#pragma config MCLRE = OFF // MCLR disabled
#pragma config CP = OFF // Memory code protection disabled
#pragma config BOREN = ON // BOR enabled
#pragma config CLKOUTEN = OFF // CLKOUT = IO
#pragma config IESO = OFF // IESO disabled
#pragma config FCMEN = OFF // FCMEN disabled
#pragma config WRT = OFF // FLASH write protection disabled
#pragma config PPS1WAY = OFF // PPSWAYdisabled
#pragma config ZCDDIS = ON // ZCD enabled
#pragma config PLLEN = ON // 4xPLL enabled
#pragma config STVREN = ON // Stack overflow reset enabled
#pragma config BORV = HI // BOR voltage = HI
#pragma config LPBOR = OFF // PLBOR disabled
#pragma config LVP = OFF // LOW voltage program disabled

unsigned int getadc(void);

void main()
{
unsigned int signal;

// IO initialization
OSCCON = 0b01110000 ; // internal osc 32MHz with 4xPLL
ANSELA = 0b00001000; // PORTA AN3 is analog
ANSELC = 0b00000000 ; // PORTC all digital
TRISA = 0b11111111 ; // PORTA all output
TRISC = 0b11111111 ; // PORTC all output

// DAC & OPAMP1,OPAMP2 initialization
DAC1CON0 = 0b10110000; // DAC enable ,OUT1/2 enable
OPA1CON = 0b11010010; // OPAMP1 Enable , DAC-> + , OUT-> -
OPA2CON = 0b11000000; // OPAMP1 Enable , IN+ -> + , IN- -> -

// ADC initialize
ADCON1 = 0b10010000 ; // Right justified , Fosc/2 , Vref = VDD
ADCON0 = 0b00001101 ; // Select AN3 and start ADC
__delay_us(10) ; // Wait after ititialize

while(1) {
signal = getadc();
DAC1CON1 = 128 + 4*((signal >> 2)-128); // *** GAIN x4 ***
__delay_us(10);
}
}

unsigned int getadc(void)
{
unsigned int wk;

GO_nDONE = 1 ; // Stasrt ADC
while(GO_nDONE) {}; // Wait for ADC complete
wk = ADRESH ; // Get ADC H
wk = ( wk << 8 ) | ADRESL ;
return wk ;

}


PIC16F1705は結構使えるのが分かりました。PIC12Fに比べてメモリが豊富でCで普通に書けるのも良いです。
(先週12Fで久しぶりにアセンブラいじりましたが、やっぱり辛い物が有りました。)

次は何をさせてみようか、ちょっと考え中です。

オルゴールは今まで作ったのとあまり変わり映えがしなさそうだし、シグナルジェネレータ昨日のソフトをちょっと直せばできるし、今回のようなラジオ化路線で検波とかチューニングもやらせてみてなんちゃってDSPラジオにするのも面白そうですね。


スポンサーサイト
2015.01.11 Sun l PICマイコン l コメント (2) l top
IC16F1705でDAC動作+オペアンプ動作ができました。
 
とりあえず出してみた正弦波です。
やっぱり8ビットの波形は綺麗ですね。試しにFFTを出してみましたが、高調波もほとんどない正弦波になっているようです。

ソースは以下の通りです。やっぱりC言語はアセンブラと比べて楽です。
256ステップのテーブルを10usのウェイトを入れながら回しているので、それだけだと計算上の周波数はf = 1/(256*10^-6) =390Hzです。実測値は263Hzとでているので、for分の処理、配列からのデータ取り出し、DAC設定、で数uSかかっている模様です。妥当な所かと思います。
「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




//*************************************************
// PIC16F1705 DAC test
// 2015/01/11
//*************************************************

#include xc.h     // ※includeはファイル名を<と>で囲んでください。
#include stdio.h // FC2アップロード時に<>が消えてしまうため。
#include stdlib.h
#include math.h

#define _XTAL_FREQ 32000000

#pragma config FOSC = INTOSC // use intosc , clkout = IO
#pragma config WDTE = OFF // WDT off
#pragma config PWRTE = ON // PWT on
#pragma config MCLRE = OFF // MCLR disabled
#pragma config CP = OFF // Memory code protection disabled
#pragma config BOREN = ON // BOR enabled
#pragma config CLKOUTEN = OFF // CLKOUT = IO
#pragma config IESO = OFF // IESO disabled
#pragma config FCMEN = OFF // FCMEN disabled
#pragma config WRT = OFF // FLASH write protection disabled
#pragma config PPS1WAY = OFF // PPSWAYdisabled
#pragma config ZCDDIS = ON // ZCD enabled
#pragma config PLLEN = ON // 4xPLL enabled
#pragma config STVREN = ON // Stack overflow reset enabled
#pragma config BORV = HI // BOR voltage = HI
#pragma config LPBOR = OFF // PLBOR disabled
#pragma config LVP = OFF // LOW voltage program disabled

int sin0[256];

void main()
{
// IO initialization
OSCCON = 0b01110000 ; // internal osc 32MHz with 4xPLL
ANSELA = 0b00000000 ; // PORTA all digital
ANSELC = 0b00000000 ; // PORTC all digital
TRISA = 0b11111111 ; // PORTA all output
TRISC = 0b00000000 ; // PORTC all output

// DAC & OPAMP1 initialization
DAC1CON0 = 0b10110000; // DAC enable ,OUT1/2 enable
OPA1CON = 0b11010010; // OPAMP1 Enable , DAC-> + , OUT-> -


while(1) {

int i;

// Making sin table

for(i=0;i<256;i++) {
sin0[i] =(int)(128*sin(3.1415926*2*(float)i/254)+128);
}

// Sin wave loop
while(1) {
for (i = 0; i < 255; i++) {
DAC1CON1 =sin0[i];
__delay_us(10);
}
}
}

}




それではまたです。
2015.01.11 Sun l PICマイコン l コメント (0) l top
今週末は普通に休めたので、DAC内蔵PICマイコンの続きをいじっています。
ただし、秋月電子のページでPIC16F1705を見つけて、これに変更しました。
 
概要を見てわかる通り、DACが8ビットで、しかもオペアンプ内蔵です。見たところ、この内蔵オペアンプはDAC出力に繋ぐこともできます。つまりこれを使えばPIC12F1501でのDACビット数の少なさとドライブ能力のなさがどちらも解決します。(^^)v

とりあえず回路をひいてブレッドボードに乗せました。 


ここで問題が発生。日頃愛用しているMPLAB8.86でPIC16F1705はサポートしていないことが分かりました。
 
「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




以前インストールしたけどなんとなく避けていたMPLAB-Xにしないといけないようです。
とりあえずMPLAB-Xを立ち上げてみます。

最近の統合化環境の流行りでしょうか?こういうごちゃごちゃした画面は好きではないのでつい避けてしまっていたのですが。

PIC16F1705が選べたのですが、今度はコンパイラXC8が未サポートになっています。

少し悩んだ末、XC8の最新版(1.33)をダウンロードしたら使えるようになりました。

これでようやく下のLEDチカチカが動くようになりました。

#include xc.h // ※xc.hを<>で囲んでください。(FC2アップロード時にきえてしまうため。)

#pragma config FOSC = INTOSC // use intosc , clkout = IO
#pragma config WDTE = OFF // WDT off
#pragma config PWRTE = ON // PWT on
#pragma config MCLRE = OFF // MCLR disabled
#pragma config CP = OFF // Memory code protection disabled
#pragma config BOREN = ON // BOR enabled
#pragma config CLKOUTEN = OFF // CLKOUT = IO
#pragma config IESO = OFF // IESO disabled
#pragma config FCMEN = OFF // FCMEN disabled
#pragma config WRT = OFF // FLASH write protection disabled
#pragma config PPS1WAY = OFF // PPSWAYdisabled
#pragma config ZCDDIS = ON // ZCD enabled
#pragma config PLLEN = ON // 4xPLL enabled
#pragma config STVREN = ON // Stack overflow reset enabled
#pragma config BORV = HI // BOR voltage = HI
#pragma config LPBOR = OFF // PLBOR disabled
#pragma config LVP = OFF // LOW voltage program disabled


void main()
{

OSCCON = 0b01110000 ; // internal osc 32MHz with 4xPLL
ANSELA = 0b00000000 ; // PORTA all digital
ANSELC = 0b00000000 ; // PORTC all digital
TRISA = 0b00000000 ; // PORTA all output
TRISC = 0b00001000 ; // PORTC all output

while(1) {
int num;
for (num = 0; num <=255;num++) {
PORTC = num;
}
}
}





実際はLEDは付けていないので、ANALOGDISCOVERYで確認しています。今回、オシロモードとロジアナモードを同時動作させてみました。

 
それではこれでDAC動作を続けたいと思います。
2015.01.11 Sun l PICマイコン l コメント (0) l top
初仕事から帰ったところ、年末にネット発注してあったAITENDOの福袋(箱)2015が届いていました。

今年もRADにしました。KITも欲しかったのですが、あっちはあっというまに売り切れて買えませんでした。


開けてみるとこんなかんじ。今年も盛りだくさんです。
 

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




最強DSPラジオキット。まずはこれから動かしてみようかな。
 

無線送受信セット。まあラジオと言えばラジオですね。

これはたしかDSPラジオ基板なのですよね。
 

カメラモジュール?リストにはないみたいなのでおまけみたいですね。8112F,SUNNYと書いてあります。AITENDOのページで検索したけど該当のカメラはないみたいです。
ここで紹介されているSUNNY社のデバイスかな、と思うのですが、SUNNY社のページに行ってもそれらしいのは出てきませんでした。とはいえ仮にデータシートが有ってもこれをまともに動かすのは相当大変ですね。


あとは基板類、ラジオ用LCD,DSPラジオモジュール等などです。

そしてこれ。フェライバーなしのコイル詰め合わせ。一つインダクタンスを見てみました。

117uHです。フェライト無しで短波には使えるか?
 
また暇ができたら少しずつ何か作っていこうかと思います。
2015.01.05 Mon l その他工作 l コメント (0) l top
お昼にちょっと時間ができたので、DAC付きPIC12F1501を少しいじってました。
 
実は、この石のDACが5ビットしかないことや、ドライブ回路の制限やらが見えてきたので、この半端なDACを動かすよりも普通にPWM出力にしてLPFでも付けた方が良いのではないか?と考えて比較できるようにPWM制御方式でも動かせるように改造を始めたところです。
 
そこでMPLABのシミュレーションを動かしていて、どうもバグらしい物に遭遇しました。
 
PIC12FのPWMはTIMER2を使って動かすのですが、MPLABのシミュレーションでTIMER2がカウントアップしないみたいです。
 

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



シミュレーションのステップ動作でTIMER2は変化せず、最初はこちらのソフトバグを疑っていたのですが、このタイマーはそんなに設定が必要でもない機能なのでバグらしきものは見つからないし、なにより実チップに書くと普通に動作するし、でMPLABの方が変かな、と思いはじめました。

”PIC12F1501 TIMER2"で検索したところ、MICROCHIPのフォーラムで同じ目にあったらしい人の書き込みがヒットしました。
Unable to get Timer2 to work with MPLAB SIM and PIC12F1501
 
この人によると「PIC12F1501でTIMER2をイネーブルにしても0のままになる。PIC12F1840では正しく動くので、もしかしたらMPLAB8.91のバグかもしれない」とのことです。
 
これに対する他の人のリプライはないみたいですが、私のところと全く同じ状況ですので、多分MPLABバグなのだと思います。PIC12F1501の石のバグではないですが、これのソフトをMPLABで開発される方はご注意ください。
 


2015.01.04 Sun l 未分類 l コメント (0) l top
エンベロープ演算を追加しました。
”エンベロープ”で検索して見つけたkorinchanの音楽室様のページが非常に分かりやすく解説してくださっていましたので参考にさせていただいています。サンプル音が大変充実しているので作りながら聴き比べもできて大変ありがたいです。
  
「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




現状のソースは以下の通りです。
エンベロープ付きソース
初めはセオリー通りにADSRを定義して計算して出そうとしていたのですが、メインループ内のコード量がかなり大きくなることがわかりまして、テーブル型に置き換えました。和音を出したいと考えているのでメインループ内はできるだけ軽く作っておかないと。
それでも結構なステップ数になってきましたので、ほんとに和音まで出せるかちょっと心配になってきています。
 
現状での動作波形をANALOGDISCOVERLYで観測して画面キャプチャしてみました。

これが確認のために出力したエンベロープ波形です。DAC5ビットなのでやっぱり階段ですね。。。。


そしてこれがエンベロープに昨日までの合成波形を掛け算した出力波形です。まあそれっぽいかな。

波形定義とエンベロープ定義を各4ビット数値として4ビット掛け算をし、上位5ビットをDACに渡すようにしています。
 
こういうのが簡単に撮れる。やっぱりANALOGDISCOVERLYは良いです。
音は、まあまあかな、という感じでは出ています。



ここまでで気付いたのですが、DAC出力がスピーカ回路負荷を繋いだ状態だとレベルがかなり低下しています。
おかしいな、と思って秋月からのデータシートリンクを見ていたところ、P127に「Due to the limited current drive capability, a buffer mustbe used(電流制限のため外部バッファが必須)」という記載を見つけました。P128に参考例としてボルテージフォロワ回路もあります。内部インピーダンスが結構あるみたいです。
 
は?ですよ。外部オペアンプが必要とは。2チップ構成になってしまうではないですか。
なんのために苦労して小型の12Fを使っているのかわかりません。データシートのこのあたりではDAC出力と言わずにりファレンスアウトプットとか書いているので、やっぱり汎用DACではなくてリファレンスに使うのが本来用途なのかもしれません。

が、とりあえず音は出ているので、少々の波形ひずみは無視してバッファ無しで進めることにします。
 
あとは、やっぱりDAC5ビットだと波形を見ていても辛いですね。これがひと段落したら、8か10ビットDACを使った物に移植して聞き比べてみようかと思っています。
 
明日は遊べないので次は来週末位になりそうです。
 
それではまたです。
2015.01.03 Sat l PICマイコン l コメント (0) l top
どうにか音階を出せる所まで来ました。
現状のセットと回路図は以下の通りです。

回路図はスピーカ回路をつけだだけですが。

 
「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




苦労したのはマイコンソフトの方です。ソースを公開します。ドレミファソラシド2オクターブを繰り返すようになっています。
PIC12F1501発音テストサンプル
 
電子オルゴール系は何回か作っているのでだいたいのやり方は分かるのですが、毎回作り直していて非常に効率が良くないので、今回は今後も使えるように下のようなテーブルを作ってから始めました。




この表のCOUNTとRESTの2パラメータで音階を定義しています。原理としては、16ステップで定義している波形を指定音階の1周期に合わせるようにして定義波形で指定周波数を出すようにしています。
 
まずは単純にCOUNT値だけ数えるごとに波形テーブルを進めることで大体の周波数を出します。この方法だと16の倍数でしか波形長を定義できないので、どうしても余りが出ます。RESTでそのつじつまを合わせます。
  
本当は指定音階の周期にぴったり波形テーブルのデータを当てはめるように計算すればRESTは不要ですが、PIC12Fではとてもそんな計算できませんので、こういう方法にしてみました。
  
音は矩形ピコピコよりはだいぶ良いかな、と思いますが、まだまだ良音というには苦しい感じです。
もう少し改善して動きもオルゴールらしくなってから動画をアップしようと思います。
 
この先はエンベロープ制御を付けて、和音対応すれば電子オルゴールになるのですが、明日明後日は出かける用事が有るのであまり続きができません。完成は冬休みより後になりそうです。

それではまたです。
2015.01.02 Fri l 未分類 l コメント (0) l top
TIMER0を使った基本定周期ループと、テーブルによる波形定義までできました。
出力はこんな感じです。


 
定周期ループはTIMER0割込みではなく、ループの最後でTIMER0オーバフローを待つタイプにしました。
周期は10usです。つまりこの時間分解能で出力を操作できることになります。1サイクル命令250nsなので、最大40命令実行できることになります(実際は2サイクル命令もあるのでもっと少ないです。用途によりますが、ちょっと少ないかも。。。足りなければ延ばすことになります。)
「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">



 
割込みにしなかったのは、割込みENTER/LEAVE処理に貴重なサイクルを取られるのを避けるためです。
  
波形定義はRETLWを使ったテーブルで16ステップ定義できるようにしました。あと、レジスタバンク切り替えが面倒になってきたのでマクロにしました。Cで書いてると忘れてしまいますがこれもPICのめんどくさい所でしたね。

と、ここまで簡単みたいに書きましたが、実際は結構苦労してます。特にPIC12Fでのテーブル使用方法はすっかり忘れていました。やっぱりPIC24F+C言語は偉大ですね。
 

 
現状のソースは以下の通りです。(長くなってきたので次からファイルアップロードにします。)
一番最後に波形テーブルが有ります。

;****************************************************
; PIC12F1501 DAC TEST Using TMR0 ******************
;********* 20150101 by Minarai Syokunin *************
;****************************************************

INCLUDE "P12F1501.inc"
__CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
__CONFIG _CONFIG2 , _WRT_OFF & _STVREN_OFF & _BORV_HI & _LPBOR_OFF & _LVP_OFF

;************** VARIABLES *******************
TIM0 EQU 20H
TIM1 EQU 21H
DAC EQU 22H
WK0 EQU 23H

;************** MACRO *******************
SetSFR macro REG,VAL
BANKSEL REG
MOVLW VAL
MOVWF REG
endm
PutVAR macro REG
BANKSEL 0
MOVWF REG
endm
GetVAR macro REG
BANKSEL 0
MOVFW REG
endm

;************** ORG DEFINE *******************
ORG 0h
GOTO START
ORG 4h
GOTO START
;************** INITIALIZE ********************
START
SetSFR OSCCON ,B'01111010' ; Clock 16MHz
SetSFR ANSELA ,B'00000000' ; ALL digital (DAC output = digital setting)
SetSFR TRISA ,B'00000000' ; All output
SetSFR DACCON1 ,B'00000000' ; DAC value = 0
SetSFR DACCON0 ,B'11110000' ; DAC1,2 Enabled
SetSFR OPTION_REG ,B'00000000' ; CLK=FOSC/4 , Prescaler 1:2
SetSFR TMR0 ,0 ; Timer setting
CLRW
PutVAR DAC ; Set DAC initial value

;************** MAIN **************************
MAIN
SetSFR INTCON ,B'00000000' ; Timer0 overflow flag clear
SetSFR TMR0 ,D'235' ; Timer0 set for 10us (100KHz) interval
GetVAR DAC
ADDLW B'00000001'
ANDLW B'00011111'
PutVAR DAC
CALL WAVE_DEF
BANKSEL DACCON1
MOVWF DACCON1
BANKSEL INTCON
WAIT_TIM0
BTFSS INTCON,2 ; Wait for TIM0 overflow
GOTO WAIT_TIM0
GOTO MAIN

;************** Waveform define **************************
WAVE_DEF
ANDLW B'00001111'
; RETURN
ADDWF PCL,f
RETLW D'0'
RETLW D'2'
RETLW D'4'
RETLW D'8'
RETLW D'16'
RETLW D'16'
RETLW D'16'
RETLW D'8'
RETLW D'8'
RETLW D'4'
RETLW D'4'
RETLW D'8'
RETLW D'8'
RETLW D'16'
RETLW D'16'
RETLW D'16'
END


次はこの波形を指定周波数で出せるようにします。

それではまたです。
2015.01.01 Thu l PICマイコン l コメント (0) l top
とりあえずPIC12F1501のDACが動作開始しました。一番簡単な鋸状波形です。
 



「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">


ソースは以下の通りです。

;****************************************************
; PIC12F1501 DAC TEST ***************************
;********* 20150101 by Minarai Syokunin *************
;****************************************************

INCLUDE "P12F1501.inc"
__CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
__CONFIG _CONFIG2 , _WRT_OFF & _STVREN_OFF & _BORV_HI & _LPBOR_OFF & _LVP_OFF

;************** VARIABLES *******************
TIM0 EQU 20H
TIM1 EQU 21H
WK0 EQU 22H

;************** ORG DEFINE *******************
ORG 0h
GOTO START
ORG 4h
GOTO START
;************** INITIALIZE ********************
START
BANKSEL OSCCON
MOVLW B'01111010'
MOVWF OSCCON ; CLOCK 16MHz
BANKSEL ANSELA
MOVLW B'00000000' ; ALL digital (DAC output = digital setting)
MOVWF ANSELA
BANKSEL TRISA
MOVLW B'00000000' ; All output
MOVWF TRISA
BANKSEL DACCON0
CLRF DACCON1 ; DAC value = 0
MOVLW B'11110000'
MOVWF DACCON0 ; DAC1,2 Enabled
CLRW
;************** MAIN **************************
MAIN
BANKSEL DACCON1
MOVWF DACCON1
ADDLW B'00000001'
ANDLW B'00011111'
CALL WAIT_250US
GOTO MAIN

;************** WAIT 250 us **************************
WAIT_250US
BANKSEL 0 ; W reg backup
MOVWF WK0
MOVLW D'100'
MOVWF TIM0
WAIT_250US1
NOP
NOP
NOP
NOP
NOP
NOP
NOP
DECFSZ TIM0,F
GOTO WAIT_250US1
MOVF WK0,W ; W reg recover
RETURN
END


ちょっとはまったのは、DAC使用時のANSELAレジスタ設定はアナログではなくデジタルだというところ、アナログ設定はADCかコンパレータの時だけみたいですね。
あとPICKIT3を繋いだままだとDAC出力波形がおかしくなります。DACOUT2を使っていたのでPICKIT3には繋がっていないのですが。。。。。これはだいぶ悩みました。
 
それらはまあよいのですが、DACコーディングに入ってやっと気付いたこと。このPICのDACは分解能が5ビットしかないのですね。つまり32段階。普通に8ビットか10ビットだと思っていたのでちょっとびっくり。
 
データシートを見るとこのDAC出力をPIC内部でADCやコンパレータのリファレンスに使えるようになっているので、そちらが主目的でそんなに分解能を持たせていないのかもしれません。しかしなんか中途半端な仕様のように思えます。
  
上の画像を見ても結構階段状になっています。あまり細かい波形は出せないかもしれないです。
まあ次は音を出してみてどんなものか聞いてみようかと思います。


 
2015.01.01 Thu l 未分類 l コメント (0) l top
明けましておめでとうございます。本年もよろしくお願いいたします。

今年は帰省しないことにしたので時間が有り、新年早々ですが少し前に買ってあったものをいじりはじめました。
 
物は秋月電子から買ってあったPIC12F1501です。
何故これか、というとこの石にはDAコンバータが内蔵されているのですね。普通はDACはなくて、代わりにPWMが入っていると思っていたのですが、たまたま眺めていてDACx1というのを見て購入してあった物です。
これでシグナルジェネレータ、音の良い電子オルゴールその他色々作れそうだな、と思いまして。
午前中にとりあえずユニバーサルボードに乗せてLEDチカチカから組んでみました。

「スポンサードリンク」

style="display:block"
data-ad-client="ca-pub-0620260288102702"
data-ad-slot="9773401572"
data-ad-format="auto">




何もない回路ですが回路図はこうです。

ソフトは以下の通りです。クロック16MHzで遅くはない石ですが、メモリが少ないのでCだと大したことはできないと考えて久しぶりにアセンブラとしました。しかしアセンブラはやっぱり面倒ですね。。。。

;****************************************************
; PIC12F1501 LED BLINKING ***************************
;********* 20150101 by Minarai Syokunin *************
;****************************************************

INCLUDE "P12F1501.inc"
__CONFIG _CONFIG1 , _FOSC_INTOSC & _WDTE_OFF & _PWRTE_OFF & _MCLRE_OFF & _CP_OFF & _BOREN_OFF & _CLKOUTEN_OFF
__CONFIG _CONFIG2 , _WRT_OFF & _STVREN_OFF & _BORV_HI & _LPBOR_OFF & _LVP_OFF

;************** VARIABLES *******************
TIM0 EQU 20H
TIM1 EQU 21H

;************** ORG DEFINE *******************
ORG 0h
GOTO START
ORG 4h
GOTO START
;************** INITIALIZE ********************
START
BANKSEL OSCCON
MOVLW B'01111010'
MOVWF OSCCON ; CLOCK 16MHz
BANKSEL ANSELA
CLRF ANSELA ; All digital
BANKSEL TRISA
MOVLW B'00000000' ; All output
MOVWF TRISA ;
BANKSEL PORTA
CLRF PORTA
;************** MAIN **************************
MAIN
INCF PORTA
GOTO MAIN

END






ウェイトを入れていないので目で見ても点滅しては見えません。AnalogDiscoveryでRA0の波形を見てみました。
 

 
ちゃんと矩形波が得られました。
周波数約660KHzです。16MHzCPUにしてはちょっと遅いのではないかな?と思って計算してみました。

クロック16MHzなので1サイクル4MHz、プログラムのステップ数がINCFとGOTOで合計3、つまりメインループは1.3MHzとなります。

660KHzだと半分ではないかな、と思いかけましたが、それはあくまで矩形波の周波数。切り替え周波数=メインループ周波数はその倍なので1.32MHz。
 
どうやらちゃんと16MHzで動いているようです。

このあと休み中にDACを動かして、なんらかの波形を出したいと思います。
 
そのあとはサウンドジェネレータ化して良音オルゴール作りまでやりたいのですが、正月明けのも業務予定が詰まっているので、いつになることか。。。。。
 
 
それではまたです。
2015.01.01 Thu l 未分類 l コメント (0) l top
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。