今回は DDS についてお話しします。
DDS はダイレクト・デジタル・シンセサイザの略で、デジタル信号処理によって任意の周波数と任意の波形が出力できる方式です。
任意の周波数を得るのに昔はPLLシンセサイザが用いられていましたが、今ではより広範囲に高分解能な設定が可能なDDSが主流です。
 

図は通常のDDSの動作原理を説明するブロック図です。
DDSは専用ICとして数多くの種類が市販されており、例えば Analog Devices のAD9833等があります。AD9833は 28ビットのアキュムレータと28ビットの周波数設定レジスターを持っています。
周波数設定レジスターに 1を設定すると、クロック毎にアキュムレータの値は+1され 228回のクロックで 1周します。 228の 1/2 を設定すると 2回のクロックで 1周します。このようにしてアキュムレータから周波数設定レジスターに設定した値に応じた周波数出力を得ることができます。
またROMによってアキュムレータの出力を正弦波などに変換するROMと、それをアナログ値に変換するDACを持っています。ROMの内容によって正弦波や三角波、方形波などのアナログ波形を得ることができます。
クロックに25MHzを使用すると 0~12.5MHzを出力することができ、分解能は25,000,000/228 = 0.0931Hz となります。
このように高分解能ですが、周波数はレジスター設定値×0.093 となり半端な値になります。また0.093も約であり正確には 0.093132257... と割り切れません。
分解能を0.1Hzときっちりしようとすると、クロックは228×0.1Hz = 26,843,545.6Hzとなり、半端な値でカスタムで作らない限りちょっと入手困難です。

ところが、安田電子設計事務所ではオリジナルのDDS方式を発明し(特許出願中)、例えば 20MHz といった周波数の水晶発振子を用いてもきっちり1Hz単位の設定ができ、また小数点以下何桁でも水晶精度の正確な周波数を設定でき、例えば 9999.9999Hz でも水晶精度を損ねることなく簡単に設定できるDDSを提供できます。

詳細はお問い合わせください。

 

FPGAを用いたDDS回路設計の事例を紹介します。
写真は安田電子設計事務所で試作した非常に高精度な3チャンネルの DDS の事例です。
通常はDDSは専用ICを購入しますが、ちょっと特殊なものになると売られていません。そこでFPGAを使用してDDSを設計しました。
それによって正弦波、矩形波、鋸歯状波などを同時に出力可能です。
クロックには温度補償水晶発振器を使用し、±2ppm の絶対精度を得ています。

 

 電子回路の設計サービス/安田電子設計事務所 はダイレクト・デジタル・シンセサイザの設計も行っています。
 お困りのことがあればご気軽にお問い合わせください。

 

 

前回に引き続き、ルネサス RX65N-Envision-Kit (RX65N 評価ボード RTK5RX65N2C00000BR) を使ってタッチスイッチをのソフトを作成してみました。
15個のスイッチを表示し、タッチしたスイッチを赤く変色させています。もちろん複数のスイッチのタッチにも対応しています。
スイッチが押されると UART-USB変換ケーブルを経由してPCに情報を送るようにしました。
 

このソフトを作成する上で一番苦労したのはビットマップの作成です。
タッチしたスイッチを赤く変色させるために、押されていないときの黄緑のスイッチと押されたときの赤のタッチスイッチのビットマップを別々に作成しておいて、タッチすると表示バッファーのそのスイッチの部分のビットマップを赤のものに置き換えているのですが、楕円のスイッチに対して文字の位置が一致していないと押したとき文字が動いて違和感を感じます。
また楕円に1~15の文字フォントを重ねていますが、文字位置が不揃いだと見苦しくなります。
Paint とか Photoshop とかのソフトを使うと、BMPを切り取ったり貼ったりするのにマウス操作でやりますので、なかなかぴったりとしたビットマップデータができないのです。
そのため、ビットマップデータの操作には VisualC++ によるCプログラム(コンソールアプリ)を作成しました。
まずフォントデータですが、これは Paint で文字を 1234567890 と書いて、それを切り抜いたデータを作成しました。

ちなみにフォントは商用使用も考えて、著作権フリーの IPAex明朝体を使いました。このフォントは、たとえこのソフトが商用になっても自由に使用できます。パソコンに入っているフォントはパソコン以外に流用すると、いろいろ制限が入っている可能性がありますので要注意です。
明朝体自体には著作権はありませんが、プログラムデータとしてデジタル化するとプログラムとしての著作権が発生するらしいです。

まず 1234567890 のビットマップから数字を1つずつ切り出すのにコンソールから数値を入れて切り出せるプログラムを作りました。それによって、希望ぴったりの位置のデータを切り出せます。
それから、文字のギザギザをなくしなめらかに表示するために中間色を使用しますが、白地に黒色のフォントなのになぜかグレー以外の有色が発生しています。理由はわかりませんが、Paint も Photoshop もそうでした。
黄緑や赤の背景と重ねるときに色が付いていると難しいので、色をグレー化するプログラムを作りました。Photoshop でグレー化すると 24ビットカラーが 8ビットカラーに変換されてしまうので、Cでプログラムを作りました。
楕円のビットマップ作成Cプログラムと、それにフォントを重ね合わせるCプログラムも作りました。中間色も背景とフォントの色から合成しました。
そうやってビットマップを苦労して作成したのが上の写真のように表示するソフトです。
 

紹介する Webページ です。のぞいていってください。


お客様からいろいろな表示の要求があっても、画像処理ソフトに適切な物がないと言って悩まなくても、自分で処理ソフトを作れることがわかりました。
 

 電子回路の設計サービス/安田電子設計事務所 はタッチパネルや各種表示の設計も行っています。
 お困りのことがあればご気軽にお問い合わせください。

 

ルネサス RX65N-Envision-Kit (RX65N 評価ボード RTK5RX65N2C00000BR) を使って写真の描画をしてみました。画面サイズは 480×272 で、表示に使える RAM は 384KB ありますので、1面を表示するだけなら 16ビットカラーが使えます。しかし画面を瞬時に切り替えたりする用途の場合には 2面必要なので、8ビットカラーを使うことにしました。
 

そして、この写真のように表示することができました。

撮影場所は桜で有名な枚方市の天の川の堤防です。

 

描画できるようにする手順を説明します。
 

1. 写真 (jpeg ファイル) の解像度を減らし、カットして 480×272ピクセルのデータにする。
 

2. インデックスカラー (256色) に変換して、ビットマップで複製を作る。
 

註)1. 2. には画像処理ソフト Photoshop Lite を使いました。
 

3. プログラムを組んで、カラーパレットを抽出して、ファイルに次のようなデータを書き出す。
もちろん変数名は cp でなくても自由です。
const unsigned long cp[] = { ... };
 

4. プログラムを組んで、画像データを抽出して、ファイルに次のようなデータを書き出す。
const unsigned char bmp_data[] = { ... };
もちろん変数名は bmp_data でなくても自由です。
 

註)ビットマップ・ファイルは下記のような順で情報が入っています。
// ビットマップ・ファイル・ヘッダー
struct BITMAPFILEHEADER {
    WORD    bfType;      // ファイルタイプ BM
    DWORD   bfSize;      // ファイルサイズ (byte)
    WORD    bfReserved1; // Reserved; 常に 0
    WORD    bfReserved2; // Reserved; 常に 0
    DWORD   bfOffBits;   // ファイル先頭から画像データまでのオフセット(byte)
};
// ビットマップ・情報ヘッダー
struct BITMAPINFOHEADER {
    DWORD      biSize;            // 情報ヘッダサイズ[byte]
    LONG       biWidth;           // 画像の幅[ピクセル]
    LONG       biHeight;          // 画像の高さ[ピクセル]
    WORD       biPlanes;          // プレーン数  常に1
    WORD       biBitCount;        // 色ビット数[bit]  1,4,8,(16),24,32
    DWORD      biCompression;     // 圧縮形式  0,1,2,3
    DWORD      biSizeImage;       // 画像データサイズ[byte]
    LONG       biXPelsPerMeter;   // 水平解像度[dot/m]  0の場合もある
    LONG       biYPelsPerMeter;   // 垂直解像度[dot/m]  0の場合もある
    DWORD      biClrUsed;         // 格納パレット数[使用色数]  0の場合もある
    DWORD      biClrImportant;    // 重要色数  0の場合もある
};
// RGBQUAD (rgbBlue, rgbGreen, rgbRed, rgbReserved) カラーパレット
DWORD palet[256];    // 256色カラーパレット
// 画像データ

プログラムは Visual C++ の Win32 コンソールアプリで作りました。
説明は構造体で書きましたが、実際には fread() で構造体に入れると、Visual C++ では WORD bfType; の次に2バイトパディングされてしまってうまくいかないので、バイトデータとして fread() して、入れ直しました。

LCD 用メモリーセクションは次のように作成しました。
8ビット (256色) のデータバッファーを 2面確保しました。

#pragma section LCD    // リンカーに登録する。リンカーでの名称は BLCD_1 となる。
volatile unsigned char lcd_buffer[2][272][512];
#pragma section

ラインは 480 なのに 512 でバッファーを作っているのは、読み出しが 64バイトなので、64 の整数倍である必要があるからです。
データを設定するプログラムは次のようになります。
// カラーパレット
    for (i=0; i<256; i++) {
      GLCDC.GR2CLUT0[index].LONG = cp[i];
    }
// 画像データ
  for (i=0; i<272; i++) {
    for (j=0; j<480; j++) {
      lcd_buffer[0][i][j] = bmp_data[i * 480 + j];;
    }
  }
 

 電子回路の設計サービス/安田電子設計事務所 はRXマイコンの設計も行っています。
 お困りのことがあればご気軽にお問い合わせください。

 

 

ルネサス RX65N-Envision-Kit (RX65N 評価ボード RTK5RX65N2C00000BR) を買いました。
5年くらい前に発売されたもので、もう売っているところが少ないですが、Mouser で \7,330 で売っています。
4インチ液晶とE2エミュレータLiteが内蔵で、とてもお買い得です。在庫がなくなったらもう買えないかもしれませんので、買うなら今のうちですよ。

 

ルネサスのマイコンで RX62T や RX63N はよく使いましたが、RX65N を使うのは初めてです。
RX65N には スマート・コンフィグレータ(以下 SMC と略します)という自動でペリフェラルを設定する機能プログラムを生成するがあります。

RX62T や RX63N には Peripheral Driver Generator というのがあって、やはり自動でペリフェラルを設定するプログラムを生成する機能がありました。
しかし私は自動で生成すると、その後手動でそのプログラムを触ろうとすると、プログラムの解析をしないといけなくて大変です。そのためペリフェラルの設定は全部手動で行っていました。
新規にプロジェクトを作成するといくつかの c および h ファイルができますので、そのファイルを変更して使っていくことになります。
例えばペリフェラルなどの初期設定は void HardwareSetup(void) という関数の中に書きます。
割り込みを使う場合は、intprg.c の中に空の割り込み処理関数が書かれているので、これをコメントアウトして、自分で作成したプログラムファイルの中に先ほどコメントアウトした割り込み処理プログラムを処理を追加して書きます。(もちろん intprg.c の中に書いてもいいですがわかりにくくなるので移動します。)
割り込みベクターは vect.h に書いてあり、基本的には変更の必要はありませんが、同じ割り込みベクターで異なる複数の割り込みが定義されている場合は使うほうをコメント解除し、使わないほうをコメント解除する必要があります。
またデフォルトは多重割り込み禁止ですので、許可する場合は vect= の前に enable, を追加します。
 

RX65N の場合も同じようにできるだろうと思い、新規プロジェクト作成時に SMC不使用にしてプログラムを作成してみました。(具体的には新規プロジェクト作成時に Use Smart Configurator のチェックを外す。)
コンパイラーは GCC も使えますが、今まで通り CC-RX コンパイラーを使いました。RX65N は RX62T や RX63N 同様に V2 が使えます。RX67 以降の製品は V3 でないと使えないようです。
CMT0 でタイマー割り込みを掛けて Lチカプログラムを作成してみましたが、割り込みが掛かるとハングアップしてしまいました。
症状からして割り込みベクターが正常に設定されていないようなので、プロジェクト作成時に自動生成されたコードを隅々まで調べましたが、わかりませんでした。
私の結論としては RX65N の CC-RXコンパイラーは SMC不使用には対応していないため、使わざるを得ないということです。
 

Use Smart Configurator にチェックを入れて SMC を使うようにすると、 src (ソースコード) のフィルダーの下に smc_gen というフォルダーができて FITモジュール(Firmware Integration Technology)が組み込まれます。
そこで、必要最小限の FITモジュールを使用することにしました。
クロックの設定は SMC に任せて問題なさそうなので、任せることにしました。
ピン設定は SMC に任せると、ソースコードを見てもどう設定したかわからなくなるので、自分のソースコードの初期設定に記述することにしました。そうすると smc_gen 内に r_pincfg というフォルダーができますが、中身は処理がない空の関数ができ、実際の設定は自分のソースコードで行うことになります。
割り込みを SMC で設定すると、例えば CMT0 によるタイマー割り込みを設定すると smc_gen 内に Config_CMT0 ができ、標準の初期設定は Config_CMT0.c 内に、ユーザー専用の初期設定と割り込み処理は Config_CMT0_user.c 内にできます。
やはり SMC に任せると、ソースコードを見てもわからなくなるので、初期設定は自分のソースコードの初期設定に記述し、割り込み処理ルーチンは自分のソースコードに次のように記述しました。
#pragma interrupt r_Config_CMT0_cmi0_interrupt(vect=VECT(CMT0,CMI0))
static void r_Config_CMT0_cmi0_interrupt(void)
{
  割り込み処理を記述
}
こうすることによって、最小限の SMC と最小限の FITモジュールで、無事 Lチカプログラム を作成できました。
 

 電子回路の設計サービス/安田電子設計事務所 はRXマイコンの設計も行っています。
 お困りのことがあればご気軽にお問い合わせください。

 

 

 以前は文字を表示するには液晶(LCD)キャラクターディスプレイが簡単に入手できたのでよく使いましたが、最近では有機ELも入手できるようになったので、そちらのほうをよく使うようになりました。
 有機ELは自己発光型なので、バックライトがなくても暗いところで見ることができ、液晶よりもコントラストが高くてきれいに表示されます。また発光色もいくつかのものがあって選択使用できます。

 秋月電子通商で入手でき、私がよく使うものに次のものがあります。
 写真にすると色彩が少し変わっていますが、色の参考にしてください。
 緑色有機EL SO1602AWGB-UC-WB-U
 黄色有機EL SO1602AWYB-UC-WB-U
 白色有機EL SO1602AWWB-UC-WB-U

 

 有機EL表示設計のウェブ はこちら

 各種表示パネルの設計サービスをしています。
 電池機器の設計もします。

 

 電子回路の設計請負/安田電子設計事務所 はさまざまなニーズに応じた設計を行っています。
 お困りのことがあれば、ブログで見たと言っていただけば特別価格で請け負います。ご気軽にお問い合わせください。