PICガジェット制作3 PIC12F1822でPWMパルス発信を実験

PIC ホビー

PICを使ってRCサーボを駆動しようと思いますが、その前にPWMを使ってパルスを発信させる機能を確認してみようと思います。
まだMCCの使い方が手探りなので、できるだけ簡単な機能で動作確認したいと思います。
いろいろと検索したのですが、皆さんクロック周波数が比較的高いところで使うために、いろいろと思考錯誤しているようです。
まめのプログラム工房では省電力をコンセプトとし、機能要求も高くはないので、クロックも最低周波数で利用することがベターです。
そのため、クロックを低くしたときの設定値やPWMの実現方法について忘備しておきます

Sponsored links
Sponsored links

目的

PICでRCサーボを駆動するためにPWMを使おうと思っています。
プラモデル(288GTO, ミウラ,カウンタック)のリトラクタブルライトを動作させようと思っています。
そのため、できるだけ小さいPICでRCサーボだけ動かそうと検討しています。
まずは、PWMの基本的な使い方を学ぶために、PIC12F1822を使って簡単な回路でテストをしてみます。
RCサーボの基本周波数は50Hzでパルス幅はおおよそ0.5~2.4mぐらいらしいので、その辺りのパルス出力を目標に設定ができるように検討します。

SG90_a.pdf (akizukidenshi.com)

開発環境

開発PC

THERDWAVE Magnate IM
   13th Gen Intel(R) Core(TM) i5-13400 RAM16GB,SSD 500GB
   Windows 11 Home 22H2

ソフトウェア

統合開発環境: MPLAB X IDE Ver 6.15
        MCC Ver 5.3.7
Cコンパイラ: XC8 Ver 2.45

マイコン書き込み、デバッグツール

PICkit3

ターゲットデバイス

PIC12F1822

まめの開発環境についてはこちらを参照してください。

ターゲットボード

ターゲットは以下の回路をブレッドボードで組みました。
PIC開発環境の整備4 PICkit3の動作確認」で利用した回路のRA4ピンに可変抵抗でアナログ電圧を入力できるようにしただけです。

プログラム

MPLAB X IDEを起動して、プロジェクトを作成します。作成手順は「PIC開発環境の整備4 PICkit3の動作確認」を参考にしてください。

MCCでPICの情報を設定

MCC(Microchip Code Configurator)を使ってPIC16F1822の設定をしていきます。
基本的な設定は、「PICガジェット制作1 MCC設定を使い電源電圧を測定する」を参照してください。

前にも述べていますが、本ブログでは省電力を基本に活動していますので、クロックは31kHz(LF)もしくは31.25kHz(MF)で設定しようと思います。

「System Module」でClockを設定します。
  内蔵発信器を使いますので 
    System Clock Selct:「INTOSC」
    Internal Clock:  「31KHz_LF」
  に設定します。

「Device Resources」からADC, ECCP, TMR2を追加します。
*PIC12F1822のECCPはTMR2しか使えません。

「Pin Module」で
   Pin3(RA4): ADC AN3
   Pin5(RA2): ECCP PA1
を設定します。

「TMR2」の設定をします。
「Timer Period」をPWM Period(パルス周期)の目標値20msに設定します。

「ECCP」の設定をします。
「PWM Duty Cycle」を50%に設定します。
このときのCCPR Valueの値をこのあと使います。今回は309になっています。

ここで、「Project Resources」の[Generate]をクリックして、プログラムの雛形をつくります。
この状態で、ビルドしてターゲットボードにプログラムを書き込み動作させてみます。

設定した結果

Pin5(RA2)の出力波形を測定したものが以下の図になります。
1サイクルが20msでデューティが50%(10ms)になっていることが確認できます。

プログラムを記述しなくても、MCCの設定だけで簡単にPWMパルスが出力できました

ちなみに、
  PWM Duty Cycleを 100% にすると
  CCPR Valueは 619 になります。
CCPRを変更すればHパルス幅が変更できそうです。

LFとMFの精度

ここで、Internal Clock の精度を確認しようと思います。

LF: 低周波モジュールであまり精度はよくないとのことです。
MF: 中周波モジュールで工場出荷時に調整されますのである程度の精度は期待できるようです。

HF(高周波モジュール)は今のところ使う予定はないので省きます。

一応、31KHz_LFと31.25KHz_MFのときにパルス幅20ms設定のときの精度を測定してみます。

  31KHz_LFのとき    19.28ms
  31.25KHz_MFのとき  20.00ms

LFのときは 3% 程度の誤差が出ています。

Internal Clock = 31KHz_LF
Internal Clock = 31.25KHz_MF

まめのプログラム工房では、シビアな制御はしないのでまったく問題ありませんが、一応気になったので測定してみました。

タイトルとURLをコピーしました