Featured image of post PICマイコンについて

PICマイコンについて

背景

  • PICマイコンの理解の為に調べた事
  • 特に、PIC16F18857について
  • AIにデータシートを見てもらいながらまとめたメモ

PIC16F18857の特徴

項目内容
CPU8ビット PIC16系 RISC
最大クロック32 MHz
命令数49命令
Flash56 KB、32K words
SRAM4 KB
EEPROM256 bytes
I/O25本、うち1本は入力専用
動作電圧PIC16F18857は 2.3〜5.5 V
温度範囲Industrial: -40〜85℃、Extended: -40〜125℃
パッケージ28ピン SPDIP / SOIC / SSOP / QFN など

データシートのファミリ表で、PIC16(L)F18857が 32768 words / 56 KB Flash、256B EEPROM、4096B SRAM、25 I/O、24ch ADC2 と示されている。

表記意味何に使うか
32768 words / 56 KB Flashプログラムを保存する容量書いたCコードや機械語を入れる
256B EEPROM電源を切っても残る小さなデータ保存領域設定値、校正値、カウンタなど
4096B SRAMプログラム実行中に使う一時メモリ変数、配列、受信バッファなど
25 I/O入出力ピンの数LED、スイッチ、センサー、モーター制御など
24ch ADC2アナログ電圧を読める入力数ボリューム、温度センサー、電圧測定など

内蔵周辺機能

内蔵周辺機能の全体像

CPU本体とは別に、PIC16F18857の中に入っている便利な小回路が入っている。

マイコンの中には、CPU以外にこういう部品が入っている。

1
2
3
4
5
6
7
CPU          → プログラムを実行する頭脳
タイマ       → 時間を数える
ADC          → 電圧を数値に変換する
PWM          → モーターやLEDの強さを制御する
CLC          → 簡単な論理回路を作る
通信回路     → UART / SPI / I2C など
監視回路     → 暴走検出、エラー検出など

タイマ

タイマは、マイコン内部で時間を数える機能。

たとえば、

1
2
3
4
5
1msごとに処理する
LEDを0.5秒ごとに点滅する
10秒経ったらモーターを止める
PWM信号を作る
入力信号の長さを測る

などに使う。

ビットの違いは以下:

  • 8ビットタイマ → 短い時間向き(0~255)
  • 16ビットタイマ → より長い時間・高精度な測定向き(0~65535)

HLT

  • HLT は Hardware Limit Timer の略
  • 日本語っぽく言うと、ハードウェア制限タイマ
  • 普通のタイマより少し賢くて、信号の時間幅や異常な長さを監視する用途に使える

例えば、

1
2
3
4
入力信号が長すぎる
パルスが来ない
一定時間内に反応がない
モーター制御信号が異常

のような状況を検出するのに使える。 ソフトウェアでずっと監視しなくても、タイマ側で判定できるのが利点。

WWDT

  • WWDT は Windowed Watchdog Timer の略
  • これはマイコンの暴走監視機能
  • 通常のWatchdog Timerは、プログラムが暴走して止まったときにマイコンをリセットするための機能

たとえば、プログラムが正常なら定期的に、

1
私は正常に動いています

という合図をWatchdogに送っている。

でもプログラムが暴走して、その合図を送れなくなると、

1
おかしい。リセットしよう。

となる。

WWDTの Windowed は、「決められた時間範囲内でだけ合図してよい」という意味。

つまり、

1
2
遅すぎてもダメ
早すぎてもダメ

これにより、単にプログラムが止まっただけでなく、異常に速くループしているような不具合も検出しやすくなる。

CLC

  • CLC は Configurable Logic Cell の略
  • 日本語では、設定可能な論理セル
  • 簡単に言うと、マイコン内部に小さな論理回路を作れる機能

たとえば、

1
2
3
4
5
6
AND
OR
XOR
NOT
フリップフロップ
ラッチ

のような回路を、マイコンの中で構成できる。

普通なら、下のような処理はCPUでやる。

1
2
3
入力Aを読む
入力Bを読む
AとBが両方1なら出力を1にする

でもCLCを使うと、CPUを使わずにハードウェアだけでできる。

たとえば、

1
2
スイッチA AND スイッチB → 出力ON
PWM信号 AND 安全許可信号 → モーター駆動

のようなことができる。

CWG

  • CWG は Complementary Waveform Generator の略
  • 日本語では、相補波形生成器
  • 主にモーター制御や電源制御で使う
  • 「相補」というのは、片方がONのとき、もう片方がOFFになるような信号
1
2
信号A:  ON  OFF ON  OFF
信号B:  OFF ON  OFF ON

のような関係。

  • たとえば、Hブリッジやハーフブリッジでモーターを駆動するときに使う
  • 重要なのは、上下のトランジスタが同時にONになるとショートして危険なので、CWGではデッドタイムという少しの隙間時間を入れられる
1
2
3
上側OFF
少し待つ
下側ON

という制御ができる。

NCO

  • NCO は Numerically Controlled Oscillator の略
  • 日本語では、数値制御発振器
  • 簡単に言うと、設定した周波数のパルスや波形を作る機能

たとえば、

1
2
3
4
1kHzの信号を出す
10kHzのパルスを出す
ブザー用の音を作る
一定周期のクロック信号を作る

などに使える。

タイマでも似たことはできるが、NCOは周波数を細かく設定しやすいのが特徴。

SMT

  • SMT は Signal Measurement Timer の略
  • 日本語では、信号測定タイマ
  • 外部から入ってくる信号の時間的な特徴を測るための機能

たとえば、以下などに使う。

1
2
3
4
5
パルス幅を測る
周期を測る
周波数を測る
HIGH時間を測る
LOW時間を測る

例として、センサーからパルスが出てくる場合、下のようなタイプのセンサーがある。

1
2
パルスの幅が長い → 測定値が大きい
パルスの幅が短い → 測定値が小さい

そういう信号を読むのに便利。

CRC/SCAN

  • これはエラー検出やメモリ検査系の機能
  • CRC は Cyclic Redundancy Check の略
  • 日本語では、巡回冗長検査
  • 簡単に言うと、データが壊れていないか確認するための計算

たとえば、以下などを確認するときに使う。

1
2
3
通信で受け取ったデータが正しいか
Flash内のプログラムが壊れていないか
保存データが壊れていないか

SCAN

  • SCAN は、マイコン内部のFlashメモリなどを順番に読みながらCRCチェックする機能

つまり、以下などの用途。

1
2
3
プログラムメモリをスキャンする
CRCを計算する
異常がないか確認する

信頼性が必要な機器では役に立つ。

PWM

  • PWM は Pulse Width Modulation の略
  • 日本語では、パルス幅変調
  • ON/OFFを高速に繰り返して、平均的な出力の強さを変える方法

たとえばLEDを考えると、以下のような制御ができる。

1
2
3
ずっとON        → 明るい
半分だけON      → 半分くらいの明るさ
少しだけON      → 暗い

PWMは、以下などでよく使う。

1
2
3
4
5
LEDの明るさ調整
モーター速度制御
ブザー音
サーボ制御
電源制御

デューティ比

  • PWMで重要なのがデューティ比。
  • デューティ比 = ON時間の割合

たとえば、以下のような意味。

1
2
3
25% → 25%の時間だけON
50% → 半分ON、半分OFF
90% → ほとんどON

ロジック機能

ここでいうロジック機能は、主にCLCのような機能を指す。

つまり、簡単な論理処理を、CPUではなくハードウェアで行う機能。

1
2
3
4
入力AがONかつ入力BがONなら出力ON
入力Aまたは入力BがONなら出力ON
信号を反転する
複数の条件を組み合わせる

3つのメモリ

Flashメモリとは

  • Flashメモリは、マイコンの中にある「プログラム保存場所」
  • 下のようなプログラムを書いたら、それがコンパイルされて、このFlashに書き込まれる
1
2
3
LEDを点滅させる
センサーを読む
UARTで送信する
  • PIC16F18857では、32768 words / 56 KB Flashとある
  • ここでの word は英単語ではなく、PICの命令1個分の単位
  • PIC16系では1命令がだいたい14ビット

$$ 32768 words × 14 bit = 約56 KB $$

  • つまり、約56KBぶんのプログラムを入れられるという意味

SRAMとは

  • SRAMは、プログラムが動いている間だけ使う作業用メモリ
  • PCでいうRAMに近い
  • 例えば、Cの変数や配列がSRAMを使う
1
2
int count;
char buffer[32];
  • PIC16F18857では、4096B SRAM
  • なので、4096バイト = 4KB の作業用メモリがある

EEPROM

  • EEPROMは、電源を切っても残るデータ保存用メモリ
  • PIC16F18857では、256B EEPROM
  • つまり、256バイトなので大きくはない
  • でも、設定値を保存するには十分なことが多い

例:

1
2
3
4
5
モーター速度設定
センサー補正値
起動回数
ユーザー設定
最後に選んだモード
  • Flashも電源を切っても残るが、基本的にはプログラム用
  • EEPROMは、プログラム実行中に小さな設定データを書き換える用途に向いている

3つのメモリの違い

種類電源OFFで残る?主な用途
Flash残るプログラム本体
SRAM消える実行中の変数、一時データ
EEPROM残る設定値、記録データ

I/Oとは

  • I/Oは、Input / Output の略
  • つまり、マイコンのピンを使って次ができる
1
2
入力 Input  : スイッチを読む、センサー信号を読む
出力 Output : LEDを光らせる、リレーを動かす、ブザーを鳴らす
  • PIC16F18857では、最大で25本くらいのピンを入出力に使える
  • ただし、28ピンのマイコンでも全部が自由に使えるわけではない
  • 電源ピン、GNDピン、リセット用ピンなどがあるため、実際のI/O数は25本

基本的なピン

  • VDD → 電源+
  • VSS → GND
  • MCLR → リセット端子
  • ICSPCLK → 書き込みクロック
  • ICSPDAT → 書き込みデータ

ちなみに、DとSの意味は、昔のMOSトランジスタ用語に由来する。

  • D = Drain
  • S = Source

Portピン

PICではピン名にこういう名前が付く。

1
2
3
4
5
6
7
RA0
RA1
RA2
RB0
RB1
RC0
...

これは下の意味:

1
2
3
4
5
R A 0
│ │ │
│ │ └─ 0番目
│ └─── Aポート
└───── Register / Port系の名前

ピンはグループごとに分かれている。

1
2
3
PORTA: RA0, RA1, RA2, RA3...
PORTB: RB0, RB1, RB2...
PORTC: RC0, RC1, RC2...

次のように対応する。

1
2
3
4
RA0 = PORTAの0番ピン
RB3 = PORTBの3番ピン
RC6 = PORTCの6番ピン
RE3 = PORTEの3番ピン

GPIOを使う時の基本レジスタ

レジスタ役割
TRISx入力か出力かを決める
LATx出力値を書き込む
PORTx実際のピン状態を読む
ANSELxアナログ入力にするか、デジタルI/Oにするかを決める
WPUx弱プルアップを使うか決める

レジスタ

以下のようなレジスタがある。

  • TRIS = 入力/出力を決める
  • LAT = 出力する値を書く
  • PORT = 入力状態を読む
  • ANSEL = アナログ/デジタルを切り替える

例えば、RA0の場合以下のようになる。

名前意味
TRISA0入力か出力かを決める
RA0 / PORTA0ピンの現在の状態を読む
LATA0出力値を設定する
ANSA0 / ANSELA0アナログ入力にするかデジタルI/Oにするかを決める

ICSP

ICSPとは

  • In Circuit Serial Programmingの略
  • PICを基板等に実装したままの状態で、内蔵メモリにプログラムを 書き込む方法のこと
  • つまり、ICSP方式でPICのプログラミングを行えば、いちいち PICをソケットからはずしてプログラマのソケットに差し換える手間が不要

ICSPのイメージ

イメージは以下の感じ。

1
2
3
4
5
6
7
PICkit「データ線に 1 を出したよ」
PICkit「クロックをカチッ」
PIC「今の値は 1 だな」

PICkit「データ線に 0 を出したよ」
PICkit「クロックをカチッ」
PIC「今の値は 0 だな」

ICSPでクロック線を分ける理由

書き込みは以下のような感じ。

1
2
3
ICSPDAT:  1   0   1   1   0
ICSPCLK: ↑   ↑   ↑   ↑   ↑
          読む 読む 読む 読む 読む

「データが来たら読む」方式もあり、代表例はUART。

1
2
3
4
UART:
TX → データ送信
RX → データ受信
GND → 基準
  • UARTにはクロック線がない
  • その代わり、送信側と受信側で以下のように通信速度を事前に合わせる必要がある
1
2
9600bps
115200bps

さらに、UARTは以下のようなルールが必要。

1
2
3
スタートビット
データビット
ストップビット

ADC

ADCとは

  • ADCは、Analog to Digital Converter の略
  • 日本語では、アナログ・デジタル変換器
  • マイコンは基本的にデジタルの世界で動いている
1
2
3
4
0
1
HIGH
LOW
  • 上のような信号は扱いやすい
  • でも現実のセンサーは下のような中途半端な電圧を出す
1
2
3
4
0.73V
1.24V
2.58V
4.01V
  • このようなアナログ電圧を、マイコンが扱える数値に変換するのがADC
  • たとえば、5V基準で10ビットADCなら、下のように変換する
1
2
3
0V   → 0
2.5V → 約512
5V   → 1023

ADC2とは

  • ADC2は、Microchipが使っている名称で、通常のADCより少し高機能なADC
  • 普通のADCは、電圧を数値に変えるだけ
  • ADC2では、それに加えて、以下もしてくれる
1
2
3
4
5
平均化
フィルタ
しきい値判定
オーバーサンプリング
簡単な演算処理
  • などをマイコン内部で補助できる
  • つまり、CPUで全部計算しなくても、ADC側である程度処理してくれる機能がある

24ch ADC2の意味

  • ADCで読める入力チャンネルが24個あるという意味
  • ここでの ch は channel、つまりチャンネル

たとえば、下のように、複数のピンや内部信号をADCに接続できる。

1
2
3
4
5
AN0
AN1
AN2
AN3
...

注意点:

  • 24個のADCが入っているわけではない
  • 多くの場合、1つのADC回路に対して、24個の入力候補を切り替えて読む、という仕組み

イメージとしては、

1
2
3
4
5
6
7
センサー1
センサー2
センサー3
...
センサー24
   ↓ 切り替えスイッチ
ADC本体

なので、24個を完全に同時に測るというより、順番に切り替えて測る感じ。

ざっくりまとめ

PIC16F18857のこの仕様は、こう読めばOK。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
56KB Flash
→ プログラムを入れる場所

4KB SRAM
→ 動作中の変数を置く場所

256B EEPROM
→ 電源OFF後も残したい小さな設定値を置く場所

25 I/O
→ 外部部品とつなぐピンが25本ある

24ch ADC2
→ 最大24系統のアナログ電圧を数値として読める

また、内蔵周辺機能は次のまとめになる。

1
2
3
4
5
6
ADC  → 電圧を読む
PWM  → 強さを調整して出す
タイマ → 時間を数える
CLC  → 条件判断をハードウェアでやる
WWDT → 暴走を監視する
CRC  → データ破損を調べる

参考文献

Built with Hugo
テーマ StackJimmy によって設計されています。