上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- -- l スポンサー広告 l top
早い物で今年も今日で終わりです。12月は年末納期の仕事で多忙を極めまして、全くブログ更新もできませんでした。
来年はもう少し余裕が有ると良いのですが。

それはそれとして、11月頃に映画インターステラーをDVDで借りてきて観まして、映画の内容も良かったですが、あれにでてきたロボットのTARSに特に感銘を受けまして、なんとかああいう動きをする物を作れないかと、暇を見てちょっとずつ細工をしていました。

形としてはタカチの長方形プラケースを4つ。そして秋月のマイクロサーボモータSG-90を3つ組み合わせてみます。



ケースを加工したところ。
これにサーボモータと付けて、塗装するとこうなります。





形ができたところです。これを歩かせるにはそれなりの制御が必要です。最初はICHIGOJAMのPWM機能を使おうかと思いましたが、サーボモータ3CHに対してICHIGOJAMはPWM2CHなのでちょっと足りません。手間ですがPICマイコンでやろうかと思います。

今年は帰省をやめたので正月時間が有ります。三が日に暇を見て動かそうかと思います。



スポンサーサイト
2015.12.31 Thu l PICマイコン l コメント (0) 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
エンベロープ演算を追加しました。
”エンベロープ”で検索して見つけた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
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。