--「PIC」プログラミング再び (14)---

 ハードの作成と、プログラムの作成を同時に進めてきました。
 やっと、制御部分のPICのプログラムとハードのテストがいい
 結果になりました。
 テストボードで、ハードの仮組をし、ソフトを確認しながら、手を
 加えて、プログラムを作成しました。
 今回は、PICを二つ使ってます。なんとも、もったいない使い方
 で、プログラムは、容量の20パーセントぐらいしかつかって
 ません。余分なコメントもありますが、掲載します。

 制御プログラム----main.c
 今回のプログラムは、タイマー0の割り込みと外部割り込み
 を使ってます。
 当初、押しボタンスイッチは、スタートとストップだけでしたが、
 急遽、リセットの押しボタンスイッチを追加しました。
 この、コントローラーは、ステッピングモーターの回転数と
 正転・逆転のコントロール、センサーで正転から逆転への
 切り替え、の動作を制御するだけです。
   自動で
     正転→センサーで逆転
   手動で
     正転 逆転 停止
 これだけの動作です。パルスをカウントして、その分だけ
 戻るようにすれば、停止も自動でできますが、ちょっと面倒
 ですね。確か、ワンパルスで1.8度ぐらい回転しますので、
 一回転には、360÷1.8=200パルス。
 リードが2ミリとすると5cm動くのには、
 200×50mm÷2=5000パルス往復では、
 5000×2=10000パルス。
 このくらいのパルス数なら、それほど苦労しなくてもカウント
 できそうですが、まあ、この次の課題ですね。
 ちなみに、unsigned int の整数だと
       0 ~ 65535
 カウントが可能ですので、Long型の整数を使わなくても
 大丈夫のようです。ここまで細かいプログラムを組むと、
 CNCになってしまうので、CNCにしてしまったほうが楽
 でしょうね。

--「PIC」プログラミング再び (13)---

 今日もまた一つ勉強。
 センサーをフォットカプラー接続して、センサーのON-OFFを
 フォットカプラーを介して、PICに取り込む簡単な回路とプログラムで、
 実験しました。
 PICじゃなくて、LEDを接続して実験すると、センサーのON-OFF
 でLEDのLED-OFFができるのに、PICに接続すると、PIC入力端子
 のレベルが、HIGHT(ON)、LOW(OFF)に変化しませんでした。

 

 問題を切り分けるのに、あれこれやりましたが、マイナスコント
 ロールするとうまくいきます。

 

 プログラムで、入力端子の初期設定で、LOWレベルにしても
 LOWになりません。
 あれこれ悩みましたが、ソフトの原因ではなくて、ハードの原因の
 ようで、電源を入れると入力端子がHIGHTになるようでした。
 教科書のように、プルダウン抵抗を入れてみました。

 

 すると、電源投入直後も、入力端子がLOWレベルになり、思った
 動作ができるようになりました。
 プルダウン抵抗やプルアップ抵抗が必要だと教科書には、
 書いてありますが、その意味がやっと
 分かりました。

--「PIC」プログラミング再び (12)---

 だいぶ先が見えてきましたが、全体をまとめるあたって、今回は、
 回路図を書きました。
 細かい計算等はしていませんので、動かなかったら、変更です。

 

 こうやって、計画的に部品等を配置すれば、きっと仕上がりも、
 それなりに仕上がるんでしょうね。
 一つ一つ動作を確かめて、作ってますが、フォットカプラーから、
 PICへの入力部分と、PICからフォットカプラーを介して、
 ドライバーへの入力の部分の動作がまだです。
 明日は、フォットカプラーから、PICへの入力部分のテスト
 です。

--「PIC」プログラミング再び (11)---

 AD変換によるステッピングモーターの速度制御をあきらめて
 ましたが、割り込みとの組み合わせて、なんとか、
  240hz~1300hz
 のパルスの生成ができるようになりました。
 ステッピングモーターに接続して回してみると、見事、かなり低速
 から、結構高速、まで、制御できました。プログラムのソースコード
 を掲載します。参考になるかは、わかりませんが。
 デバック用につけているLCDのモジュールとヘッダーファイルも
 掲載しますが、ここのHPを参考にさせていただきました。
 速度変更----------main.c
 デバック用LCD表示----- lcd.c
 LCD表示用ヘッダーファイル--lcd.h
 このHPに出会わなかったら、ここまではできませんでした。
 実際にステッピングモーターを回してみると、加速や減速の
 過程で、昔の地下鉄電車の様な音がでます。
 
 あまりよく見えないのですが、ステッピングモーターのコントロール
 に入れている周波数もオシロで同時に映してみました。
 高速になるにつれて、パルスの幅が狭くなり、周波数が高く
 なるのが、なんとなく分かります。
 スピードコントロールのめどと、シュミットトリガーを入れたスイッチ
 の調整ができましたので、正転と反転のコントロールと、スタート
 ストップのコントロールのプログラムの
 作成に移ります。

--「PIC」プログラミング再び (10)---

===TMR0の罠===
 はまりました。TMR0の設定で、まるまる2日間。初期設定が
 プログラムに反映されませんでした。
 他の設定がだめなのか、制約があるのかネットで検索しま
 くりましたが、ヒットなし。お助け掲示板に書き込みました。
 しつこく検索続けていると、問い合わせのHPの過去記事に、
 「TMR0」の設定は、一回オーバーフローするともとに戻る。
 1回だけ有効の記事。目からうろこでした。
 プログラムを書き換えると、見事思った動作。思わず、
 「やった」と叫びたくなりました。
 丸二日間、悩みました。

--「PIC」プログラミング再び (9)---

 チャタリングで、思った動作をさせることができないので、
 シュミットトリガー回路を制作すべく、部品を秋月電子
 に注文しました。
 SN74LVC1G14DBVRというシュミットトリガーインバーター
 というICです。
 ところが大失敗。

 

 この写真を見て注文しましたが、実際は、

 

 

 なんと、基板取り付け用の小さいICでした。
 これでは、半田付け、困ります。
 通常のICタイプのもの、注文しました。

--「PIC」プログラミング再び (8)---

 昨日作ったプログラムを変更して、AD変換で、周波数を変える
 プログラムを作って、オシロで見てみました。
 結果、AD変換は、だめでした。処理速度が遅くて、使えません。
 残念。Cではなくて、アセンブラーで組めば、可能性あるのかも
 しれませんが、難しいです。
 方針を変えて、低、中、高、ぐらいの3段階ぐらいになるように、
 してみようと思います。
 割り込みで、キー入力をチェックして、作成していたテーブルに
 従って、速度を変更する、というプログラムにして見ようと思います。
 割り込みにどのくらいの時間がかかるのか、やっていないとわかり
 ません。
 まあ、最悪、PICを速度の分だけ用意して、それを切り替えれば、
 いいので、のんびりとやります。

--「PIC」プログラミング再び (7)---

 ステッピングモーターをPICでコントロールするにあたって、
 スピードをボリュームでコントロールするためにはAD変換が
 必要になります。
 例のHPと参考書を見ながら、試作の回路でトライです。
 やっと、AD変換のめどがつきました。
 スピードをコントロールするのに、周波数を可変する必要
 があります。AD変換で、PICの生成周波数を1500hzか
 ら100hzぐらいまで、可変できるめどがつきました。
 プログラムでは、AD変換で取り込んだ値を5倍して、ミリボルト
 の表示をしてあります。この変数を多少変更すると、周波数
 の変更に使えると思います。
 テストに使ったプログラムです。
 ボルトの表示に使ったLCDも思った動作をさせることができず、
 やっとバックライトの配線を含め、正常動作するようになりました。

 

 テストに使ってるボードは、例の教科書の付属品です。

 

 
 いろいろ試作をするのには便利です。ブレッドボードもありますが、
 ある程度作ってあった方がいいのかもしれません。

--「PIC」プログラミング再び (6)---

 現在使用しているフリーのコンパイラで、__delay_μs()
 という単なる待ち時間の関数が使える。以前から使えたのか、
 あるヴァージョンかから使えるようになったのかは、分から
 ないが、前述の教科書のように自分で関数をつくらなくて
 いいので便利だし、結構使う関数だと思う。
 ただ、実際のところ、どのぐらい時間なのか、あれこれやって
 いるプログラムで簡易的に測定してみた。
 PICで
 for(;;){
RA1=1;
__delay_us(1);
RA1=0;
__delay_us(1);
}
 のプログラムを実行すると、矩形波が生成できるので、
 __delay_us(1)と__delay_us(2)と赤の部分を変更して、両者
 の差を見てみると、たぶん、実際の待ち時間が分かる。
 Cの場合は、1命令の実行時間がわからないので、命令
 の実行時間を相殺しないと、実待ち時間が分からないよう
 に思う。
 __delay_us(1)のオシロの画面で、Hの時間は、約40μs。

 

 __delay_us(2)のオシロの画面で、Hの時間は、約56μs。

 

 56-40で、__delay_us(1)の実時間は、16μsということになる。
 約16倍の待ち時間である。ちなみに、__delay_us(3)にしてみると、
 Hの時間が約72μsなので、16μsずつ増えている。
 やはり、細かい制御をするには、命令のクロック数の分かって
 いるアセンブラー。でも、アセンブラーは、私には、超難解。
 Cが似合ってる。

--「PIC」プログラミング再び (5)---

 PICのプログラミングを再開するにあたって、困ったののが、
 コンパイラと呼ばれるソフトです。教科書についていたCDに
 入っていましたが、なくしてしまいました。
 有料のを使えばいいのでしょうが、そこまで本格的でないので、
 FREEのソフトを使いたかったのですが、時間の経過とともに、
 便利に使ってたソフトは、バージョンアップしてしまい、HPから
 すぐにはDLできませんでした。
 現在は、すぐDLできるのはMPLAB® X IDEという最新のもの
 でした。いろいろ探すと、古いソフトをためたアーカイブという
 ところに以前のものがありました。
 Cのコンパイラも同梱されている8.84をインストールしました。
 さらに、このバージョンを使ってる方のHPがありました。
 やりたいことのプログラムのサンプルがあり、同じ開発環境
 なので、そのまま使わせてもらいました。
 以前から使っていた教科書も引っ張り出しました。

 

 この本についていたCD(どっかにしまい忘れ)がほしくて
 同じものを購入しましたが、なんと、新しい本には、CDが同梱
 されてなくて発売元のHPから、DLするようになってました。
 これなら、同じも買わなくてもよかったです。
 ジェジェジェです。