PICは入力信号によって「Yes」か「No」かを出力させるという仕事はできるが、入力信号をそのまま出力させるという仕事はできないものなのでしょうか?
今、PICマイコンに入力する信号は、サーボモータを動かすためのパルス信号であり、サーボモータが右に動くときと、左に動くときとで別々のポートから信号を出力させることを考えてます。
そのために、入力信号のパルス幅をタイマーで計測し、判断させているのですが、問題は判断項目(while や if)が加わると入力信号をそのまま出力することができないことです。
一応、PIC16F84Aを用いて10MHzの内部クロックで
1.判断項目がないとき入力信号をそのまま出力(別々に出力はしない)
2.判断項目は同じとして出力を入力信号にせず、5Vにして別々に出力
の2つについて実際にできました。
結構、厳しい条件ですがPICに期待しすぎなのかわからなくなったので質問しました。
よろしくお願いします。
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] 間隔で割り込みが入るようになります。
No.4
- 回答日時:
質問と違う回答になってしまいますが、1/10のラジコンでしょうか?
1/10のESCなら双葉のエントリーモデルでもブレーキ機構は付いていますが・・・
MC230CRはバック付きですが、前進からバックに入れるとブレーキ、一度ニュートラルに戻してからバックに入れるとバックします
電源を入れるときに設定用のスイッチを押しっぱなしにして、電源を入れるとバックが使用不可になり、ブレーキモードになります
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 = 入力ポート;
}
なお、このプログラムでは後進はできず、前進・ブレーキのみ可です。希望する動作に合わせて変更してください。
この回答への補足
本当にありがとうございます。
私がやっていたプログラムよりも全然スマートなのでかなり焦りました。
順に追っていってもできると思ってやってみたんですが、あと一息で動きそうなのでもう一つ質問させてください。
上記のプログラムは、入出力ポートと各関数名と割り込みの設定をすれば、あとはニュートラルの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;
}
No.1
- 回答日時:
勘違いしてたらごめんなさい。
マイコンにパルスを入力するとありますが、普通はPICのタイマ機能を使ってPWM信号を出力させると思います。つまり、入力パルスは必要ありません。それから、サーボモータの回転方向によって出力ポートを変えたいとの事ですが、理由がよくわからなかったので補足をお願いします。
この回答への補足
ありがとうございます。
パルスを入力する背景として、電気RCカーにブレーキの機構を組み込みたいということです。
最近の電気RCカーには、強いプレーキを組み込むとアンプが壊れてしまうため搭載されていません。でも、弱いブレーキだったら大丈夫かなぁっというレベルでやってみようと思いました。
で、勝手ながら、プロポ(RCカーのコントローラ)は2chのものを使用したいので必然的にステアリング信号と、加速度信号の2つとなってしまいます。そこで、加速度信号から前進、後進をPICで判断し、別々のポートから出力させたいということです。そうすることで、後進のときに新たなサーボモータでRCカーのプロペラシャフトの回転を抑えるようにしようと考えています。このとき、RCカーの駆動モータには信号が行かないようにもしたいとも考えています。
結局、プロポの操作をリアルに反映させたいということです。
私の質問で、「サーボモータの回転方向によって…」と書きましたが、「前進、後進」としてもパルス幅が同じように変わるだけなので簡単に書かせてもらいました。すみません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(ネットショッピング・通販・ECサイト) ジョーシンでクレジットカード番号が入力できません 1 2022/08/22 23:07
- Yahoo!メール Yahooメールにログインできません 2 2022/12/12 07:46
- 運転免許・教習所 対面する車用信号機の両隣の歩行者用信号を車用信号の変化予測に使うことは出来ますか? 1 2023/03/12 11:50
- その他(プログラミング・Web制作) 入力フォームへ、データを自動的に入力するプログラム。どうやって作る? 4 2023/01/16 10:24
- 電子レンジ・オーブン・トースター 日立のスチーム電子レンジMRO-GS8の修理 2 2022/10/15 17:34
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- その他(動画サービス) Twitchの電話番号認証ができません 2 2022/09/01 02:46
- 工学 オペアンプによる増幅回路でのノイズ対策について 5 2022/03/22 16:06
- C言語・C++・C# c言語の問題です 2 2023/07/21 10:51
- その他(スマートフォン・携帯電話・VR) 某信用金庫の通帳アプリ 4 2023/04/09 11:01
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
周波数433MHzについて
-
ネットプリントで出力、自動縮...
-
アマチュア無線の送信出力について
-
74HC00について
-
遅延によるグリッチのずれにつ...
-
グリッドタイインバーターの活用法
-
アマチュア無線機の購入について
-
ラジオドラマ、朗読の番組を教...
-
テスラ車のルディクロス?ludic...
-
障害物センサーを作りたいのですが
-
これさえあれば、キャバクラと...
-
(*`・ω・)ゞの意味教えてください
-
位相進み、位相遅れの電気回路
-
RL回路における位相差の理論値...
-
「合成インピーダンス」と「イ...
-
位相
-
電気力線のなす角度
-
なぜ20log10(1020)が60になるの...
-
理想的なフィルタの位相特性
-
散逸と損失の違い
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
300Wインバーターについて
-
バッファ・ドライバ・トランシ...
-
スーパーラジオのIFT調整について
-
周波数433MHzについて
-
PIC出力Hi←→Low時、5V←→0Vにな...
-
74HC00について
-
PICマイコン、PWMが100%になり...
-
Xbox360のキャプチャでTV経由す...
-
量子コンピュータの動作原理が...
-
各種フリップフロップ 機能変...
-
接点出力と無接点出力
-
遅延によるグリッチのずれにつ...
-
タイミングチャートについてま...
-
ハイエースディーゼルは出荷停...
-
7セグメントのディスプレイの...
-
カウンタに正弦波をクロックと...
-
モーターの定格出力と最大出力...
-
CD-ROMナビに、リアモニタを増...
-
タイマーIC555を使ってパルス信...
-
マキ電機のUTV2400Bの使用方法...
おすすめ情報