1 :
デフォルトの名無しさん:
PIC18F452というPICを使って、モータの制御をしようとしているのですが、
なんせC言語のプログラムが初心者なもので。
PWM信号でモータを制御しようとしていて、正逆回転がうまくいかないのです。
モータの回転方向切り替えはCW回転(オープンコレクタ)、CCW回転(0〜0.8V)となっている
のですが、どうプログラムしたらよいのでしょう?
ちなみに、ポートCからPWM信号を出力させてモータの速度を制御し、
ポートDからの信号でモータの正逆回転を制御したいのです。
どなたかご指導よろしくお願いします。
2 :
デフォルトの名無しさん:03/10/20 18:50
機械工学板の方がいいんじゃねーの?
見にくいからまずその一行空ける書き方をどうにかしろ。
ついでに改行入れる位置の不自然さをどうにかしろ。
>モータの回転方向切り替えはCW回転(オープンコレクタ)、CCW回転(0〜0.8V)となっている
オープンコレクタ時の電圧は? プルアップされているなら、その抵抗がつながってる反対かわの電圧を見てみて
PICの電源と同じなら、単純に HでCW LでCCWだ。
PICの電源より低いなら、入力端子にすればCW 出力端子にしてLを出力すればCCWだ
PICの電源より高いなら、2SCタイプのトランジスタを取り付ける必要がある。
6 :
デフォルトの名無しさん:03/10/20 20:07
>PICの電源と同じなら、単純に HでCW LでCCWだ。
これはつまり、
output_high(PIN_D0);
でCW
output_low(PIN_D0);
でCCW
ということになるのでしょうか?
※
ポートDのPIN_D0からの信号で正逆回転させる場合。
見にくいからまずその一行空ける書き方をどうにかしろ。
>>6 回路図を見ていないから、それでOKとは言ってあげられない。
心配なら、常に出力はLを出しておいて、方向レジスタで切り替えたら?
9 :
デフォルトの名無しさん:03/10/20 21:56
>>8 えと既に出来上がったキットを用いてやろうとしているので・・・
では、PICを5V、0.5Aで動作させているのですが、
PICのポートDのPIN_D0から1V出力させるためには
output_high(PIN_D0);
を使えばいいのですかね?
やってみてオシロで出力を見てみたのですが、出力が確認できませんでした。
10 :
デフォルトの名無しさん:03/10/20 22:20
アク禁から解放、やっと書けた!
>>1 PICにはトライステートバッファ(Tristate=on,off,z=∞=切断=ハイインピーダンス)というのがあって、
ここをON,OFF
.|
|\|
-| >ー
|/
これが逆方向にも並列に付いていて入出力方向設定できる。
自分はアセンブラでしか書いたことないのだが、Cにもないかな。
アセンブラコードだと
TRIS PORT 0/1 (PORTはA,Bの入出力ポートでPINごとでなく、レジスタまとめて入出力方向指定。0=出力、1=入力)
これやらないと、入力側と出力側が切れていて(ハイインピーダンス)で入力も受け付けないし、出力もでない。
>1
高専ロボコンか?大変だな。漏れは昨日負けてしまったよ。
>PICにはトライステートバッファ(Tristate=on,off,z=∞=切断=ハイインピーダンス)というのがあって、
これを訂正して
>PICには入出力ポートに
~~~~~~~~~~~~~
トライステートバッファ(Tristate=on,off,z=∞=切断=ハイインピーダンス)というのがあって、
13 :
↑ごめんまたまた訂正:03/10/20 22:48
>TRIS PORT 0/1 (PORTはA,Bの入出力ポートでPINごとでなく、レジスタまとめて入出力方向指定。0=出力、1=入力)
と書いたけれど、PINごとでも設定できる。
その場合は、TRISAだのTRISBだのいうレジスタがあるでしょう。
そのレジスタの8bitがそれぞれ、A,BそれぞれのPORTの8PINの入出力方向設定に対応してる。
だから、そのレジスタに各PINのon,offを考えて8bitまとめて値を入れてやれば良い。
>各PINのon,offを考えて
↓
各PINの入出力方向を考えて
スマソ。
>11
高専ロボコンではないです^^;
>10
入出力方向の設定はできて、ちゃんと機能することはできたのですが、
出力に設定されたPINから1Vとか、0Vを出力させることができないのです^^;
16 :
デフォルトの名無しさん:03/10/21 00:17
>>15 Cの場合にはループでくくってやらなくても大丈夫なの?
何を言いたいかっていうと、一瞬しか出力が出てないんじゃないかと。。。
アセンブラはインタプリタ的だけど、Cってイベントドライブでしょう。
18 :
デフォルトの名無しさん:03/10/21 00:51
>>16 ループでくくってますよ〜
PWM信号はきちんと出力されてるから、同様にしてやれば、ちゃんと出るのかと思ったのですが・・
どうもうまくいかないみたいで・・
>>15 電源5Vなのに1V? って事は相手はトランジスタだね?
ならば、PICの出力端子に2.2K〜5.1Kの抵抗を入れなさいな。
20 :
デフォルトの名無しさん:03/10/22 00:14
>>19 抵抗など入れないで、プログラムだけで1Vだけとか出力させることは無理でしょうか?
できるわけないじゃん。ちょっと考えればわかるだろうに。
フル稼働させればちょっと降圧するかも
23 :
デフォルトの名無しさん:03/10/22 02:34
PICを5Vで動作させて、PWM信号でモータを回転させたところ
デューティ100だと約5Vの電圧で回した時と同じ角速度
デューティ50だと約2.5Vの電圧で回した時と同じ角速度
で回転したのですが・・・
これを使って、約1Vに相当するPWM波形を出力させて使うというのは間違っているのでしょうか?
CW CCW って事は たぶんブリッジトランジスタをひっくり返してるんだろうから
中間の電圧というのに意味はないどころか、もし中間の電圧が出たらブリッジ貫通する可能性があるぞ
>>15 にあるように方向レジスタを使って、入力=プルアップ状態 ではダメなのか?
その時の電圧は0.6Vになると思うが?
25 :
デフォルトの名無しさん:03/10/22 12:48
26 :
デフォルトの名無しさん:03/10/22 16:08
16進数の値を1づつ増やしていくプログラムの書き方って、
for(i=0x001;i<=0x3FF;i++);
で合ってるのでしょうか?
>>26 pic の cコンパイラは知らないんだけど データバスは 8bitだから
それはあんまり良くないと思うけどね
28 :
デフォルトの名無しさん:03/10/22 17:13
>>27 しかし、PICでC言語を用いてデューティ比を設定する方法は16進数で定義するとコンパイラの説明書に書いてあり、
デューティ比を徐々に上げていく場合、26以外にどんな方法があるのでしょうか?
何かいい方法ありましたら、教えてください。
>>28 普通 PIC のようなプログラムは
main()
{
初期化処理
while(1){
wait( タイマー割込フラグ を待つ);
タイマー割込みフラグを消去する
・・・この間を繰り返す・・
}
}
と無限ループを作ります。
デューティをだんだんと上げたいなら 普通はカウンタを一つ用意して
ループ中で
cnt++; とカウンタを増やします。
8ビットCPUなので8bitのカウンタを使います。
無限にINCさせれば8bit毎に0に戻るのでノコギリ波状の出力が得られます。
31 :
デフォルトの名無しさん:03/10/30 14:15
>30
それは一般的なマイコンでの定石だろが。
PICの場合そんなことをしてたら、PICを使う意味は無い。
(個人、零細らラベルでは価格のメリット在りとの意見はある)
PICの場合は割り込みは原則使わない。(寝てるのを起こすのみ)
ループを廻りつつ、やるべきことがあるならやるし、無いならやらないという単純なプログラムとなる。
>>31 ?
>>30 は 割り込みフラグを見るだけで 割り込みを使ってないようだけど?
33 :
デフォルトの名無しさん:03/11/18 10:52
>>32 単にタイマルーチンが書いていないだけだろ。使う使わないは別にして。
>>33 違う。
タイマーのタイムアップを見るのに、
割込みをかけずに、割り込みフラグを見るのは普通に使う手法だ。
35 :
デフォルトの名無しさん:03/11/30 08:30
>>34 それじゃあ、タイムアップまでの時間が、待機ルーチンの内容で
変わっちゃうじゃないかよ。
36 :
デフォルトの名無しさん:03/11/30 08:42
>>28 数値を10進数で書くか16進数で書くかによってコンパイル結果が変わるの?
奇妙なコンパイラだこと。
37 :
デフォルトの名無しさん:03/12/03 21:26
1Vというのは平均1Vってことだよね。
>>1は説明不足。回路図だせ!
つーかアセンブラでやれ。
機能でPWMあるだろ。
38 :
デフォルトの名無しさん:04/01/15 12:43
PICの開発スタイルってやっぱ普通ICD2(アイス)つかうのか?
おれシュミレーターで全部やってたけど。
結論 PICは糞だった
40 :
デフォルトの名無しさん:04/01/15 14:03
>>39 > 結論 PICは糞だった
たとえば、どんな糞? いやどんなところが糞なの?ASMかい?
でPICに代わるのはなに?
というか、使いこなせなかったのかい?
41 :
デフォルトの名無しさん:04/01/15 14:07
PICは石は糞だが、環境はGOLD
Kは石はGOLDだが、環境が糞。
石が糞でも、ちゃんと売りさばくのが頭のいいマーケッティング。
日本のアフォー半導体屋もまなびなさい。
42 :
デフォルトの名無しさん:04/01/15 14:12
PICはシュミレーションしたいところはシュミレーションできないが、
シュミレーションしなくていいところはシュミレーションできるようになっている。
>>1なんてまだまだだな。
俺なんてプログラム以前に回路図も書けないぜ。
>>43 回路図から書いて下さいませんか?_| ̄|○ ダメポ…
45 :
デフォルトの名無しさん:04/02/24 18:40
PICはチップとしてよくできているが
AVRはCPUとしてよくできている
46 :
RAMほしい:04/06/08 12:36
HITECH-C でBANK1のRAMはどうやってアクセスしますか?
47 :
RAMほしい:04/06/09 06:25
誰もHITECH−Cは使わんのか?
バンク2とか3とかメモリーはあまってるのに、そのメモリーを
関数に渡そうとすると、コンパイラーがメモリー不足をつげる。
値段の割りに程度の低いコンパイラーだな。
48 :
RAMほしい:04/06/09 13:58
はーあ。マニュアル読むか。英語だし疲れるなー。
49 :
デフォルトの名無しさん:
MPASMのアセンブラ使ってるんだけど、HEXファイルが出来るときと出来ないときがあるのですが。
その他のファイルはいっつも出来るのに。
助けてヘルプミー。なにがいけないの?