質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1635閲覧

SPI通信を用いたプログラマブル波形発生器(AD5932)のプログラムについて

sotooki

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2018/09/28 05:40

編集2018/09/28 05:41

前提・実現したいこと

dspicを用いてSPI通信を介して波形発生器(AD5932)の掃引周波数をチャンネルごとに変更したい。
例)
1CH:0.11MHz
2Ch:0.01
0.1MHz

1CHおよび2CHを交互に動作させたい

発生している問題・エラーメッセージ

1パターンの周波数掃引(0.1~1MHz)を1CHおよび2CHに適用することはできていますが、チャンネルごとに掃引周波数を変更する方法が分かりません。

該当のソースコード

/*** SPI設定パラメータ クロック15MHz(Max20MHz) ***/ unsigned int SPICONValue = FRAME_ENABLE_OFF & FRAME_SYNC_INPUT & ENABLE_SDO_PIN & SPI_MODE16_ON & SPI_SMP_ON & SPI_CKE_ON& CLK_POL_ACTIVE_HIGH & MASTER_ENABLE_ON & SEC_PRESCAL_1_1 & PRI_PRESCAL_1_1; unsigned int SPISTATValue = SPI_ENABLE & SPI_IDLE_CON & SPI_RX_OVFLOW_CLR; /** AD5932の初期設定 **/ void DDSset(void) { /* コントロールレジスタ書き込み */ SPI_CS=0; WriteSPI1(0x6F7); delay_ns(500); SPI_CS=1; delay_ns(1000); /* 開始周波数設定 (0.1~1MHz)*/ SPI_CS=0; WriteSPI1(0xC312);//LSB delay_ns(500); SPI_CS=1; delay_ns(1000); SPI_CS=0; WriteSPI1(0xD008);//MSB delay_ns(500); SPI_CS=1; delay_ns(1000); /* 周波数インクリメント設定 */ SPI_CS=0; WriteSPI1(0x209F);//LSB delay_ns(500); SPI_CS=1; delay_ns(1000); SPI_CS=0; WriteSPI1(0x3000);//MSB delay_ns(500); SPI_CS=1; delay_ns(1000); /* インクリメント数設定 */ SPI_CS=0; WriteSPI1(0x1FA0); delay_ns(500); SPI_CS=1; delay_ns(1000); /* インクリメント・インターバル設定 */ SPI_CS=0; WriteSPI1(0x4000); delay_ns(500); SPI_CS=1; delay_ns(1000); } /*** タイマ2 割り込み処理関数 ***/ void __attribute__((__interrupt__, __shadow__))_T2Interrupt(void) { IFS0bits.T2IF=0;//割込みフラグクリア dds_CTRL=1; delay_ns(200); dds_CTRL=0; SigIn[0] = ReadADC12(0);// Input to A/D converter () Data_new = SigIn[0]+0x8000;//0~FFFFで与える 0x8000=32768 n=n+1; // 最大値検出(トーナメント) // if((Data_new > TopDataV) ) { TopDataV = Data_new; TopDataf = n; } /*** 掃引終了判定* **/ if(n>=4000) { count=count+1; Vmin[count]=TopDataV; fmin[count]=TopDataf; TopDataV=0; TopDataf=0; // swiching // if(TX==1 && RX==4){TX3();TX=3;RX3();RX=3;}//1CH else if(TX==3 && RX==3){TX1();TX=1;RX4();RX=4;ftx=1;}//2CH if(ftx==1){ftx=0;count=0;} dds_Int=1; delay_ns(200); n=0; dds_Int=0; } } /*** メイン関数 ***/ void main(void) { /// Open SPI クロック 30MHz/1=30MHz(33ns) OpenSPI1(SPICONValue,SPISTATValue); INTCON1bits.NSTDIS=1;//多重割り込み禁止 SPI_CS=1; dds_CTRL=1; /** DDSの初期設定 **/ DDSset();//掃引周波数決定 dds_Int=0; CloseSPI1(); ///初期ch定義 TX1();TX=1; RX4();RX=4; /// ADC初期設定 OpenADC12(Config1,Config2,Config3,ConfigPort,ConfigScan); SetChanADC12(Channel0); //タイマ2設定,OPEN Fs2=400000;//Tscan=0.2s_20000,Tscan=0.05s_80000 SetTime2 = ((Fcy/Fs2)+1);//((30MHz/240000) + 1) OpenTimer2(T2_ON & T2_GATE_OFF & T2_PS_1_1 & T2_SOURCE_INT , SetTime2); ConfigIntTimer2(T2_INT_PRIOR_4& T2_INT_ON); while(1) { }

補足情報(FW/ツールのバージョンなど)

dsPIC30f3013
c言語
MPLAB
AD5932

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

AD5392のデータシートを見ると、コマンド中のビットでCHの切り替えをしているようですが、これがうまくいかないということですか?
現状はどういう動作となるのでしょうか

投稿2018/09/29 09:38

y_waiwai

総合スコア87774

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sotooki

2018/10/01 04:15 編集

回答ありがとうございます。 現状は"DDSset"関数によって周波数掃引の動作設定を行い、メイン関数で初期設定を行っています。 そして、タイマ2の割り込み処理の度、"dds_CTRL"がローレベルになることで指定された周波数インクリメントを行います。 4000回の割り込み処理が行われ、その時のCHのデータの最大値を抽出し次のCHに移行し、同様の掃引周波数で処理を行います。 現在、すべてのチャンネルを同様の掃引周波数で行っていますが、各チャンネル毎に掃引周波数を変えて同様の処理を行いたいと考えています。
y_waiwai

2018/10/01 07:51

CHごとに別のタイマでタイマ割り込みをかけ、同様の処理をCHごとに行えばいいという話になりますが、これのどこがわからないのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問