トラ技4月号付録のR8C/15マイコンとPWM

 

1. R8C/15と、開発環境

    去年の、トラ技4月号付録のマイコンは、手に入らなかったが、

今年は、手に入りました、るんるん。

今度のHEWも、素晴らしいですね。

HTERM不要です。

オンラインでアップデートできます。(これは、有償版でした...無償版では、アップデート情報のページが表示される?)

いや、無償版でも、オンラインでアップデートできます。

タスクバーの中(時計の近く)に、オートアップデートのアイコンがでてますよ、失礼しました。

デバッグの全てを、HEWで、できます。

勿論、まだ、全然、使い切れてないです。

Renesas社に、御礼申しあげます、m(__)m

PWM形DAコンバーターは、出力が一つで、よいみたいなので、実験してみる事に、しました。

 

ところで、R8C/15の、アセンブリを見てみると、すごいですね。

レジスタ、メモリを区別しない命令:MOV、ADD、SUB、など

H8だと、いったんレジスタに、値を入れて、それから

MOV命令で、メモリに転送するのに....

Cとアセンブリ混在の、ところを、見てみると

    tm0 =ad; //タイマC TM0カウンタの値をセット
    0E0D0 73FFC0009C00 MOV.W 00C0H,009CH

メモリ間の転送も、1命令ですわ.....

●高速な命令実行時間

 最短1 サイクル命令:89 命令中20 命令が1 サイクル命令をもつ

 (約75% の命令が5 サイクル以下)

C言語に適した命令をもち、使用頻度の高い命令を1バイトオペコードに配置していますので、アセンブ

リ言語を使用しても、C 言語を使用しても、より少ないメモリ容量で効率の良いプログラムを開発できま

す。また、1 クロックで実行する命令をもたせ、高速な演算処理を実現しました。

 

[R8C/Tinyシリーズのソフトウエアマニュアルから、抜粋]

 

なるほど、ええですね....

 

2.PWM形DAコンバーター、と、なっ?

   PWM(Pulse Width Modulation)は、パルスのデューティ比を変化させて(周期は一定)、アナログ値に変換するものだ、そうです。

   デューティ比の変化が、ローパスフィルターを通すと、

   何と!、DA変換に、なるのです。

   入力値に比例して、デューティ比が比例的に変わるのは、解るけど、DA変換になるのは、理解不能....    (T_T)

----------------------------------------------------------------------------------------------------------------------

    以下の結果は、ローパスフィルターを通さないで、観測したものです。

    タイマソースf1    20MHz

    prez=0; //プリスケーラZレジスタ PREZ

    tzsc=127; //タイマZセカンダリレジスタ 
    tzpr=127; //タイマZプライマリレジスタ TZPR     の設定時

    タイマソースf1    20MHz

    prez=0; //プリスケーラZレジスタ PREZ

    tzsc=27; //タイマZセカンダリレジスタ 
    tzpr=227; //タイマZプライマリレジスタ TZPR     の設定時(tzsc tzprを変えて、デューティ比を変えた、周期は、同じ)

両者を比較すると、

基本波は、同じ周波数だが、

先のもの(デューティ比50%)は、奇数次の高調波しか、含まない。

後のもの(デューティ比は、228/(228+28)=89%)は、偶数次の高調波も、奇数次の高調波と、同じくらいに、含んでます。

だから、どうなん ?

そのー....よう解らん....

コンピュータ制御及び実習

電気と電子のお話

を、ご覧になって下さい。

わたしゃ、まだ、解らんねん。

3.PWMでDA変換

    さっそく、トラ技4,5月号を見ながら、DA変換の実験です。

 

/***********************************************************************/
/* */
/* FILE :timerZ_3.c */
/* DATE :Mon, May 09, 2005 */
/* DESCRIPTION :Main Program */
/* CPU TYPE :Other */
/* */
/* This file is generated by Renesas Project Generator (Ver.4.0). */
/* */
/***********************************************************************/



#include "start.h" 

unsigned char sin[64]={
127,
139,151,163,175,186,197,207,216,225,232,
239,244,248,251,253,254,253,251,248,244,
239,232,225,216,207,197,186,175,163,151,
139,127,114,102,90,78,67,56,46,37,
28,21,14,9,5,2,0,0,0,2,
5,9,14,21,28,37,46,56,67,78,
90,102,114
};

unsigned char i;

void set_timerZ(void);

void main(void)
{
i=0;

set_CLK20();

set_LED();

set_timerZ();

asm("FSET I"); //割り込み許可
tzs = 1; //タイマZカウント制御開始ビットのセット
while(1);


}

void set_timerZ(void)
{
tzck0=0; //timerZのカウントソース f1 設定 タイマカウントソース設定レジスタ TCSS
tzck1=0;

tzmod0=1; //プログラマブル波形発生モード設定 タイマZモードレジスタ TZMR
tzmod1=0;
tzwc=1;

tzocnt=0; //プログラマブル波形出切替えビット タイマZ出力制御レジスタ TZOC
tzos=0; //ワンショット禁止

inostg=0; //タイマZ波形出力制御レジスタ タイマZ波形出力制御レジスタ PUM
inoseg=0;


prez=0; //プリスケーラZレジスタ PREZ

tzsc=127; //タイマZセカンダリレジスタ 
tzpr=127; //タイマZプライマリレジスタ TZPR

// tzscとtzprの、設定の順序を逆にすると、tzscの設定ができないわ!

ilvl0_tzic = 1; // タイマz割り込み優先レベル(レベル1)
ir_tzic = 0; // タイマz割り込み要求フラグクリア

}

#pragma interrupt timerZ_int (vect=24)

void timerZ_int(void)
{
if(i==64)i=0;

tzsc =sin[i]; //タイマZセカンダリレジスタ

tzpr =254-tzsc; //タイマZプライマリレジスタ TZPR

i++;

p1_1= ~p1_1;// LED1接続端子 出力レベル反転

}

 

start.hは、いつもする設定を、纏めた、Cファイルです。

何ちゅうことも、ないです。

中身は

#include "SFR_R815.h "

void set_CLK20(void)
{
prc0=1;
cm13=1;
cm05=0;
cm06=0;
asm("nop");
asm("nop");
asm("nop");
asm("nop");
ocd2=0;
prc0=0;
}

void set_LED(void)
{
drr1=1;
drr2=1;
pd1_1=1;
pd1_2=1;
p1_1=1;
p1_2=0;
}

---------------------------------------------------------------------------------------------------------------------

2次高調波とは、37dB位の差が、ありますから、

出力が1本で、これなら、ありがたいです。

10kΩと0.1μFの、1次ローパスフィルタを、通しました。(無負荷)

4.設計の要旨は

 R8C/15の、タイマーZは、プログラマブル波形発生モードを使います。   

「出力波形の幅、周期プライマリ期間:(n+1)(m+1)/fi

セカンダリ期間:(n+1)(p+1)/fi

周期:(n+1){(m+1)+(p+1)}/fi

fi: カウントソースの周波数

n:PREZレジスタの設定値、m:TZPRレジスタの設定値、p:TZSCレジスタの設定値」

(ルネサス社のハードウェアマニュアル r8c14hm.pdf から引用)

fiはf1(20MHz)を選択。

周期を一定にしなくては、いけませんから

n=0 (prez=0)として、できるだけ高い周波数にすると

(m+1)+(p+1)=一定

に、しなくては、いけません。

8ビットで、PWMにするには

(m+1)+(p+1)=256

として

この関係で、mと、pの値を動かします。

 

割り込みの関数で、操作しないで

メイン関数のところで

while(1)
{
if(i==64)i=0;

tzsc =sin[i]; //タイマZセカンダリレジスタ

tzpr =254-tzsc; //タイマZプライマリレジスタ TZPR

i++;
}

と、することも、できますが

出力周波数は上がるものの、波形が、何故か、汚くなります。

 

何はともあれ、PWM形DA変換を、初めて、経験しました。

( junzoの経験値が、1上がった )

 

H.17.5.11