トップページ⇒tech
49コメント16KB

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
PIC18F452というPICを使って、モータの制御をしようとしているのですが、

なんせC言語のプログラムが初心者なもので。

PWM信号でモータを制御しようとしていて、正逆回転がうまくいかないのです。

モータの回転方向切り替えはCW回転(オープンコレクタ)、CCW回転(0〜0.8V)となっている

のですが、どうプログラムしたらよいのでしょう?

ちなみに、ポートCからPWM信号を出力させてモータの速度を制御し、

ポートDからの信号でモータの正逆回転を制御したいのです。

どなたかご指導よろしくお願いします。
0002デフォルトの名無しさんNGNG
機械工学板の方がいいんじゃねーの?
0003デフォルトの名無しさんNGNG
見にくいからまずその一行空ける書き方をどうにかしろ。
0004デフォルトの名無しさんNGNG
ついでに改行入れる位置の不自然さをどうにかしろ。
0005デフォルトの名無しさんNGNG
>モータの回転方向切り替えはCW回転(オープンコレクタ)、CCW回転(0〜0.8V)となっている


オープンコレクタ時の電圧は? プルアップされているなら、その抵抗がつながってる反対かわの電圧を見てみて
PICの電源と同じなら、単純に HでCW LでCCWだ。

PICの電源より低いなら、入力端子にすればCW 出力端子にしてLを出力すればCCWだ

PICの電源より高いなら、2SCタイプのトランジスタを取り付ける必要がある。
0006デフォルトの名無しさんNGNG
>PICの電源と同じなら、単純に HでCW LでCCWだ。

これはつまり、

  output_high(PIN_D0);

でCW

  output_low(PIN_D0);

でCCW

ということになるのでしょうか?

※
ポートDのPIN_D0からの信号で正逆回転させる場合。
0007デフォルトの名無しさんNGNG
見にくいからまずその一行空ける書き方をどうにかしろ。
0008デフォルトの名無しさんNGNG
>>6
回路図を見ていないから、それでOKとは言ってあげられない。
心配なら、常に出力はLを出しておいて、方向レジスタで切り替えたら?
0009デフォルトの名無しさんNGNG
>>8
えと既に出来上がったキットを用いてやろうとしているので・・・


では、PICを5V、0.5Aで動作させているのですが、
PICのポートDのPIN_D0から1V出力させるためには

   output_high(PIN_D0);

を使えばいいのですかね?
やってみてオシロで出力を見てみたのですが、出力が確認できませんでした。
0010デフォルトの名無しさんNGNG
アク禁から解放、やっと書けた!
>>1
PICにはトライステートバッファ(Tristate=on,off,z=∞=切断=ハイインピーダンス)というのがあって、

 ここをON,OFF
   .|
 |\|
-|  >ー
 |/
これが逆方向にも並列に付いていて入出力方向設定できる。
自分はアセンブラでしか書いたことないのだが、Cにもないかな。
アセンブラコードだと
TRIS PORT 0/1 (PORTはA,Bの入出力ポートでPINごとでなく、レジスタまとめて入出力方向指定。0=出力、1=入力)
これやらないと、入力側と出力側が切れていて(ハイインピーダンス)で入力も受け付けないし、出力もでない。
0011デフォルトの名無しさんNGNG
>1
高専ロボコンか?大変だな。漏れは昨日負けてしまったよ。
0012↑訂正NGNG
>PICにはトライステートバッファ(Tristate=on,off,z=∞=切断=ハイインピーダンス)というのがあって、

これを訂正して
>PICには入出力ポートに
       ~~~~~~~~~~~~~
トライステートバッファ(Tristate=on,off,z=∞=切断=ハイインピーダンス)というのがあって、
0013↑ごめんまたまた訂正NGNG
>TRIS PORT 0/1 (PORTはA,Bの入出力ポートでPINごとでなく、レジスタまとめて入出力方向指定。0=出力、1=入力)

と書いたけれど、PINごとでも設定できる。
その場合は、TRISAだのTRISBだのいうレジスタがあるでしょう。
そのレジスタの8bitがそれぞれ、A,BそれぞれのPORTの8PINの入出力方向設定に対応してる。
だから、そのレジスタに各PINのon,offを考えて8bitまとめて値を入れてやれば良い。
0014↑ごめんまたまた訂正ver.2NGNG
>各PINのon,offを考えて
     ↓
各PINの入出力方向を考えて

スマソ。
0015デフォルトの名無しさんNGNG
>11
高専ロボコンではないです^^;

>10
入出力方向の設定はできて、ちゃんと機能することはできたのですが、
出力に設定されたPINから1Vとか、0Vを出力させることができないのです^^;
0016デフォルトの名無しさんNGNG
>>15
Cの場合にはループでくくってやらなくても大丈夫なの?
何を言いたいかっていうと、一瞬しか出力が出てないんじゃないかと。。。
アセンブラはインタプリタ的だけど、Cってイベントドライブでしょう。
0017デフォルトの名無しさんNGNG
>>16 これは晒しageたほうがいいのかな?
0018デフォルトの名無しさんNGNG
>>16
ループでくくってますよ〜
PWM信号はきちんと出力されてるから、同様にしてやれば、ちゃんと出るのかと思ったのですが・・
どうもうまくいかないみたいで・・
0019デフォルトの名無しさんNGNG
>>15
電源5Vなのに1V? って事は相手はトランジスタだね?
ならば、PICの出力端子に2.2K〜5.1Kの抵抗を入れなさいな。
0020デフォルトの名無しさんNGNG
>>19
抵抗など入れないで、プログラムだけで1Vだけとか出力させることは無理でしょうか?
0021デフォルトの名無しさんNGNG
できるわけないじゃん。ちょっと考えればわかるだろうに。
0022デフォルトの名無しさんNGNG
フル稼働させればちょっと降圧するかも
0023デフォルトの名無しさんNGNG
PICを5Vで動作させて、PWM信号でモータを回転させたところ
デューティ100だと約5Vの電圧で回した時と同じ角速度
デューティ50だと約2.5Vの電圧で回した時と同じ角速度
で回転したのですが・・・

これを使って、約1Vに相当するPWM波形を出力させて使うというのは間違っているのでしょうか?
0024デフォルトの名無しさんNGNG
CW CCW って事は たぶんブリッジトランジスタをひっくり返してるんだろうから
中間の電圧というのに意味はないどころか、もし中間の電圧が出たらブリッジ貫通する可能性があるぞ

>>15 にあるように方向レジスタを使って、入力=プルアップ状態 ではダメなのか?
その時の電圧は0.6Vになると思うが?
0025デフォルトの名無しさんNGNG
>>24
今からちょっと試しにやってみます。
0026デフォルトの名無しさんNGNG
16進数の値を1づつ増やしていくプログラムの書き方って、

for(i=0x001;i<=0x3FF;i++);

で合ってるのでしょうか?
0027デフォルトの名無しさんNGNG
>>26
pic の cコンパイラは知らないんだけど データバスは 8bitだから
それはあんまり良くないと思うけどね
0028デフォルトの名無しさんNGNG
>>27
しかし、PICでC言語を用いてデューティ比を設定する方法は16進数で定義するとコンパイラの説明書に書いてあり、
デューティ比を徐々に上げていく場合、26以外にどんな方法があるのでしょうか?
何かいい方法ありましたら、教えてください。
0029デフォルトの名無しさんNGNG
工エエェェ(´Д`)ェェエエ工

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

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

単発スレ立てんなヴォケ!
0030デフォルトの名無しさんNGNG
>>28
普通 PIC のようなプログラムは
main()
{
 初期化処理
  while(1){
  wait( タイマー割込フラグ を待つ);
タイマー割込みフラグを消去する

  ・・・この間を繰り返す・・

 }
}

と無限ループを作ります。

デューティをだんだんと上げたいなら 普通はカウンタを一つ用意して
ループ中で
cnt++; とカウンタを増やします。

8ビットCPUなので8bitのカウンタを使います。 

無限にINCさせれば8bit毎に0に戻るのでノコギリ波状の出力が得られます。



0031デフォルトの名無しさんNGNG
>30
それは一般的なマイコンでの定石だろが。
PICの場合そんなことをしてたら、PICを使う意味は無い。
(個人、零細らラベルでは価格のメリット在りとの意見はある)

PICの場合は割り込みは原則使わない。(寝てるのを起こすのみ)
ループを廻りつつ、やるべきことがあるならやるし、無いならやらないという単純なプログラムとなる。
0032デフォルトの名無しさんNGNG
>>31
? >>30 は 割り込みフラグを見るだけで 割り込みを使ってないようだけど?
0033デフォルトの名無しさんNGNG
>>32
単にタイマルーチンが書いていないだけだろ。使う使わないは別にして。
0034デフォルトの名無しさんNGNG
>>33
違う。
タイマーのタイムアップを見るのに、
割込みをかけずに、割り込みフラグを見るのは普通に使う手法だ。
0035デフォルトの名無しさんNGNG
>>34
それじゃあ、タイムアップまでの時間が、待機ルーチンの内容で
変わっちゃうじゃないかよ。
0036デフォルトの名無しさんNGNG
>>28
数値を10進数で書くか16進数で書くかによってコンパイル結果が変わるの?
奇妙なコンパイラだこと。
0037デフォルトの名無しさんNGNG
1Vというのは平均1Vってことだよね。
>>1は説明不足。回路図だせ!
つーかアセンブラでやれ。
機能でPWMあるだろ。
0038デフォルトの名無しさんNGNG
 PICの開発スタイルってやっぱ普通ICD2(アイス)つかうのか?
おれシュミレーターで全部やってたけど。
0039sageNGNG
結論 PICは糞だった
0040デフォルトの名無しさんNGNG
>>39
> 結論 PICは糞だった

 たとえば、どんな糞? いやどんなところが糞なの?ASMかい?
 でPICに代わるのはなに?
というか、使いこなせなかったのかい?
0041デフォルトの名無しさんNGNG
PICは石は糞だが、環境はGOLD
Kは石はGOLDだが、環境が糞。

 石が糞でも、ちゃんと売りさばくのが頭のいいマーケッティング。
日本のアフォー半導体屋もまなびなさい。
0042デフォルトの名無しさんNGNG
PICはシュミレーションしたいところはシュミレーションできないが、
シュミレーションしなくていいところはシュミレーションできるようになっている。

0043デフォルトの名無しさんNGNG
てか>>1は回路図出せよ
組んでやるから
0044デフォルトの名無しさんNGNG
>>1なんてまだまだだな。
俺なんてプログラム以前に回路図も書けないぜ。

>>43
回路図から書いて下さいませんか?_| ̄|○ ダメポ…
0045デフォルトの名無しさんNGNG

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

0046RAMほしいNGNG
HITECH-C でBANK1のRAMはどうやってアクセスしますか?
0047RAMほしいNGNG
誰もHITECH−Cは使わんのか?
 バンク2とか3とかメモリーはあまってるのに、そのメモリーを
関数に渡そうとすると、コンパイラーがメモリー不足をつげる。
値段の割りに程度の低いコンパイラーだな。
0048RAMほしいNGNG
はーあ。マニュアル読むか。英語だし疲れるなー。
0049デフォルトの名無しさんNGNG
MPASMのアセンブラ使ってるんだけど、HEXファイルが出来るときと出来ないときがあるのですが。
その他のファイルはいっつも出来るのに。
助けてヘルプミー。なにがいけないの?
■ このスレッドは過去ログ倉庫に格納されています