今回は従来からArduino
UNOなどで非常によく使われているATmega328Pの強化版であるATmega328PBについて紹介してみたいと思います。まずはAtmega328Pとの違いから
ATmega328Pとの違い
1.
UART, SPI, I2Cが2つずつ使える
2.
タイマー(PWM)が使える数が多い
3.
DIPパッケージが存在しない
大きな違いはこの3つかなと思います。ATmega328Pと互換性をそこそこ維持しつつも最近のマイコンらしくペリフェラルも強化された完全なATmega328PBの上位互換です。DIPパッケージが無いのも近年の流れとも言えます。(IC類でも最近はDIPがディスコンになったり元から無かったりってことが増えてきています。)
筆者はPORT出力、PWM出力(タイマー)、ADC、UART、SPIを使いましたが、ATmega328Pに搭載されている機能を使う際はほとんど変更なしに同じプログラムが動作しました。ただし、UART,SPI,I2Cについては2つに増えたためレジスタ名に番号が増えて(例:UCSRA→UCSR0A)いることには注意してください。
各PORT、ペリフェラルの基本的な使い方は以前の記事(ATmega328Pでの使い方)を参考にしてください。本記事ではATmega328PBを使う際の注意点を紹介します。
ATmega328PBの注意点
1.
ATmega328Pでは電源だったピンが一部IOに変更されている
ATnega328PではGND(ピン番号3)、Vcc(ピン番号6)だったピンがそれぞれPE0とPE1に変更されています。そのため、ATmega328P用に設計した基板でATmega328PBを使う場合はPE0,1の出力設定に注意しなければなりません。間違ってIOを出力にしてPE0をHIGH, PE1をLOWにした場合マイコンが破損する可能性があります。
2.
Timer3コンペアB(OC3B)とTimer4コンペアB(OC4B)が同じピン(PD2)に設定されているため使うときの設定に注意点がある。
ATmega328PBではTimerが3つから5つに増えました。しかし、新たに追加されたTimer3とTimer4のコンペア(比較)B出力はどちらもPD4ピンを共用する仕様になり少し使用方法が複雑になりました。こちらについてもデータシートに記載があるのでデータシートを見てみます。
https://avr.jp/user/DS/PDF/mega328PB.pdf
すると、Timer3 コンペアBとTimer4コンペアBが変調器を通してPD2に繋がっていることがわかります。そして、PORTB7(PB7)の状態が1の時にOR
0の時にANDとなることがわかります。
言い換えると、普通のPWMピンとして使おうとする場合はTimer3か4かのどちらかを使ったうえでPB7(PORTB bit7)を1にしておく必要があるということです。(筆者はこれで数日潰しました)
ちなみに、PB7を0(変調器をAND)にした場合はTimer3か4かのどちらかしか使わない場合は常にLが出力されます。
また、両方使った場合はPB7が0(AND)の場合duty比がAND(50%と50%の場合は25%が出力)、PB7が1(OR)の場合duty比がOR(25%と25%の場合50%)されます。そのため、Timer3と4を両方有効化して使うことは基本的に無いと思います。
以上が筆者がATmega328PBを使っていて引っかかった点および気を付けた点になります。
ATmega328PBはATmega328Pの正当な進化系でかつ互換性をそこそこ維持した使いやすいマイコンだと思います。ATmega328Pでは足りないけどもっと上のAVRとか32bitマイコンは大規模すぎるって時に有用じゃないかと筆者は思います。