AKI-SH2(HitachiSH2/7045)プログラミング例
Copyright(C) 29Jan2004
coskx
1. はじめに
この文書はSH2/4075を用いたプログラミング例を示します。
(1)PWM信号発生
(2)PWMを使ったPWM駆動
(3)phase
counterを用いたロータリエンコーダパルス計測
(4)スキャンモードADCでのステレオ録音
サンプルプログラムのダウンロード
DownLoad |
図1 AKI-SH2/7045 マザーボード |
2. MTU3を用いた単相PWM出力
シリアル通信でつながれたターミナル側(ハイパーターミナル)から数値(デューティ比)を与えてその値でのPWM波形を出力するプログラム。
PWM周波数は7.1kHz(7.1MHzクロック1000個分)でデューティ比は0〜1000の数値で与える。
pwmtest.c |
#include "7040S.H" /* TGRA<TGRBにするとデューティ比が100%になる void initPWM3AB(unsigned short int countermax, int
clockindex) void setPWMvalue3AB(unsigned short int
value) /* /*
|
この部分は卒業研究生山下晃弘君,永山明日香さんの貢献です。
3. MTU0とPAbit16,17を用いたPWM出力によるモータドライバ用出力
シリアル通信でつながれたターミナル側(ハイパーターミナル)から数値(デューティ比)を与えてその値でのモータ駆動用PWM波形を出力するプログラム。
PWM周波数は7.1kHz(7.1MHzクロック1000個分)でデューティ比は-1000〜1000の数値で与える。負の値の時,モータは逆転する。
motor.c |
#include "7040s.h" /********************************************************************** /********************************************************************** clockindex = 0 then MTUclock = φ PFC.PECR2.BIT.PE0MD =
1; //PE0/TIOC0A端子をoutputコンペア出力に設定 MTU.TSTR.BIT.CST0 =
1; //PWM動作スタート /********************************************************************** #define PWM_MAX
1000 |
この部分のオリジナルは卒業研究生山下晃弘君の貢献です。
4. MTU1と2を用いた二相カウンタ
インクリメンタルロータリエンコーダの二相パルスをカウントするカウンタが2チャンネルあるので,これを使い,2つのインクリメンタルロータリエンコーダによる角度検出を行なう。ターミナルのキーがどれか押されると,カウンタの値はクリアされる。
counter.c |
#include "7040s.h" /*入力の接続 //位相計数カウンタ初期化 void initCounter2(int
mode) /* 以下の関数は関数マクロとする。 //カウンタ値読み出し //カウンタリセット main() SCI1_printf("Phase Counter 1 and Phase Counter 2\n");
startCounter1();
while(1){ |
この部分のオリジナルは卒業研究生山下晃弘君の貢献です。
5. ADコンバータ入力
ADC0,ADC1を初期化し,8bitサンプリングで1秒間ステレオ録音した後,録音データをシリアル通信でテキスト送信するプログラム。
サンプリング周波数は8kHz,であり,これはコンペアマッチタイマによる割り込みで実現している。
ADC0ではAN0のみ,ADC1ではAN4のみを変換する。ADCは10bitの変換を行ない,これがレジスタのbit15からbit6までに格納される。
右に8シフトすると0〜255の数値に変換される。
起動後,ADC変換値の平均値(期待値0x8000)を表示するが,PCのキーを押すと「Ready」と表示され,さらにキーを押すと1秒間の録音が開始される。その直後データのシリアル出力が始まるので,テキストキャプチャしておくと良い。
ADCtest.c |
#include "7040S.H" /*スキャンモードでADC0を初期化 AN0のみ使用*/ /*スキャンモードでADC1を初期化 AN4のみ使用*/ /**********************************
int main(void)
while(chkgetCharSCI1()<0){ while (counter<8000); #pragma interrupt |
この部分のオリジナルは卒業研究生永山明日香さんの貢献です。