トラ技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