前回PICマイコンによるACモーターのPID制御 ミニ人工心肺改の製作 その②で大体のハードウェアやプログラムができあがりました。

 

あっちなみに事のはじまりやなぜACモーター(誘導電動機)を位相制御でPID制御させたいのか?を知りたい方はこちらからどうぞ↓

ミニ人工心肺装置の制作

PICマイコンによるACモーターのPID制御 その①

 

はじめに (つづき)

ざっくり、何がしたいかというとAC電源からフォトカプラでゼロクロスを検知してPICに外部割り込みとして読み込ませた後、おおよそ8.3msec(交流波形の半波形)ごとに設定値と現在回転数の電圧をA/D変換しその値による制御処理を行わせます。

その処理の結果かからフォトトライアックの作動を調節して、半波形ごとにAC電源を位相制御してACモーターを動作させるというものです。

書いたら簡単なんです。

要するに誘導電動機(ACモーター)の回転数制御をしてやろうというこころみ!!

 

前回までの問題点は?

前回まではフォトカプラでゼロクロスが立ち上がっているのにPICマイコンがそれを外部割り込みとして認識していないという件です。

 

なんと原因は簡単で、ただ単にプルアップ抵抗の値が低すぎてうまく外部割り込みが入らなかっただけでした。

なんか前回プログラムがどうのこうのと思いをはせましたが・・なんでもなかったです。

ちゃんと外部割り込みが入って設定用のA/D変換(conf)とモーターからのレートジェネレーターからの電圧をA/D変換(jene)している事を確認しました。

一応動いている時の動画をどうぞ

 

フォトカプラの反応時間も最初プルアップ抵抗が1KΩのときは2msecと長かったのですが、33KΩに変更すると、おおよそ500μsecになりました。↓

 

 

新たな問題発生!!

プルアップ抵抗値を上げる事で、あっさり外部割り込みが入るようになったのですが、新たな問題が発生

今度はフォトトライアックが作動していない・・・

フォトトライアックへ出力しているのはRA4からですがここからはしっかり電圧が出力されています。

 

悩む事5日!!

結局、フォトトライアックS21ME3のデータシートに最低でも7mAは流せよ!って書いてありまして・・その通りにするとぬるっと動き出しました。ちなみにデータシートには最低電流の2倍は流せと書いていたので1KΩから330Ωへ変更しました。

ほんと今回は抵抗器になんども悩まされます。しっかりデータシートは読めということです。

 

結局最終的に回路図は下記のようになりました。 赤いところが直したところです。

 

上記の回路図のとおり回路を組んで、いざ火入れを迎えました。

しかし・・・↓

スポンサードリンク

 

動かなかった理由を考察します。たぶんプログラムがうまくないのです。

なのでMPLAB X IDEのシュミレータ機能でフォトトライアックに出力するRA4の作動時間などをみてみる事にしました。

シュミレーションの結果、プログラム中のゼロクロスから外部割り込みが入って位相制御量を決定する箇所に問題がありました。

以下は外部割り込みがはいり制御量を計算したのちにフォトトライアックを動作させるための出力の遅れ時間を出力するプログラムの一部です

//ここからduty値から位相制御を開始する

       __delay_us(100);//

        for(count=0;count<(256-duty);count++)

        {

        __delay_us(24);//32μsecから24μsecに変更

/*もともと8.3msec256で割った32μsecdelayだった、要するに255328.16msecという計算だったがC言語だから複数の命令が1構文中に存在する為サイクル数が合わず時間が大幅にずれる為シュミレーションで時間をみながら値を決定した。*/

        }

        PORTAbits.RA4=1;//フォトトライアックに出力

        __delay_us(1000);

        PORTAbits.RA4=0;

位相制御は256段階の制御量をdutyとして半波形が8.3msecなので1段階が32μsecとなり、ゼロクロスから(256-duty)*32μsec待った後にフォトトライアックを出力すれば制御出来る事になります。

しかし任意のduty値の時に、たとえばduty=200の時、(256-200)*32μsec=1792μsecで出力されるはずですがシュミレーションでは2.8msecを超える値がでて時間が長くかかり、まったく任意の位相と合いませんでした。

原因はC言語を使い、32μsecを繰り返す方法にfor文を使っているのでプログラムでは一文がアセンブラに変換されたときに複数命令になり余計に時間がかかると推測できました。

ですので対策としてシュミレーションで時間を見ながら調整し、うまくいく時間が24μsecという値をたたきだしました。

今回は20MHzの外部発振子を用いているので、条件が変わればまたこの値は変わると思います。

 

これでうまくいってくれよと願いをのせて再チャレンジ!!

 

うごきは悪いですが、なんとなか動いてくれました。

 

ここから文章では数行ですが、なんとスムーズに動くようになるまで2ヶ月もああでもない、こうでもないと試行錯誤、カットアンドトライでプログラムをいじくりまわし・・

 

ついに誘導電動機の位相PID制御を達成しましたー!!

 

まだまだ、改良の余地はありますが、なんとかこれで当初の目的のミニ人工心肺を作成して、遊ぶという夢を達成できそうです。

下記が動作中のモーターです。最初と比べて最高に低域が安定してます。

最高です。

 

最後にプログラムを載せておきます。ご意見やご指摘があれば教えてください。

当方素人なんでよろしく。

まずメインプログラムです。→ acmotercon

そんでLCDを使うためのプログラムは2つ →lcd.c  lcd.h

LCDパネルの使い方はPIC16F88でLCDパネルに挑戦を参考になさってください。

 

 

次回はモーターを収納するケースを新調します。

スポンサードリンク