« HC08マイコンの使い方QY4A編 -《76》外部割り込み(IRQ)(3) | メイン | 78K マイコンでLED温度計  »

STM8Sマイコンで作る警報音 (2)


STM8S-Discoveryに圧電スピーカをつなぐ 断続的に鳴らす

 STマイクロエレクトロニクス社(以下ST社)の STM8S-Discovery に圧電スピーカをつないで,断続的に音を出します.

Timer3モジュールと連携させる

 音を断続的に ON / OFF させるためには, ON と OFF のタイミングを作る必要があります.そこで,以前作成した「LEDチカチカ」プログラムを流用して,「LEDが光り始めるタイミングで音を断続させる」ようにします.

LEDの点滅と音の断続の関係

 上の図のように, LED を駆動する PWM 出力は,タイマの UPDATE イベントで LOW になり, OC2 (Output Compare 2) イベントで HIGH になります.音を断続させるため,これらのイベントのうち, UPDATE イベントだけを監視して,ソフトウェアで音を ON / OFF させます.すると, Beeper モジュールは,1秒間音を出して,1秒間音を止めるという動作を繰り返すようになります.

プロジェクトを作ろう

 方針が決まったら,さっそく,アプリケーションを作成します. "workspace03" というワークスペースを "C:\Projects\STVD\ws03" というフォルダに作成し, "project03" というプロジェクトを "C:\Projects\STVD\ws03\proj03" というフォルダに作成しました.

ワークスペース・ペイン

 次に,ライブラリをリンクします.今回使用するのは, Timer3 モジュールと Beeper モジュールの二つです.リンクしたファイルは,以下のとおりです.

リンクするファイルリンク先用途
FWLib\library\inc\stm8s.hInclude Files汎用ヘッダ
FWLib\library\inc\stm8s_beep.hInclude FilesBeeper モジュール・ヘッダ
FWLib\library\inc\stm8s_timer3.hInclude FilesTimer3 モジュール・ヘッダ
FWLib\library\src\stm8s_beep.cSource FilesBeeper モジュール・ライブラリ
FWLib\library\src\stm8s_timer3.cSource FilesTimer3 モジュール・ライブラリ


 さらに, "stm8s_conf.h" ファイルをコピーして,コメントになっている二つのマクロ _BEEP と _TIM3 の宣言を非コメント化します.

_BEEPを非コメント化 _TIM3を非コメント化

 変更が終わったら, ctrl+S でファイルを保存します.

ソース・コードを書きなおそう

 "main.c" ファイルを以下のように書き換えます.

//**************************************
//
// main.c : 
//  
// Copyright (c) 2010 noritan.org
//
//**************************************

#include "stm8s.h"

//======================================
// Constant declaration
//======================================
#define PERIOD  (62500)         // timer counter period
#define DUTY    (PERIOD/2)      // PWM duty value

//======================================
// Wait for TIM3 update
//======================================
void wait_tim3_update(void) {
  // Wait for TIM3 update
  while (!TIM3_GetFlagStatus(TIM3_FLAG_UPDATE));
  // Clear the update flag
  TIM3_ClearFlag(TIM3_FLAG_UPDATE);
}

//======================================
// Main procedure
//======================================
main()
{
  // Initialize Beeper module.
  BEEP_Init(BEEP_FREQUENCY_1KHZ);
  
  // Initialize Timer3 module.
  TIM3_TimeBaseInit(            // Configure Timebase
    TIM3_PRESCALER_32,          // divide by 32
    PERIOD-1                    // divide by PERIOD
  );
  TIM3_OC2Init(                 // Configure OC2 output
    TIM3_OCMODE_PWM1,           // PWM mode-1 output
    TIM3_OUTPUTSTATE_ENABLE,    // Enable OC2 output
    DUTY,                       // Activated on count DUTY
    TIM3_OCPOLARITY_LOW         // LOW active output
  );
  
  // Start Timer3
  TIM3_Cmd(ENABLE);             // Start the Timer
  
  // Loop forever
  while (1) {
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(ENABLE);           // Enable BEEP
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(DISABLE);          // Disable BEEP
  }
}

 アプリケーションは,以上で完成です.ビルドして,エラーが発生しないか確認しましょう.

プログラムの解説

 プログラムをちょっとだけ解説します.おおまかな構成は,「LEDチカチカ」プログラムと同じです.そこで,「LEDチカチカ」プログラムとの違いを見ていきます.

//======================================
// Wait for TIM3 update
//======================================
void wait_tim3_update(void) {
  // Wait for TIM3 update
  while (!TIM3_GetFlagStatus(TIM3_FLAG_UPDATE));
  // Clear the update flag
  TIM3_ClearFlag(TIM3_FLAG_UPDATE);
}

 wait_tim3_update() は, Timer3 モジュールが発する UPDATE イベントを待ち合わせるための関数です. TIM3_GetFlagStatus() 関数で UPDATE イベント・フラグを検出し, while 文でフラグがセットされるまで待ちます.フラグが検出されたら, TIM3_ClearFlag 関数で UPDATE イベント・フラグをクリアして,関数の処理を終えます.

  // Loop forever
  while (1) {
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(ENABLE);           // Enable BEEP
    wait_tim3_update();         // Wait for TIM3 update
    BEEP_Cmd(DISABLE);          // Disable BEEP
  }

 無限ループの内部で音を断続させる処理を行っています. Timer3 モジュールの UPDATE イベントが発生するのを待ち, Beeper モジュールをイネーブル・ディセーブルしています. UPDATE イベントは,1秒ごとに発生するので,このループを一周するのに2秒かかることになります.

プログラムを書き込んで,実行しよう

 ハードウェアは,「継続して鳴らす」場合と同じです.そのまま,メニューから「Debug → Start Debugging」を選択し,デバッガを起動します.そして,メニューの「Debug → Run」を選択すると,プログラムの実行が開始されます.


 メニューの「Debug → Stop Program」を選択すると,音の断続が停止し,さらに,「Debug → Restart」を選択するとプログラムをリセット直後の状態で停止させます.

参考文献
STM8S-DISCOVERY (User Manual UM0817)
STM8S-Discoveryのハードウェアについてのマニュアルです.回路図及びジャンパの設定方法などが記述されています.
STM8S firmware library (stm8fwlib.zip)
STM8Sシリーズのペリフェラルを簡単に使用するためのライブラリです.
STM8S microcontroller family (Reference manual RM0016)
STM8Sシリーズのリファレンスマニュアルです.マイコンに内蔵されたペリフェラルの詳細な動作については,このマニュアルに記述されています.
STM8S105xx (Datasheet STM8S105xx)
STM8S105マイコンのデータシートです.このマイコンに固有の情報が記述されてます.
田中範明(noritan.org)

カテゴリ:

トラックバック

このエントリーのトラックバックURL:
http://www.eleki-jack.com/mt/mt-tb.cgi/4041





カテゴリ

会社案内
情報セキュリティおよび個人情報の取り扱いについて

コメントとトラックバックは、spamを予防するために、編集担当が公開の作業をするまで非公開になっています。
コメントはそれぞれ投稿した人のものです。

Powered by
Movable Type 4.1
/*yahoo remove*/