PIC三昧(23) PWM+TIMER+DSM、赤外線リモコン波形、PIC16F18855

Joseph Halfmoon

別件シリーズでコンピュータ上で赤外線リモコン波形を生成。こちらでは実際に赤外線LEDを駆動して「送信」できる筈の波形をPIC16マイコンで作成してみたいと思います。とりあえずの今回は0と1の波形が生成されていることをオシロで確認するところまで。過去回で練習済のTIMER、PWM、DSMの合わせ技、応用課題か?

※『PIC三昧』PIC関係の記事総目次はこちら

※作業はMicroChip社の統合開発環境 MPLAB X IDEと、その上で走るコンフィギュレーションツールMCC Classic を使用して行っています。ターゲット・マイコンはPIC16F18855です。

赤外線リモコンの「波形」

赤外線リモコンの波形をScilab(MATLABみたいなものです、フリーの)で生成してみたのは以下の別シリーズ記事です。

手習ひデジタル信号処理(105) Scilab、comm_tbx、赤外線リモコンの波形

上記で作成した波形で赤外線LEDを駆動できれば「多分」通信できるんじゃないかと思ってるのですが、残念ながらパソコンから直接駆動は「今のところ」できないデス。そこで、今回はPIC16マイコンで波形を生成してみることに。なお、上記の記事で生成したのはNECフォーマットの波形ですが、今回は、「0」と「1」を駆動するところまで。

生成方法は以下です。

    1. TIMER2を使用、サブキャリアの38kHzの元になる信号を生成する。
    2. TIMER2出力をPWM6に接続、デューティ3分の1のサブキャリア38kHz波形を生成する。
    3. PWM6出力をDSMのハイ側キャリアとして接続。ロー側キャリアは0固定、DSMでOOK(ON-OFF-Keying)変調する。モジュレータ信号はソフトウエア制御。

既に以下の過去回にて「練習済」のものを組み合わせるだけ。

PIC三昧(2) MCCでPIC16F1xxxx。TMR2+PWM6でPWM出力

PIC三昧(11) DSM(データ信号変調器)を使ってみる、PIC16F18855

MCC Classicでコンフィギュレーション

今回のプロジェクトリソースは以下のとおり。RMT_Resources

まず、タイマの精度もあるのでSystem Moduleのクロック設定もデフォルト値から変更します。RMT_SystemSettingA

つづいてTIMER2を設定。RMT_Timer2Setting

本当は 38kHz≒26.32us なので、上記は0.3%程誤差あり。許して。

つづいてPWM6の設定。デューティ33%だと。RMT_PWM6setting

 

DSMを設定。RMT_DSMsetting

High Carrier をPWM6から貰うのは良いのだけれど、Low Carrierは固定値0で良いです。しかし、そんな定数ソースが見当たらないです。仕方がないので使っていないピンにしてます(ロウに落としておかないとダメ。)そういうときは使わない内蔵ペリフェラルをロウ固定にコンフィグした方が良いのか。。。

最後にピンの設定。RMTpinMGR
いつものようにPA0端子(出力指定)はLチカ用です。

今回実験用のコード

MCCが自動生成してくれた main.c ファイル内に書き加えたコードは以下のとおりです。「0」の波形と「1」の波形を交互にダラダラと出力しつづけるだけのもの。

void main(void)
{
    int oval = 0;
    // initialize the device
    SYSTEM_Initialize();
    DSM_ManualModulationClear();
    
    while (1)
    {
        DSM_ManualModulationSet();
        __delay_us(T_INTVL);
        DSM_ManualModulationClear();
        if (oval == 1) {
            oval = 0;
            __delay_us(T_INTVL * 3);
        } else {
            oval = 1;
            __delay_us(T_INTVL);
        }
    }
}
実機で確認

黄色で「べた」に見える部分がサブキャリアが元気よく出力されている期間です。黒のロウ部分の時間長さで0と1を判断します。0の場合は黄色が1T、黒色分が1T、1の場合は黄色が1T、黒色が3Tです。1Tは562μsです。RMT_wave1

一応、1のときの3Tの幅も測ってみました。RMT_wave2

さて、時間軸を拡大してサブキャリアの38kHz、デューティ3分の1を確認してみます。こんな感じ。RMT_subcarrier

まあ、波形としてはそれらしいな。次はLEDを駆動して実際に赤外線で何か送信してみるしかない。940nmの赤外LEDの在庫はどこだ?

PIC三昧(22) TIMER0、ワンショットでパルス幅を制御する。PIC16F18855 へ戻る

PIC三昧(24) Device ID読めるがCONFIG読めない? PIC16F18855 へ進む