【温度センサーIC+PICマイコンの設計】-3:温度センサーICの出力信号をマイコンに取り入れる(ソフト設計編-2:別版)

エレキ設計

この記事でわかること

別投稿”【温度センサーIC+PICマイコンの設計】-3:温度センサーICの出力信号をマイコンに取り入れる(ソフト設計編-2” では、“main.c”と “tmr2.c” プログラムでの編集を説明しましたが、本投稿は、“main.c”の編集だけ(”tmr2.c”編集無し)で同じ仕様に合った動作を行うプログラム編集を紹介します。
そして、本プログラムをMPLAB X IDEのシミュレーションにて検証します。

プログラムの特長:
・本投稿:main.cファイルのみの編集、全てを一つのファイルにまとめるため単独で設計する時に有利
・別投稿:main.cとtmr2.cファイルの編集は、複数ファイルを複数設計者で行う時に有利

仕様

仕様(要点):

  1. システムクロックは、PICマイコン内の発振器:16MHzを選択
  2. 2ピンをアナログ入力AN0端子名設定
  3. マイコン内の10ビットA/D変換モジュールを採用
  4. 10秒タイマーで時間管理、割り込み使用
    (温度観測タイミングが、正確に10秒毎ではありません。)
  5. 温度電圧値から温度を計算します。計算式の解説は、ここを参照
  6. 温度表示は、有りません。今回はマイコン内で確認します。

前提として、上記、”仕様(要点)”項の 1~6項目を満足するプログラム作成の方法

“MPLAB X IDE”支援ソフトのMCC機能を使い、下記、5つのプログラムを生成しました。
作成の詳細は、前記事【温度センサーIC+PICマイコンの設計】-2  ソフト設計-1を参照
簡単に前記事のおさらい

  1. システムクロック
  2. ADCモジュール
  3. FVRモジュール
  4. タイマーモジュール
  5. メインプログラム( main.c )

1~4までのプログラムを、MCC機能を使い生成、”Generate”ボタンを押下して、1~5のプログラムを含んだ、全体で完結したプログラムを自動生成します。後は、仕様に沿って一部のプログラムを編集します。

今回は、”main.c”の編集で本仕様に対応します。

ソフト設計(仕様に合った動作をmain.cのみの編集で対応)

下記のフローでは、MCC機能で生成したプログラム群の中で、“main.c”ファイルのみを変更します。
タイマーTMR2( tmr2.c ) は、MCC機能で生成のまま編集無しです。

図 1:main.c 編集, tmr2.c 編集無 のプログラムフローチャート

説明:
黒色:ユーザーが追加するプログラム
青色:MCC機能で生成した部分に相等

main 関数 ( MCC機能で生成+編集

  • System_Initialize
    MCC機能で生成
    初期設定
  • TMR2_SetInterruptHandler
    TMR2_flag_set_ProcessのアドレスがTMR2モジュールに登録されます。
    よって、割り込み処理プログラム中にmain.cプログラムのTMR2_flag_set_Process関数にジャンプします。
  • TMR2 Interrupt enableTMR2_stoptimer
    TMR2の割り込み許可と初期化
  • ADC_GetConversion、Temperature calculation、TMR2_10sec_flag “0” set、
    TMR2″0″, Start-time

    MCC機能で生成したADC関数を使い、A/D変換処理を実行
    温度センサーIC出力電圧値から温度値を計算します。
    計算式の詳細は、ここを参照
    10秒タイマーフラグを”0″に設定
    TMR2タイマー”0″からスタート開始
  • CMP. TMR2_10sec_flag=0
    TMR2_10sec_flag値 判定
    ・YES(TMR2_10sec_flag=0 )⇒ TMR2 10sec count wait : 10秒達成待ち継続
    ・No(TMR2_10sec_flag=1)⇒ 10秒達成 ⇒ TMR2_StopTimer : TMR2カウンターストップ       
     ⇒ ADC_GetConversionに遷移

TMR2_flag_set_Process 関数
本関数で、10秒達成時に行うプログラムを追加する事がでいます

  • TMR2_10sec_flag “1” set
    タイマー2割り込み処理編集プログラム分をmain.cファイル中に追加します。
    よって、tmr2.cファイルの編集が不要となります。
    編集内容:10秒達成フラグ(TMR2_10sec_flag)に “1” 設定

tmr2.c ( 割り込み処理、MCC機能の生成のまま、編集不要 )

  • ISR
    割り込み処理
  • TMR2 10msec × Interrupt count handler
    10msec割り込み処理
    割り込みカウンターアップ
  • 100 count Interrupt
    10秒タイマー判定(10msec×1000回達成?)
    ・No(10秒未達成)⇒ 割り込み処理終了
    ・YES(10秒達成) ⇒ main.cファイルのTMR2_flag_set_Process関数にジャンプ⇒
     割り込み処理終了


特長:複数のモジュール編集が、main.cファイルに集中します。

 

注意点:
割り込み機能の基本目的は、MPUが複数のモジュールを同時に実行させて、各モジュールが必要な時に割り込みを発生して、随時MPUが各モジュールの処理を効率良くする事です。
今回は、タイマーの割り込み処理プログラムを分かり易く説明するため、1つのタイマーモジュールの割り込み+ポーリング処理のプログラム(図1のフローチャート部:”CMP. TMR2_10sec_flag=0″で割り込み待ちループ)となっています。

実際にmain.cを編集したプログラムを、下記に説明します。

main.c プログラム編集

MPLAB X IDE画面の右側ウインドに、下記のmain.cプログラムを表示します。

図 2:main.c のプログラム

赤枠のプログラムを追加・編集しました。

① : 10秒フラグデータ宣言
TMR2_10sec_flag:10秒達成用フラグ宣言
ビットサイズ:32ビット、値範囲:0~4,294,967,295
②:割り込み処理関数 TMR2_flag_set_Process
10秒達成設定追加プログラム
TMR2_10sec_flagに”1″セット
③:デジタルデータ宣言
D_reg:A/D変換モジュールで変換したデジタルデータ
 ビット幅:16ビット符号無し、値範囲:0~65535
A_reg:変換公式を使い、デジタルデータをアナログデータに変換
 ビットサイズ:8バイト、値範囲:±1.7×10308
T_reg:アナログデータをLM61のデータシートの温度変換計算式を使っての温度に変換
 ビットサイズ:8バイト、値範囲:±1.7×10308
④:割り込み処理関数指定 TMR2_SetInterruptHandler
“//” 削除、MCC機能で生成した関数を有効にしました。
TMR2_flag_set_ProcessのアドレスがTMR2モジュールに登録
⑤ : タイマー2割り込み許可
“//” 削除、MCC機能で生成した関数を有効にしました。
⑥:タイマー2停止
TMR2_StopTimer()関数設定
⑦:A/D変換実行、温度値算出、10秒カウント待ちループ
温度値計算の詳細は、ここを参照

プログラムをシミュレーション

main.cとtmr2.cを編集するプログラム検証と同じ項目について、シミュレションをしました。
詳細の検証方法と項目は、”PICマイコンのソフト支援ツール”MPLAB X IDE”のシミュレーションの紹介とプログラム検証”を参照。

本投稿のmain.cのみを編集するプログラムの検証項目は、下記です。
main.cとtmr2.cを編集するプログラムと同じ)

1.AN0端子に900mVを入力して、PICマイコンに取り入れた電圧値⇒温度値(30℃)
2.10秒タイマー値( TMR2_10sec_flg = “0” ⇒ “1” )10秒

 
シミュレーションは、”MPLAB X IDE”環境下で行います。

検証結果:

  1. AN0端子に900mVを入力して、PICマイコンに取り入れた電圧値⇒温度値(30℃)となることを
    検証

PICマイコンの2ピン(AN0)に900mV印加設定。
(温度センサーICの温度電圧値:30℃に相等します。)

図 3:シミュレーション ・2ピン(An0)に900mV設定

ブレイクポイント設定と”Watches”機能を使い、プログラムの各変数データの値を表示させます。

AN0端子に900mV(30℃相等)印加した時に、
ADC_GetConversion関数を使いA/D変換後:
90mV⇒デジタル電圧値=D_reg=0x01C1
デジタル電圧値⇒アナログ電圧値=A_reg=898.8778
アナログ電圧値⇒アナログ温度値=T_reg=29.88778(PICマイコン内の温度値)
シミュレーション結果となりました。
実際のシミュレーションの実行結果を下記に示します。

図 4:シミュレーション ・D_reg, A_reg, T_regの値

シミュレーションの実行方法は、ここを参照(検証するプログラムは違います)。


  1. 10秒タイマー値( TMR2_10sec_flg = “0” ⇒ “1” )で10秒となることを検証

2度のブレイクポイント設定と”Stopwatch”機能を使い時間測定します。

“TMR2_10sec_flg=0″の次のステップに1度目のブレークポイント設定して実行、マイコン動作停止、
実行時間をストップウォッチ(下画面の赤枠押下)でクリア ”0ns” にします。
本設定のシミュレーション画面を下記に示します。

図 5:シミュレーション ・ストップウォッチ_cleared

“TMR2_10sec_flg=1″の次のステップに2度目のブレークポイント設定
[Continue]左側ボタンクリックして実行
“TMR2_10sec_flg=1″実行後マイコン停止、実行時間を表示します。
本設定のシミュレーション画面を下記に示します。

図 6:シミュレーション ・ストップウォッチ_Target halted

シミュレーションの実行方法は、ここを参照(検証するプログラムは違います)。

検証結果の比較(main.c編集 vs main.cとtmr2.c編集の検証比較)

同じ仕様ですが、編集するプログラムが違います。
main.c編集:本投稿プログラム
main.cとtmr2.c編集:ここのプログラムの検証結果

表1:検証結果の比較

項番 検証項目 main.c 編集 main.cとtmr2.c
編集
期待値 主な条件
1D_reg 値0x01C1mV0x01C1mV0x01c2mVAN0ピン=900mV
2A_reg 値898.8778mV898.8778mV900mVAN0ピン=900mV
3T_reg 値29.88778℃29.88778℃30℃AN0ピン=900mV
4TMR2_10sec_flg
0⇒1 時間
10.000018秒 10.000015秒10秒

検証結果:
1.温度変換は、2つのプログラムで同じである事を確認しました。
2.TMR2_10sec_flgは、秒単位で考えて同じと判断しました。

よって、
本投稿 ”プログラム(mai.cのみの編集)” と ”main.cとtmr2.cの編集プログラム” では同じ動作をする事が確認出来ました。

コメント