1.画面と設定方法(LCD)
LCDは型式SC1602BSLBを使用している。(1)LCD画面
電源投入直後の画面は下記の様になっている。
A | V | R | b | y | T | H | V | 0 | 0 | 0 | R | 0 | 0 | 0 | |
P | 0 | 0 | I | 0 | 0 | D | 0 | 0 | S | 0 | 0 | 0 |
(2)LCD表示説明
表示の値については、全て16進数としている。これは1桁減らす事が出きるためである。
a. V000は出力されている電圧をA/D変換器(分解能10bit)の値を表示している。
b. R000は90Rの値で、最大値は10bit 0x3FF = 1023(10進数)である。
c. P00、I00、D00はPIDのゲインであり、10進数で0.01~1.00までを%=1~100としている。表示については、16進数である。
d. S000はインデシャル応答の試験用で90Sの値を表示している。インデンシャル応答の切り替えスイッチにより、90Rと90Sの値を入れ替える事ができ、90Rと90Sの値差でインデンシャル応答試験が出来ます。詳細は『操作』を参照下さい。
(3)操作
a. ボタン操作
R000の最下端にカーソルが点滅しているが、ボタンを押して離すことにより、カーソルの位置が移動する。R000→P00→I00→D00→S000→S→R000と変わる。
b. ロータリーエンコーダー
R000の最下端にカーソルが点滅している時にロータリースイッチを回すと000~カウントされる。右へ回すと加算され、左を回すと減算される。
その範囲はと目的は下表の通り
位 置 | 表 示 | 内 容 |
R000 | 0~0x3FF | 電圧設定 右回しで0x3FFまで加算、左回しで0まで減算 |
P00 | 0~0x64 | 比例ゲイン 右回しで0x64まで加算、左回しで0まで減算 |
I00 | 0~0x64 | 積分ゲイン 右回しで0x64まで加算、左回しで0まで減算 |
D00 | 0~0x64 | 微分ゲイン 右回しで0x64まで加算、左回しで0まで減算 |
S000 | 0~0x3FF | Sでロータリースイッチを回すと、電圧設定値からS000で設定した電圧へ急変させる事ができる。 |
S |
(4)プログラミング
a.16F1938の概要
以下プログラミングの説明前に下記PIC16F193Xデータシート項目をご覧下さい。
13ページ:1.0デバイス概要
21ページ:2.0メモリ構成
337 ページ:26.0命令セットのまとめ
b.プログラム概要
(a)LCDのプログラムは概ね下記ア-イ-ウ-イと言う順でイ-ウについてはループになっている。
ア. CDの初期化
イ. 表示するデータをメモリーマップへ記載
ウ. LCDの表示
(b)メモリーマップについて
LCD表示器は、アスキー文字の表示器で、1行16文字で2行表示できる。
プログラム内では、メモリーBANK0の0x50~0x6Fまでに記載された内容がそのまま画面に表示される様になっている。
表は最上段と最下段はメモリーアドレス(0x50~0x6F)です。
50 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
A | V | R | b | y | T | H | V | 0 | 0 | 0 | R | 0 | 0 | 0 | |
P | 0 | 0 | I | 0 | 0 | D | 0 | 0 | S | 0 | 0 | 0 | |||
60 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | A | B | C | D | E | F |
(c)プログラム
LCDのプログラムは大きく分けて、2種類有る。
ひとつは、LCDを制御し、表示するためのプログラム(LCD基本プログラム)、
もうひとつはデータの入力確認と状態を表示するためのプログラム(キー入力)である。
c.キー入力(ボタン操作LCDカーソル表示含む)
このプログラムは大きく分け3種類のプログラムが動作している。
一つ目は、カーソル移動他させるためのボタン処理、二つ目は設定をするためのダイヤル処理、三つ目はLCDの表示をさせる処理です。
位置 | CSNO |
R000 | 0 |
P00 | 1 |
I00 | 2 |
D00 | 3 |
S000 | 4 |
S | 5 |
カーソルの移動には、ボタンを使用し、ダイヤルを回すことにより、カーソルのデータをカウントアップ・ダウンすることができる様にプログラムされている。
ボタンはRB4に接続されており、RB4は、信号の立下りで割込み信号が出るように設定されている。
この割り込みにより、変数CSNOの内容がカウントアップする。カントが6の場合は、0にして割り込みを完了する。位置とCSNOの値の関係は右表の通り。
なお、ボタンスイッチを安い物にしたため、入り切り途中にチャタリング(ON→OFFやOFF→ONの切替途中約100ms以内で何回かON,OFFしてしまう)するため、抵抗とコンデンサーで、その周波数分を通さないローパスフィルターを構成して見たが、現象がまだ閾値以下にならないと思われ、まだ対応が甘く一回のボタン押下げ操作で、2~3回操作した時と同じ様になる事かある。
このため、現在は、1回動作した場合、100ms以上経過してからボタン操作の割込みを許可する様に変更したが、確率が減ったが、誤動作するため、1回のボタン操作でどんな波形になるのか、もっと分析し対応が必要である。(後回しする。)
割込み処理には、その他、下記仕事に使用されている。
・A/D変換完了
・PWMの変換完了
・ロータリーエンコーダースイッチのパルス
の処理に使用されている。
割込み処理に必要な設定
レジスター | 使用bit | 概 要 | 説明 | |
INTCON | 7 | 1 | GIE :1=マスクされていない割込みを許可する | 73 |
4 | 1 | INTE :1=RB0/INT外部割込みを許可する | ||
3 | 1 | IOCIE :1=状態変化割込みを許可する | ||
0 | 1 | IOCIF :1=状態変化割込みが有った(リセット要) | ||
IOCBP | 7~0 | 8 | PORTBxの信号立上りでIOCBFにフラグセット | 104 |
IOCBN | 7~0 | 8 | PORTBxの信号立下がりでIOCBFにフラグセット | 104 |
IOCBF | 7~0 | 8 | IOCBFxIOCBP,Nで設定したフラグが出力される | 104 |
TRISB | 7~0 | 8 | 1=入力ピン | 91 |
ANSELB | 7~0 | 8 | 0=ディジタルピンとして割り当て (1=アナログ) | 91 |
WPUB | 7~0 | 8 | 0=プルアップ無効 1=有効 | 90 |
本回路で使用しているダイヤルは抵抗などで無く、2つのスイッチで、回転方向により2つの接点の動作が時間的にずれて出力される様になっています。
商品分類はエンコーダで、メーカーは Bourns
型式PEC11L4125KN0020
定格5(V)で10(mA)
選定には、抵抗式は接触不良による値の変化があるため、エンコーダ型にして、その中でコストが安い(@160円)物を選びました。
デジタルオーディオ用の外部インターフェースとして開発された商品のようです。
つまみを右又は左に回す事により出力A,Bにはパターン1又はパターン2の時間ずれ信号が出力されるようになっている。

つまみの回す方向を検出する方法は、A信号が立ち上がった時B信号が無いのが、パターン1で、B信号が立ち上がった時A信号が無いのがパターン2とは・・言えない。
これは、ノイズが片方に入った場合も同じ事が言えるからで、この誤動作を防止するには、連続する二つの状態を確認する事で、誤動作の確率を減らす事が出来る。2つより、4つの方が誤動作は減るが、処理も増えるので今回は2つの連続する動作を確認する。
ただし、ノイズが入った場合に次の信号を待つことになり、処理が停止することも有るので、最小の信号が入ってある一定時間以上次の信号がこない場合はこの回路をリセットする様にした。
ア.二つの連続した信号の確認
①、②や⑤、⑥のタイミングで、A,Bの信号がどうなっているかを確認する。
イ.四つの連続した信号の確認
①~④や⑤~⑧のタイミングでA,Bの信号関係を確認する事により、回す方向を検出する事が出来る。
(c)ダイヤルの処理プログラム
・ダイヤル操作で、加算か減算の判定が完了したらFG,3に1を入れ、FG,4に加算の場合は1を入れる。
・FG,3の1を確認し、カーソルの位置(CDNO)を確認し、各番号で、各フラグFG,4の処理する。
処理とは該当のカウンターを読み込み、加算又は減算をする。
減算の場合は、0以下はしない。
加算の場合は、最大値以上にしない。
・FG,3とFG,4のフラグを0にする。
実際のプログラムはfg3,4を使用していない。
PORTAの1と 2のピン信号 について
1はTimer4の処理ごとに信号が反転します。1周期は4(ms)です
2はTimer6の処理でそのタイミングはインデンシャル応答スイッチ動作で1となりTimer6がカウントアップ(16ms)したら0になる信号が出力されています。
インデンシャル応答でオシロ取るときのトリガーに使用することを前提に設計しています。
下の写真はインデンシャル応答試験をしている状況です。
左写真が上げ方向と右写真は下げ方向の波形を取っている状況
![]() |
![]() |
上げ方向のオシロ波形 | |
![]() |
![]() |
上げ方向では、トリガーが出てからPWMのON巾が広くなっているのが判る。
逆に下げ方向では、トリガーが出てからPWMのON巾が狭くなっている。
2.A/Dコンバータ回路
(1) PIC16F193XのA/D回路![]() |
A/D 変換 (ADC) は、アナログ入力信号を 10 ビットのバイナリ表現に変換します。このデバイスでは、1
つのサンプル ホールド回路に多重化されたアナログ入力を使用します。サンプル
ホールド回路の出力が A/D 変換の入力に接続されます。A/D 変換は逐次比較方式により
10 ビットのバイナリ値を生成し、この変換結果を ADC の結果レジスタ (ADRES)に格納します。左図に、ADC
のブロック図を示します。 ADC のリファレンス電圧はソフトウェアで選択可能であり、内部で生成または外部から供給のいずれの方法でも可能です。 ブロック図上では中央上に有るスイッチがソフトウェアで切り替えが出来ます。(ADCON1のビット2~0で設定)ADC は、変換完了時に割り込みを生成できます。この割り込みによってデバイスをスリープ モードからウェイクアップできます。 |
(2)A/D回路の動作上の注意点
![]() |
ADC が仕様どおりの精度を実現するには、電荷ホールドキャパシタ (CHOLD) を入力チャネルの電圧レベルまで完全に充電する必要があります。左図にアナログ入力モデルを示します。 ソースインピーダンス (RS) および内部サンプリング スイッチ(RSS) インピーダンスはキャパシタ CHOLD の充電時間に直接影響します。サンプリングスイッチ(RSS) インピーダンスは、デバイス電圧(VDD) により変化します。アナログソースの推奨最大インピーダンスは、10kΩです。 ソースインピーダンスが低下すると、それに伴ってアクイジション(取得)時間が短くなります。アナログ入力チャネルの選択後(または変更後)には、変換を開始する前に AD アクイジションを実行する必要があります。 |
![]() |
最小アクイジション時間の計算には左式を使用できます。この式では、1/2 LSB
エラー誤差の適用を前提としています (ADC は 256 ステップ)。1/2LSB 誤差は、仕様どおりの分解能を
ADC で実現する場合の最大許容誤差です。 上記計算式から最大使用温度を50℃とすると TACQ = 2μs + 1.12μs + ( 25×0.05μs ) = 2 + 1.12 + 1.25 = 4.37μs 4.37μsがサンプルホールドに必要な時間です。 |
(3)A/Dのプログラム
プログラムでは、各レジスターの設定は下表の通り
レジスター名 | 使用bit | 設定 | 概 要 | 説明 | |
ADCON0 | 6~2 | 5 | 100 | アナログチャンネル選択ビット 設定 00100=AN400000:AN0 ~01101:AN13 |
137 |
1 | 1 | 1 | GO/DONE 1:AD変換中(設定)0:変換完了 | ||
0 | 1 | 1 | ADON 1:ADCが有効 0:ADCが無効 | ||
ADCON1 | 7 | 1 | 0 | 1:右詰ADRESHの6ビットMSBは0 0:左詰 | 138 |
6~4 | 3 | 110 | AD変換クロック FOSCx 000:/2001:/8 010:/32 011:RC 100:/4101:/16110/64 111:RC |
||
2 | 1 | 0 | ADNREF | ||
1~0 | 2 | 0 | ADPREF | ||
TRISA | 7~0 | 8 | xx10xx00 | 1=入力 | 86 |
ANSELA | 5~0 | 6 | xx10 0000 | 1=アナログ | 86 |
INTCON | 6 | 1 | 0 | PEIE周辺装置割込み 1=許可 | 73 |
PIE1 | 6 | 1 | 0 | ADIE ADC割込み 1=許可 | 74 |
PIR1 | 6 | 1 | -- | ADIF1変換完了(ソフトウエアーリセット要) | 77 |
ADC は、アナログおよびデジタル信号のいずれの変換にも使用できます。アナログ信号を変換する場合は、該当する TRIS ビットと ANSEL ビットをセットして I/O ピンをアナログに設定する必要があります。詳細は、データシート6.0 項「I/O ポート」 を参照してください。 注: デジタル入力として定義されたピンにアナログ電圧を加えると入力バッファに過大な電流が流れることがあります。
b.チャネル選択
サンプル/ホールド回路にどのチャネルを接続するかを、ADCON0 レジスタの CHS ビットで設定します。チャネルを変更する際は、次に変換を始める前に遅延が必要です。詳細は、データシート11.2 項「ADC の動作」 を参照してください。
c. ADC の電圧リファレンス
ADCON1 レジスタの ADPREF ビットでポジティブ電圧リファレンスを設定します。ポジティブ電圧リファレンスには、次のものがあります。
・VREF+ ・AVDD ・FVR ( 固定電圧リファレンス)
ADCON1 レジスタの ADNREF ビットでネガティブ電圧リファレンスを設定します。ネガティブ電圧参リファレンスには、次のものがあります。
・VREF- ・AVSS
固定電圧リファレンスの詳細は、データシート14.0 項「固定電圧リファレンス」 を参照してください。
d. 変換クロック
変換クロックのソースは、ADCON1 レジスタのADCS ビットを使用してソフトウェアで選択できます。クロックは次の 7 種類から選択できます。
・FOSC/2 ・FOSC/4 ・FOSC/8 ・FOSC/16 ・FOSC/32 ・FOSC/64
・FRC ( 専用の内部オシレータ)
1 ビットの変換に必要な時間は TAD と定義されます。図11-2に示すように、10ビット全体の変換には 11.5 TAD の時間が必要です 。
変換を正しく実行するには、適切な TAD の仕様を満たす必要があります。詳細は、28.0 項「電気的仕様」の「A/D 変換の要件」を参照してください。表11-1では、適切な ADC クロック選択の例を示します。
注: FRC を使用しない場合、システム クロック周波数を変更すると ADC クロック周波数も変化するため、ADC の結果に悪影響を与えることがあります。
ADCのクロック周波数とデバイスの動作周波数
ADC Clock Period (TAD) | Device Frequency(Fosc) | ||||||
Clock Source | ADCS | 32MHz | 20MHz | 16MHz | 8MHz | 4MHz | 1MHz |
Fosc/2 | 000 | 62.5ns | 100ns | 125ns | 250ns | 500ns | 2.0us |
Fosc/4 | 100 | 125ns | 200ns | 250ns | 500ns | 1.0us | 4.0us |
Fosc/8 | 001 | 0.5ns | 400ns | 0.5us | 1.0us | 2.0us | 8.0us |
Fosc/16 | 101 | 800ns | 800ns | 1.0us | 2.0us | 4.0us | 16.0us |
Fosc/32 | 010 | 1.0us | 1.6us | 2.0us | 4.0us | 8.0us | 32.0us |
Fosc/64 | 110 | 2.0us | 3.2us | 4.0us | 8.0us | 16.0us | 64.0us |
FRC | X11 | 1.0-6.0us |
太赤字はTAD時間の最小要件を満たしていない。
割込み時間 Fosc/32 13.48us Fosc/64 24.48us
PWM周波数 31.25kHz 32.00us
e.変換の開始
ADC モジュールを有効にするには、ADCON0 レジスタの ADON ビットを「1」にセットする必要があります。ADCON0 レジスタの GO/DONE ビットを「1」にセットすると A/D 変換が開始します。
注: ADC をオンにする命令と同じ命令で GO/DONE ビットをセットしないようにしてください。詳細は11.2.6 項「AD 変換の手順」 を参照してください。
f.変換の完了
変換が完了すると、ADC モジュールは次の動作を行います。
・GO/DONE ビットをクリアする
・ADIF 割り込みフラグ ビットをセットする
・ADRESH:ADRESL レジスタに新しい変換結果を書き込む
g.変換の中止
変換が完了する前に中止する場合は、GO/DONEビットをソフトウェアでクリアします。
ADRESH および ADRESL レジスタは、途中まで完了した A/D変換サンプルで更新されます。未完了ビットは、変換された最後のビットに一致します。
注: デバイスをリセットすると、すべてのレジスタが強制的にリセット状態に戻ります。
このため、ADC モジュールはオフになり、以後の変換はすべて中止されます。
h.スリープ時の ADC の動作
ADC モジュールはスリープ時にも動作できます。
スリープ時に動作させるには、ADC クロックソースに FRC を設定する必要があります。クロック ソースに FRC を選択した場合、ADC 変換の開始前に1 命令余分に待機時間が必要です。ここでSLEEP 命令を実行すると、変換時のシステム ノイズを抑えることができます。ADC 割り込みが有効の場合、A/D 変換が完了するとデバイスがスリープ モードからウェイクアップします。ADC 割り込みが無効の場合は、A/D 変換完了後に ADC モジュールがオフになります (ADON ビットはセットされたまま)。
ADC クロック ソースが FRC 以外の場合は、SLEEP命令によって現在の変換が中断され、ADCモジュールがオフになります (ADON ビットはセットされたまま)。
i.特殊イベント トリガ
CCP5 モジュールの特殊イベント トリガによって、ソフトウェアで操作せずに ADC を定期的に実行できます。このトリガが発生すると、GO/DONE ビットがハードウェアによってセットされ、Timer1 カウンタが 0 にリセットされます。
特殊イベント トリガを使用した場合、A/D 変換が適切なタイミングで実行されるかどうかは保証されません。このため、ユーザーは ADC のタイミング条件が満たされているかどうか確認する必要があります。
詳細は、データシート19.0 項「キャプチャ/ コンペア/PWM モジュール (ECCP1、ECCP2、ECCP3、CCP4、CCP5)」 を参照してください。
J.その他 今回 A/D変換器の割り込み機能は使用しない。
これは、最新のA/D変換値により演算をするため、演算処理の中でA/D変換の処理を待ち(つまりA/Dの割り込み処理を使用せず)その後、演算処理する事にした。
なおA/D処理は演算処理の1/1000位の速度なので、演算時間が長くなる事はあまり考えなくて良い。
電圧発生器及びA/Dコンバート特性

3.PID制御
(1)マイコンによるPID計算アルゴリズムについてもともとPID制御は、連続したアナログ量を制御することが基本になっています。しかし、コンピュータのプログラムでPID制御を実現しようとする時には、連続した量を扱うことができません。なぜなら、コンピュータのデータの入出力は一定時間間隔でしか出来ないからです。 しかも微積分演算をまともにやっていては、演算に要する能力のために高性能のコンピュータが必要になってしまいます。
そこで考えられるのが、サンプリング方式(離散値)に適したPID演算方式です。
まず、サンプリング方式のPID制御の基本の処理ブロック図は下記で表されます。
PIDの処理ブロック図

(2) プログラム概要
このプログラムを作成する前に Excel で式を作成し、シミュレーションを実施し、グラフ表示し
た物が先の説明で出てきたグラフです。下記に Excel の計算式を処理順に記載します。

※ 2の補数表現をする分岐条件は各メモリーの最上位bitが1である場合に行う事
2の補数表現は(2)計算a.負の処理をご覧下さい。
(3) 計算
プログラムでは負数の処理については補数処理をして計算を行います。
又PIC16F1938には8bitの加減算しかなく乗除算は作成する必要がある。
これらの処理を下記に説明します。
a.負の処理
2の補数など知っている場合は、このa.負の処理は飛ばして下さい。
電卓では例えば
(ア) 3 + 2 と入力すると 5と表示されます。
(イ) 3 - 2 と入力すると 1と表示されます。
(ウ)-3 + 2と入力すると -1と表示されます。
(エ)-3 - 2と入力すると -5と表示されます。
ではプログラムではどうやって計算するでしょう
まず最初に+や-の記号はどうやって付けるのか?
PIC16F193Xには数値データの単位は8bitでそれ以外に計算で使用する記憶させるbitはありません。つまり、数値 3や2を極性が無い状態で8bitの2進数で表現すると下記の様に表現され、通常では極性を入れる場所が無いという意味です。
3 = 00000011 2 = 00000010
では計算方法は目と頭(判断)を使えば下記の様になると思います。
(a) ①の場合は 3と2を加算
(b) ②の場合は 3から2を減算
(c) ③の場合は 2から3を減算し負(*A)になれば何らかの処理で負を表現(*B)
(d) ④の場合は 3と2を加算し最後に何らかの処理で負を表現
と言うことになるのですが、(*A)や(*B)をどうするか又(a)~(d)の計算方法が全て2つの極性を見て判断しており、このため(*B)の表現により分岐条件で処理する必要があります。
(*A)については、もうちょっと複雑な事情が有るので例を記載し説明します。
減算にはSUB 命令になるのでが、(b)の例を記載すると
MOVLW B’00000010’ ;2をWレジスターへ入力
SUBLW B’00000011’ ;3 - Wレジスター = Wレジスターへ
でWレジスターには 00000001が出力されます。 10進数では1です
では同じ減算と表現している(c)の場合はどうなるでしょう
Wレジスターには 11111111と言う値が出てきます。10進数では255となります。
これは、極性処理ができないので、00000001と言う値が出てこないのです。
(*B)の方法は別にして、数値表示だけの処理をするとして、考えられる処理方法の一つとしては、データシートを見ると、この時ステータスのCのbitは0になっているので、この条件でデータに1加算し反転する事により1と表示されます。
※こんな予め負と判るプログラムに条件文は書かないのですが、先の継続したプログラムに条件文を付加したと見て下さい。
MOVLW B’00000011’ ;3をWレジスターへ入力
SUBLW B’00000010’ ;2 - Wレジスター = Wレジスターへ
BTFSS STATUS,C ;1でスキップ
CALL fu
・
fu
XORLW B’11111111’ ;1のbit部が反転する。 11111111 → 00000000
ADDLW B’00000001’ ; 1を加算する。 00000000 → 00000001
RETURN
これで、Wレジターは 00000001 → 10進数で1となります。
なにか複雑ですが、後に関係が出てきます。
次に (a)~(d)の様に各条件で計算方法を変更しなくても良い方法が無いのか、又(*B)を簡単に解決出来ないかと言う事で以下説明をして行きます。
今回の計算では入力がA/D変換、出力のPWM回路共に10bitである事と、(*A)の説明で反転した所に注目してもらえれば負の処理がより簡単になります。
つまり、10bit処理と言うことは処理の単位は8bitなので、演算では16bitの処理が必要であることがわかりますが、10bit以外は使わないので、加算などでは、答えとして上位16bit目は1が立つはずが有りませんが、(*A)を思い出して下さい。計算に使用していない 上位の場所は1になっています。つまり(*B)の格納場所を上位16bit目とすれば簡単に処理が出来そうです。
ここで、マイナスについては(*A)からXORで反転させ1を加算します。
例として -2は 11111101+1= 11111110 ?3は 11111100+1=11111101となります。
これで加算だけで処理出来ないか確認します。
(ア)3 + 2 00000011と 00000010を加算 00000101 10進数で5
(イ)3 ? 2 00000011と 11111110を加算 100000001下位8bitだけ使用すれば1
(ウ)-3 + 2 11111101と 00000010を加算 11111111 →反転 + 1 →反転 1
(エ)-3 ? 2 11111101と 11111110を加算 111111011 →反転 + 1 →反転 5
となり、加算で処理と最上位ビットが1か0かで反転処理する事により全ての処理できることが判りました。
ここで反転して1を加算する事を2の補数表現と言います。
b.乗算について
掛け算は、簡単に言うと回数分を足し算すれば良いのですが、たとえば
x × 255だと255回も足し算をしなければなりません。そこで、手で計算した時の事を思い出してほしいのですが

2進数も同様で、255だと8bitで表すことができるので、8回の足し算で良い事が判ります。
桁への移動はシフトを使用します。
今回の演算はA/D値×ゲインなので、10bit×7bit(最大1100100) =3bytメモリーを使用し演算を実施します。
c.除算について
演算では、偏差×ゲイン(%)なので、ゲインで乗算した後、100で除算する必要があります。
プログラムは10bit×7bit(MAX100)÷100 の計算がPIDで3回必要なため、サブルーチン化した。
サブルーチン名はMU で 10bitの数値はCALC_H , CALC_L に入れ、;7bitの数値はCALC_Aに入れ、MUをCALLする事により、答えはCALC_H , CALC_Lに 入って戻る様にプログラムを作成した。
CALC_xの動きについては、c.掛け算およびd.割り算を参照下さい。
なおこのサブルーチンの中の最初にCALC_L = CALC_Mの処理をしているので注意下さい。
以下に乗除算の流れを記載する。
e.乗算の流れ 1023×100 1023 = 1111111111 100 = 1100100 = 102300 |
![]() |

6回シフト+10回シフト(加算)
加算値は最大7bit(MAX100)のゲインを加算すれば、早くできる。上位bytへキャリーで+1する位で終わることが出来るので。
f.除算の流れ 1023×100÷100= 6回左シフト し10回引き算 100 1100100 |
![]() |

4.電圧発生回路のPWMについて
(1)PWM関係の内部ブロック説明
RSフリップフロップにより波形を出しているのことからSの信号は1周期を示し、Rでデューティサイクルを示すことが判る。
又各役割は
● S信号
TMRxとPRxをComparatorし、両デジタル値(8bit値)が一致すると信号を出力する。
● TMRx
PICのクロック(4Toscで32MHz動作で125ns)とプリスケラー(使用・不使用、可変分周器設定可能)を使用したカウントアップをしている。 補足説明参照
● PRx
上記からこのレジスターにより、パルスの周期を設定出来る事が判る。
● R信号
TMRxとCCPRxHをComparatorし、両デジタル値(10bit値)が一致すると信号を出力する。
● CCPRxH
Sの信号により、Duty Cycle Registersの値がコピーされる。
● Duty Cycle Registers
CCPRxLとCCPxCON(5,4bitの値)のレジスターの値を言い、ここに値を設定する事により、デューティ比を変化させる事が判る。ただし、PRxの値より、CCPRxLの値は以下である事が判る。
(2)プログラミング
a.PWMの周期
『補足TMRxについて』のブロック図からクロックおよびTMRxのプリスケラ-値にPRxの値で決定される。
PWM周期 = (PRx+1)・4・Tosc・TMRxPrescale値
0xFF+1=0x100×4×31.25ns×1= 32(us)
b.PWMのデューティ比
デューティ比はCCPRxHレジスターの値と、TMRx+2bitにより決定しする。
CCPRxHは、CCPRxLレジスターおよびCCPXCONレジスターの5~4の値を書き込みし、PWMの一周期が完了後、CCPRxHに書き込まれ設定したデューティ比が出力されます。
パルスの巾 = CCRPxL+CCPxCON ・ Tosc ・TMRxPrescaleになります。
従って
デューティ比 = (CCRPxL+CCPxCON )/[(PRx+1)・4] となります。
c.分解能について
デューティ比はCCPRxHとTMRx+2bitであり、TMRxが0xFFの時最大の分解能になる。
従って、PRxの値も0xFFの時10bitの分解能を発揮できる。
d.PWMモジュール説明
16F1938では、同じモジュールで他の機能もあり、これらを各レジスターで設定します。

出力ピンについて

例:CCP5 でTimer2 を使用する。

(3)補足 TMRxについて
16F1938 の TMRxは3個有り、名称は TMER2,4,6 となっている。(なぜ 3,5 が無いかは不明です。)
a.内部ブロック図

b.各名称の説明
(a)Fosc/4
Fosc は CPU のクロックで 32MHz なら 31.25(ns)で、これを 1:4 の信号としてるので、
125(ns)となる。
(b)Prescaler
プリスケラー、分周器の意味で TxCKPS の 1,2bit の 2bit を使用して 4 種類の分周器
として設定が出来る。この値が注(1)の部分である
(c)Postscaler
4 ビットカウンターのポストスケラーで比較器から出た信号をカウントし、このポストスケ
ラーの値と一致すれば、信号出力を行います。
以上からプリスケラー、TMRx、PRx、ポストスケラーの各設定により、割込みを許可し
た場合に出力される SetsFlag bit TMRxIF の動作時間値は、横をプリスケラ値、縦を
ポストスケラーの値とすると、次表の様になる。

c.TIMER2,4,6 に関係するレジスターは下表の通り

Timer2はPWMのクロックとして使用
Timer4はAVRの電圧制御割り込みタイミングとして使用
Timer6はボタンのチャタリング防止用の確認時間として使用した。
割り込みとしては、Timer4,6で使用している。
(4)Timer4の設定内容
割り込みの動作はTimer6も同様なので、ここで一緒に説明します。
割り込みの設定は、周辺装置割り込みレジスターPIE3のbit3がTimer6で、bit1がTimer4で、1にする事により、割り込みを許可します。
割り込みは、PR4,PR6がTMR4,TMR6と同じ値になった時の信号を入力としたポストスケールの出力信号により割り込みがかかります。なお割り込みがかかったときにフラグ出力される、PIR3(対応するbitはPIE3と同様)はソフトウェアでクリアが必要(次の割り込みで区別がつかなくなるので、すぐクリアが必要)なので、注意すること。
割り込みの復元はTMRx又は、TxCONレジスターの書き込み他7つ有り、詳細は174ページ参照。
注:周辺装置割り込みレジスターなので、それをイネーブルにするため、INTCONのbit6(PEIE)を1にする必要があります。
この割り込み時間周期は、AVRの計算時間が約1msからその他の仕事時間も考え2msとする。
Postscaler 1/2 Prescaler 1/64 PR4は125 2ms
T4CON = 00001011 に設定しTimer4を動作させるときは、PR4を設定した後、PIE3やINTCONの関係するbitを1にして、T4CONのbit2を1にする事により動作します。
なお T4CONやPR4、TMR4はBANK8(6も同じ)です。
PIE3はBANK1 PIR3はBANK0です
(5)Timer6の設定内容
この設定時間は最大値を試験的に設定する。
Postscaler 1/16 Prescaler 1/64 PR6は125 16ms
T6CON = 01111011