PICプログラム教えてください。

このエントリーをはてなブックマークに追加
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
高専ロボコンか?大変だな。漏れは昨日負けてしまったよ。
12↑訂正:03/10/20 22:25
>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ってイベントドライブでしょう。
>>16 これは晒しageたほうがいいのかな?
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
>>24
今からちょっと試しにやってみます。
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以外にどんな方法があるのでしょうか?
何かいい方法ありましたら、教えてください。
工エエェェ(´Д`)ェェエエ工

制御系なら俺に聞いてもいいぞ(3)
http://pc2.2ch.net/test/read.cgi/tech/1059488975/

●PIC・AVR 初心者のためのスレッド-2サイクル目●
http://science.2ch.net/test/read.cgi/kikai/1040610345/

単発スレ立てんなヴォケ!
>>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(アイス)つかうのか?
おれシュミレーターで全部やってたけど。
39sage:04/01/15 12:58
結論 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は回路図出せよ
組んでやるから
>>1なんてまだまだだな。
俺なんてプログラム以前に回路図も書けないぜ。

>>43
回路図から書いて下さいませんか?_| ̄|○ ダメポ…
45デフォルトの名無しさん:04/02/24 18:40

PICはチップとしてよくできているが
AVRはCPUとしてよくできている

46RAMほしい:04/06/08 12:36
HITECH-C でBANK1のRAMはどうやってアクセスしますか?
47RAMほしい:04/06/09 06:25
誰もHITECH−Cは使わんのか?
 バンク2とか3とかメモリーはあまってるのに、そのメモリーを
関数に渡そうとすると、コンパイラーがメモリー不足をつげる。
値段の割りに程度の低いコンパイラーだな。
48RAMほしい:04/06/09 13:58
はーあ。マニュアル読むか。英語だし疲れるなー。
49デフォルトの名無しさん
MPASMのアセンブラ使ってるんだけど、HEXファイルが出来るときと出来ないときがあるのですが。
その他のファイルはいっつも出来るのに。
助けてヘルプミー。なにがいけないの?