MCP49222009/07/07 21:48

dsPICからのアナログ出力用に秋月で購入したDAコンバータMCP4922を使ってみました。AD端子から入力した信号をそのまま出力しています。
//
//
#include 
#include "adc10.h"
#include "timer.h"

// dsPic
// AN0   ---   audio signal in
// RE0   ---   -CS(mcp4922)
// RE1   ---   SCK(mcp4922)
// RE2   ---   SDI(mcp4922)
// RE3   ---   LDAC(mcp4922)
//
// Configuration bits--------------------------------------------------------
_FOSC(CSW_FSCM_OFF & FRC_PLL8);   //FRC with 8xPLL oscillator, Failsafe clock off
_FWDT(WDT_OFF);                  //Watchdog timer disabled
_FBORPOR(PBOR_OFF & MCLR_EN);    //Brown-out reset disabled, MCLR reset enabled
_FGS(CODE_PROT_OFF);             //Code protect disabled

// Setup Data for 10bits A/D Converter
// start by timer 3
unsigned int ValueADCON1 = ADC_MODULE_ON & 
                                              ADC_IDLE_STOP &                       
                                              ADC_FORMAT_SIGN_FRACT &
			                      ADC_CLK_TMR & 
                                              ADC_AUTO_SAMPLING_ON & 
                                              ADC_SAMPLE_INDIVIDUAL & 
			                      ADC_SAMP_OFF;
unsigned int ValueADCON2 = ADC_VREF_AVDD_AVSS & 
                                            ADC_SCAN_OFF &
                                            ADC_CONVERT_CH0 &
                                            ADC_SAMPLES_PER_INT_1 & 
                                            ADC_ALT_BUF_OFF & 
                                            ADC_ALT_INPUT_OFF;
unsigned int ValueADCON3 = ADC_SAMPLE_TIME_1 & 
                                            ADC_CONV_CLK_SYSTEM  &
                                            ADC_CONV_CLK_2Tcy;
unsigned int ValueADPCFG = ENABLE_AN0_ANA & 
                                            ENABLE_AN1_ANA & 
                                            ENABLE_AN2_ANA &
                                            ENABLE_AN3_ANA;
unsigned int ValueADCSSL = 0;
unsigned int Channel0 = ADC_CH0_POS_SAMPLEA_AN0 &                           
                                           DC_CH0_NEG_SAMPLEA_NVREF;

// variables
fractional SigIn;

// ADC割り込み処理
void _ISRFAST _ADCInterrupt(void)
{
	int d_in, d_out, i;
	
	IFS0bits.ADIF = 0;			

	SigIn = ReadADC10(0);	
  	
	d_in = ((0x8000 + SigIn)>>6) -512;
	// do something
  	d_out = 0x7000 | ((d_in + 512)<<2);
  	
  	LATEbits.LATE0 = 0;  //CS=0
  	for(i=0; i<16; i++){
    	     if(((d_out << i) & 0x8000) != 0){
      		LATEbits.LATE2 = 1;  //SDI=1
    	     }else{
      		LATEbits.LATE2 = 0;  //SDI=0
    	     }
    	     LATEbits.LATE1 = 1;  //SCK=1
    	     LATEbits.LATE1 = 0;  //SCK=0
  	}
  	LATEbits.LATE0 = 1;  //CS=1
  	LATEbits.LATE3 = 0;  //LDAC=0
  	LATEbits.LATE3 = 1;  //LDAC=0
}

//main-----------------------------------------------------------------------
int main(void)
{
	int i,j;
	
//Initialize
	LATE = 0x0000;	//

// Setup Port
	TRISB = 0x01;	//AN0 input
	TRISE = 0x00;	//all output
	
	SRbits.IPL=4;	//Set CPU priority Set core priority level to 4

// Setup ADC10		
	OpenADC10(ValueADCON1, 
                           ValueADCON2, 
                           ValueADCON3, 
                           ValueADPCFG, 
                           ValueADCSSL);
	SetChanADC10(Channel0);
	ConfigIntADC10(ADC_INT_PRI_7 & 
                                ADC_INT_ENABLE);

// Timer3 open 16kHz = (7.37MHz*8/4)/921
	OpenTimer3(T3_ON & T3_GATE_OFF & T3_PS_1_1 & T3_SOURCE_INT,921-1);

// init mcp4922
	LATEbits.LATE0 = 1;	//CS
	LATEbits.LATE1 = 0;	//SCK
	LATEbits.LATE2 = 0;	//SDI
	LATEbits.LATE3 = 1;	//LDAC

//Idle Loop
	while (1){};
}

Scilab/Scicosで学ぶシミュレーションの基礎2009/06/02 21:42

● 読書記録
Scilab/Scicosで学ぶシミュレーションの基礎 橋本 洋志/石井 千春著
★★★★★
この本はかなりおすすめです。現代制御理論を使って実際に機械の制御をしてみたい方や、制御パラメータの決め方がわからず挫折してしまった方にとっては購入の価値ありと思います。大学の研究室などでMATLABが使える環境にいる人以外は、状態方程式の導出まではなんとか理解してもそこから先になかなか進めないというのが実情だと思います。本書をみれば、SCILABというフリーソフトを使用して制御システムのシミュレーションと制御パラメータ決定ができるようになります。
私の場合、写真のようなロータ型の倒立振子(ムラタセイサク君と同じ)のコントロールを目標にしましたので、最初のSCILABの使い方の章と最後のフィードバック制御の章のみを読みました。多少説明が雑になるところもありますが、許容範囲内と思います。一読してすっきりわかるという感じではありませんが、じっくり取り組めば得られるものも大きいというのが感想です。
今後できれば倒立振子制御の内容についても公開していく予定です。

PICで楽しむネットワーク接続機器の自作(5)2009/04/16 11:52

応用編として本には載っていないRSSリーダをつくってみました。Microchip社が提供するTCPIPのデモアプリケーションの中の"GenericTCPClient"を参考にしました。このデモは、google.comに"Microchip"という検索ワードでアクセスしてその結果を受け取り、UARTでPCに表示させるというものです。
WEBサイトにアクセスして受け取った結果を表示するという基本機能は同じなので、変更する部分はそれほど多くありませんでした。アクセス先(RSS提供サイト)と表示先(LCDディスプレイ)が異なるのと、表示したい部分だけを抜き取る(パース)作業が必要となります。
今回つくったパーサは本当に簡易的なもので、<title>タグと<description>タグをみつけてそこだけを拾うことしかしていませんので、きちんと表示できるRSSサイトは限られています。また日本語フォントが入れられませんでしたので英語サイトのみです。本当は日本語の天気予報をだしたかったのですが。
苦労したのはやはりパーサ部分です。TCP通信の関してプログラムがやっている内容をまだ理解できていませんので、表示をだらだらと行っていると通信が途中で切れてしまったりとか不具合がいくつかあります。

PICで楽しむネットワーク接続機器の自作(4)2009/04/09 09:58

WEBラジオを製作しました。イアフォンで聞いていますが、思いのほか音が良いので驚きました。
サンプルプログラムに書かれている局データはURLが変わってしまっているらしく受信できないものが多くありましたので、この部分は新しい局データに書き直しました。また、局データがIPアドレスで指定されているところはなぜか受信できませんでした。原因はわかりません。

PICで楽しむネットワーク接続機器の自作(3)2009/04/04 23:07

第6章のリモートカメラの続きとして第11章のWEBカメラの実験を行いました。第6章のものはLAN内のPCからVBアプリでコントロールするかたちでしたが、今度は外部PCのWEBブラウザを使い、さらに映像もブラウザに組み込まれますのでかなり本格的な感じがします。WEBページはMicrochip社提供のものをほぼそのまま流用します。
PICのプログラミング以外に、WEBページの作成とPICプロジェクトへの組み込み、ダイナミックDNSの取得、ルータの設定が必要となります。
グローバルIPアドレスへのアクセスはLAN内の自分のPCからはできませんので、別途外部から確認します。私の場合はたまたま近所から漏れてきた無線LANに入れましたのでそれを一時的に使わせてもらいました。
またルータの設定は本を見ただけではわかりにくいかと思います。私はNTTのルータですが、「静的マスカレード」設定のところでwwwポートはPIC基板へ、WEBカメラ用ポートはPCへ行くようにします。