SH7047Fで DSB

1.H8でやっていた事を、SH7047Fで試しています。

MATH

MATH

MATH

$\vspace{1pt}$

2.ADCの前段のオペアンプ回路

MATH

3.プログラム(これで、全部です。)

/***********************************************************************/

/* */

/* FILE :ad_da.c */

/* DATE :Thu, Nov 27, 2003 */

/* DESCRIPTION :Main Program */

/* CPU TYPE :Other */

/* */

/* This file is generated by Renesas Project Generator (Ver.3.0). */

/* */

/***********************************************************************/

//AD変換した値を、2回毎に反転し、DSB波形を得る

#include "7047s.h"

#ifdef __cplusplus

//#include <ios> // Remove the comment when you use ios

//int ios_base::Init::init_cnt; // Remove the comment when you use ios

#endif

#ifdef __cplusplus

extern "C" {

#endif

void abort(void);

#ifdef __cplusplus

}

#endif

short data;

void InitSH(void)

{

PFC.PECRL1.WORD=0;

PFC.PECRL2.WORD=0;

PFC.PEIORL.WORD=0xFFFF;//PE I/O 書き出しモード

PFC.PACRL2.WORD=0;

PFC.PAIORL.WORD=0xFFFF;

PFC.PBCR1.BIT.PB5MD=0; //PB=出力

PFC.PBCR2.BIT.PB5MD=0;

PFC.PBCR1.WORD=0;

PFC.PBIOR.BIT.B5=1;

PFC.PBIOR.WORD=0XFFFF;

PFC.PDIORL.WORD=0xFFFF;

MST.CR2.BIT._AD0=0; // この設定がないと、AD変換器が動かない

AD0.ADCR.BIT.ADST=0;

AD0.ADCR.BYTE=0;

AD0.ADCSR.BYTE=0;

AD0.ADCR.BIT.CKS=0x3;

AD0.ADCR.BIT.ADST=1; //start AD

}

unsigned char i=0;

void main(void)

{

InitSH();

while(1)

{

PE.DRL.BIT.B12=1; //DA変換器用タイミング

if (AD0.ADCSR.BIT.ADF)

{

        AD0.ADCSR.BIT.ADF=0;

AD0.ADCR.BIT.ADST=0;

data=AD0.ADDR0.WORD; //AD変換後の値を取り込む

        data -=0x8400; //8400=無入力時の値

data=data>>6; //上位10ビットが有効

        ((i/2)%2) ? (data=2*data) : (data=-2*data); //2回毎に反転し、2倍する

         i++;

        data +=0x200; //DA変換器の中点は0x200(10進で=512)

PE.DRL.WORD =data;

AD0.ADCR.BIT.ADST=1;

}

PE.DRL.BIT.B12=0; //DA変換器用タイミング

}

}

void abort(void)

{

}

特殊な所は、ありません。

解りにくい所は

((i/2)%2) ? (data=2*data) : (data=-2*data); //2回毎に反転し、2倍する

では、ないでしょうか?

i は、

unsigned char i=0;

と、定義していますが、整数であれば、なんでもOKです。

表にすると、わかりやすいです。

MATH

ですので、

2回毎に、0と1を繰り返しています。

先ほどの式は、以下と、等価です。

if (( (i/2)%2 ) == 1 ) then data=2*data;

else data= - 2*data;

そんな訳で、2回毎に、入力が反転いたします。

 

((i/4)% 2)とすれば、 4回ごとに、符号を反転することが、できますね。

前述のプログラムでは、2回毎に、入力の符号を反転して、DSBを得ていましたから

サンプリング周波数は、実測によると

27.9KHz 4倍 =111.6KHz

に、なります。

firフィルタを導入すれば、もっと、サンプリング周波数が、下がると思いますが

まだ、SH7047Fのシステムクロックを、

最高49.152MHzの半分、24.576MHzで使っていますので

余裕があります。(P$\phi \quad $周辺I/Oクロックは、どちらも、同じで 24.576MHzです。)

10ビットDACで、果たして、fir フィルタの60dBの差を観察できますか、どうか?

あかんかったりして...泣くで、もう...

 

これが済めば、信号の複素化に進めるんですが...

H.15.12.15

This document created by Scientific Notebook 4.1. この文書は次の製品で作成しました Scientific Notebook 4.1.