先日、ある試作機を作る際に遭遇したトラブルについて、
解決方法をご紹介します。
試作機の概要としてはdsPICのUARTモジュールで数MHzの高速通信をさせ、
RS485ドライバを介してデバイスと通信するものです。
遭遇した問題はUARTの受信がなかなか安定しないということです。
低速なUARTではこのような問題に遭遇したことがありませんでした。
時々、全く通信ができなかったり(受信割り込みが発生しない)、
通信できても、意図しないデータも一緒に受信したりという状況でした。
RS485とdsPICの間にオシロで計測すると、
波形には問題なく、通信も安定するという状況でした。
RS485ドライバは半二重通信なので送信モードと受信モードの切り替えに
問題があるのか、受信バッファ処理に問題があるのかなど色々検討しました。
結論は、UARTのdsPICの入力ポートの電圧が不安定だったようです。
オシロをつなぐと、プローブの微小なキャパシタンスで安定したようです。
電圧が不安定なため、ノイズの影響をもろに受けているようです。
対策は、
RS485のRO受信ポートからdsPICのUART入力ポートへ直接つないでいる
配線に対してプルアップ抵抗を間に入れました。
追加回路を作成するのは面倒なため、
dsPICのメインプログラム内で内部プルアップを有効にさせました。
dsPICリセット時のデフォルトではCN**ピンの内部プルアップは
すべて無効になっています。
CNPU1=0x0000;
CNPU2=0x0000;
今回、UARTの送受信ポートはRB10,11のため、
ピンアサイン図からCN15,16に該当します。
CN15,16の内部プルアップを有効にさせるため、
下記のように変更しました。
CNPU1=0x8000;
CNPU2=0x0001;内部プルアップは外付けでプルアップさせるよりも、
弱いプルアップとなっていますが、
今回内部プルアップを有効にさせるだけで
遥かにUARTの通信が安定するようになりました。
内部プルアップ恐るべし。
内部プルアップを有効にすると、
スイッチ入力を使用する際の回路の簡素化にも貢献できます。
スイッチ入力の際に入力ポートに直接スイッチを接続し、
一方をGNDに落として、内部プルアップでプルアップさせれば、
入力ポート部分の抵抗やVDDなどのプルアップ回路が不要になります。
ぜひ、内部プルアップを活用してみてください。