• ベストアンサー

PICマイコンができること

PICは入力信号によって「Yes」か「No」かを出力させるという仕事はできるが、入力信号をそのまま出力させるという仕事はできないものなのでしょうか? 今、PICマイコンに入力する信号は、サーボモータを動かすためのパルス信号であり、サーボモータが右に動くときと、左に動くときとで別々のポートから信号を出力させることを考えてます。 そのために、入力信号のパルス幅をタイマーで計測し、判断させているのですが、問題は判断項目(while や if)が加わると入力信号をそのまま出力することができないことです。 一応、PIC16F84Aを用いて10MHzの内部クロックで 1.判断項目がないとき入力信号をそのまま出力(別々に出力はしない) 2.判断項目は同じとして出力を入力信号にせず、5Vにして別々に出力 の2つについて実際にできました。 結構、厳しい条件ですがPICに期待しすぎなのかわからなくなったので質問しました。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • thyristor
  • ベストアンサー率76% (13/17)
回答No.3

あ、ごめんなさい。もちろんプリスケーラの設定と、割り込み関数内でTOIFのリセットが必要です。 プリスケーラの設定は、どの程度の精度が要求されるかによります。サーボモータの仕様がわかりませんが、ON時間0.1[ms]刻みの制御で十分滑らかに動くとします。この場合、0.1[ms]間隔でタイマ割り込みをかければよいので、OPTIONレジスタのビット3(PSA)を1とし、タイマ0にプリスケーラを使用しないようにします。そして、タイマ割り込み関数内でタイマカウンタTMR0に6をセットして下さい。こうすることで、1÷10[MHz]×4×250=0.1[ms] 間隔で割り込みが入るようになります。

その他の回答 (3)

回答No.4

質問と違う回答になってしまいますが、1/10のラジコンでしょうか? 1/10のESCなら双葉のエントリーモデルでもブレーキ機構は付いていますが・・・ MC230CRはバック付きですが、前進からバックに入れるとブレーキ、一度ニュートラルに戻してからバックに入れるとバックします 電源を入れるときに設定用のスイッチを押しっぱなしにして、電源を入れるとバックが使用不可になり、ブレーキモードになります

  • thyristor
  • ベストアンサー率76% (13/17)
回答No.2

RCカーには詳しくないので的外れになってしまうかもしれませんが・・・ ご使用のRCカーは、機械式スピードコントローラをサーボモータで制御するタイプで、このサーボモータと受信機の間にPICを入れる、という理解でよろしいでしょうか?そして、現在の入力パルスのON時間とニュートラル時のパルスのON時間を比較して出力ポートを切り替えたいわけですね?それならばヒントだけですが、こんな感じでどうでしょうか(間違いがあるかもしれません) /* 入力ポートにパルスを入力、出力ポート1とスピードコントローラ用サーボを接続、出力ポート2とブレーキ用サーボを接続、タイマ割り込み周期0.1[ms]、ニュートラル時のON時間が1[ms]の場合 */ int OnTimeNeutral; //ニュートラル時のON時間 int OnTimeNow; //現在のON時間 int Counter; //現在のON時間をカウント int BeforInput; //前回の入力 メイン関数(){ //グローバル変数を初期化 OnTimeNeutral = 10; //ニュートラル時のON時間 OnTimeNow = 0; //現在のON時間 Counter = 0; //現在のON時間をカウント BeforeInput = 0; //前回の入力 タイマ割り込みを許可 } タイマ割り込み関数(){ //現在のON時間をカウント if(入力ポート == 1) Counter ++; //現在のON時間を取得 if((BeforInput == 1) && (入力ポート == 0)){ OnTimeNow = Counter; Counter = 0; } //現在のON時間によって出力ポートを切り替え //(現在のON時間がニュートラル時より小さい時に前進する場合) if(OnTimeNow < OnTimeNeutral){ 出力ポート1 = 入力ポート; 出力ポート2 = 0; }else{ 出力ポート1 = 0; 出力ポート2 = 入力ポート; } BeforeInput = 入力ポート; } なお、このプログラムでは後進はできず、前進・ブレーキのみ可です。希望する動作に合わせて変更してください。

trial
質問者

補足

本当にありがとうございます。 私がやっていたプログラムよりも全然スマートなのでかなり焦りました。 順に追っていってもできると思ってやってみたんですが、あと一息で動きそうなのでもう一つ質問させてください。 上記のプログラムは、入出力ポートと各関数名と割り込みの設定をすれば、あとはニュートラルのON時間を所望の値にすればOKでよろしいでしょうか? 思ったのですが、割り込みのプリスケーラは設定なしでフラグも0に戻さなくても大丈夫でしょうか? 実行してみた結果、入力パルスをいじっても常にelseの条件のループに入ってしまう状況でした。 #include <pic.h> __CONFIG(0x3FF2); int OnTimeNeutral; //ニュートラル時のON時間 int OnTimeNow; //現在のON時間 int Counter; //現在のON時間をカウント int BeforeInput; //前回の入力 void main(void){ //グローバル変数を初期化 OnTimeNeutral = 16; //ニュートラル時のON時間 OnTimeNow = 0; //現在のON時間 Counter = 0; //現在のON時間をカウント BeforeInput = 0; //前回の入力 PORTB = 0x00; PORTA = 0x00; TRISB = 0x00; // PORTBの入出力設定 0 - output, 1 - input TRISA = 0x01; // PORTAの入出力設定 //タイマの割り込み許可 OPTION= 0b10000000; // prescaller なし INTCON= 0b10100000; /* T0IE=1; // Timer overflow interrupt enable GIE =1; // 割り込み自体の許可 TMR0=0; // タイマーリセット T0IF=0; // タイマフラグリセット */ } static void interrupt isr(void){ //現在のON時間をカウント if(RA0 == 1) Counter ++; //現在のON時間を取得 if((BeforeInput == 1) && (RA0 == 0)){ OnTimeNow = Counter; Counter = 0; } //現在のON時間によって出力ポートを切り替え //(現在のON時間がニュートラル時より小さい時に前進する場合) if(OnTimeNow < OnTimeNeutral){ RB0 = RA0; RB1 = 0; } else{ RB0 = 0; RB1 = RA0; } BeforeInput = RA0; }

  • thyristor
  • ベストアンサー率76% (13/17)
回答No.1

勘違いしてたらごめんなさい。 マイコンにパルスを入力するとありますが、普通はPICのタイマ機能を使ってPWM信号を出力させると思います。つまり、入力パルスは必要ありません。それから、サーボモータの回転方向によって出力ポートを変えたいとの事ですが、理由がよくわからなかったので補足をお願いします。

trial
質問者

補足

ありがとうございます。 パルスを入力する背景として、電気RCカーにブレーキの機構を組み込みたいということです。 最近の電気RCカーには、強いプレーキを組み込むとアンプが壊れてしまうため搭載されていません。でも、弱いブレーキだったら大丈夫かなぁっというレベルでやってみようと思いました。 で、勝手ながら、プロポ(RCカーのコントローラ)は2chのものを使用したいので必然的にステアリング信号と、加速度信号の2つとなってしまいます。そこで、加速度信号から前進、後進をPICで判断し、別々のポートから出力させたいということです。そうすることで、後進のときに新たなサーボモータでRCカーのプロペラシャフトの回転を抑えるようにしようと考えています。このとき、RCカーの駆動モータには信号が行かないようにもしたいとも考えています。 結局、プロポの操作をリアルに反映させたいということです。 私の質問で、「サーボモータの回転方向によって…」と書きましたが、「前進、後進」としてもパルス幅が同じように変わるだけなので簡単に書かせてもらいました。すみません。

関連するQ&A