/********************************************************/ /* プロジェクト名: pwmsmpl */ /* ファイル名: pwmsmpl.c */ /* 内容: PWM実習プログラム */ /* TA2out(P74),TA3out(P76)を用いて */ /* 約2.5秒でモータLEDを明滅させる。 */ /* timerA2,A3を用い、PWMの周期T=1msと */ /* して明滅処理を行う。 */ /* 日付: 2005.10.24 */ /* コンパイラ: NC30WA (Ver.5.10 Release 1) */ /* note: OAKS16対応(OAKS16LCDボード) */ /* 作成者: Kazuhiko Araki */ /* 修正内容: センサーラボ専用にして,モータ回転用に */ /* 初心者用にコメント修正 */ /* 修正日: 2006.06.26 */ /* 修正者: TAMURA, Hitoshi */ /********************************************************/ /* インクルードファイル */ #include "sfr62a.h" /* プロトタイプ宣言 */ void _main( void ); // メインプログラム /* マクロ定義 */ #define PORTOUT 0xff // ポート方向レジスタを出力に設定する為のデータ #define LOWERLIMIT 0xfe // センサーLABO使用時のモータ停止時のデータ #define UPPERLIMIT 0x80 // センサーLABO使用時のモータ高速時のデータ #define OFF 0x00 // フラグのOFFを示すデータ #define ON 0x01 // フラグのONを示すデータ #define CNT_TA0 (2500-1) // タイマA0カウンタ値 fck=f1/32 #define CYCLE_TIME (63-1) // タイマA3周期カウンタ値 #define S_MOTOR_R 0x4 // 右モータ用スタートフラグ #define S_MOTOR_L 0x8 // 左モータ用スタートフラグ #define S_TIMER_A0 0x1 // タイマA0用スタートフラグ #define S_TIMER_A1 0x2 // タイマA1用スタートフラグ /* 外部変数宣言 */ void main( void ) { /* 変数の宣言 */ unsigned char dutydata; // デューティ(モータの回転速度)用の変数 unsigned int buf; // モータへのパラメータ用 /* タイマの初期化 */ // timerA0設定 割り込みは使用せず要求ビットのみを監視 udf = 0x00; // ダウンカウント設定 ta0mr = 0x80; // タイマモード クロック:1/32 ta0 = CNT_TA0; // タイマ値の初期化 ta0ic = 0x00; // 割り込みレベルの設定 /* モータの初期化 */ //モータの回転方向の設定 p3 = 0xff; // 左モータの回転方向セット pd3 = PORTOUT; // ポート3を出力に設定 //モータの回転速度の設定 (timerA3を8ビットPWMモードで使用し,速度を設定) ta3mr = 0x27; // パルス幅変調モード クロック:1/1 ta3ic = 0x00; // 割り込みレベルの設定 dutydata = LOWERLIMIT; // デューティ(モータの回転速度)を最低速に buf = (( (unsigned int)dutydata << 8 ) | CYCLE_TIME); // タイマ値の初期化(上位8ビットが速度,下位8ビットが周期の設定) ta3 = buf; //そのタイマ値でタイマ3(左モータ)をセット /* 設定されたタイマとモータを起動 */ tabsr = S_MOTOR_L | S_TIMER_A0; // タイマーのカウント開始(左モータとタイマA0) for( ; ; ) { /* メインループ 無限に繰り返し*/ if( ir_ta0ic == 1 ) { /* 5msに一回だけこの中に入る */ ir_ta0ic = 0; //タイマのフラグを元に戻す dutydata--; // 速度を一段階速める if( dutydata < UPPERLIMIT ) // モータの最高速を超えていたら { dutydata = LOWERLIMIT; // 最低速に戻す } buf = ( (unsigned int)dutydata << 8 ) | CYCLE_TIME; //新しい速度でタイマ値を再計算 ta3 = buf; //新しいタイマ値でモータを再設定 } /* else の部分は省略,5ms経過しないときは本当は実行されるはずの部分 */ } }