質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

1回答

1378閲覧

PIC-BASICによるステッピングモーターの制御

insectbouncy

総合スコア0

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

0クリップ

投稿2021/06/28 05:01

PIC-BASICを用いたステッピングモーターの制御プログラムを作成しています。

プログラムで行いたいこと
スイッチ1を押すと、ステッピングモーターの回転方向が変わる。
スイッチ2を押すたびに、ステッピングモーターが、停止、3段階の回転速度の変化を行う

下記に自作したプログラムを掲示しています。このプログラムでは、動かないとのことでした。
しかし、改善すべき点がわかっていないため、ご指摘いただきたいです。

↓自作したプログラム
define OSC 40
Define ADC_BITS 10
Define ADC_CLOCK 3
Define ADC_SAMPLEUS 50

COUNTER    VAR byte
PUSHCOUNTER1 VAR byte
PUSHCOUNTER2 VAR byte
LEDNum    VAR byte
SwFlag1    VAR byte
SwFlag2    VAR byte
Motor     VAR byte(4)
'エイリアスの定義
LED1 var PORTA.2
LED2 var PORTA.3
LED3 var PORTA.4
LED4 var PORTA.5
SW1 var PORTC.3
SW2 var PORTC.4
'定数の定義
LEDON con 0
LEDOFF con 1
SwON con 0
SwOFF con 1
'A/Dコンバータの機能等の設定
ADCON0 = %00000001
ADCON1 = %00001101 ' LowRef=Vss,HighRef=Vdd, AN0-1,D2-8
ADCON2 = %10010011 ' Shift result to righ, INT RC clock
'入出力ピンの設定
TRISA = %10000011 ' AN0-1=in, D2-6=out , OSC1=out, OSC2=in
TRISB = %00000000 ' PORTBのピン全てを出力に設定
TRISC = %11011000 'RC0,1,2,5ピンを出力設定,その他のPORTCピンは入力
'ポートの初期設定
PortC.0 = 0 '7SEG LED OFF
PortC.5 = 0
PortB = $00 'PortBに16進00を出力
LED1 = LEDOFF
LED2 = LEDOFF
LED3 = LEDOFF
LED4 = LEDOFF
SW1 = SwOFF
SW2 = SwOFF
'励磁パターンの定義
Motor(0) = $01
Motor(1) = $02
Motor(2) = $04
Motor(3) = $08
Motor(4) = $00

COUNTER = 0
PUSHCOUNTER1 = 0
PUSHCOUNTER2 = 0
LEDNum = 0
SWFlag1 = 1
SWFlag2 = 3
'100msウェイト
Pause 100 ' Wait .1 second

Main:

COUNTER = COUNTER + 1
if COUNTER > 255 then COUNTER = 0
LEDNum = COUNTER // 4 'LEDNum=0,1,2,3の値を取る。

if SW1 = 0 then pause 100
if SW1 = 0 then
PUSHCOUNTER1 = PUSHCOUNTER1 + 1
endif
if PUSHCOUNTER1 > 255 then PUSHCOUNTER1 = 0
SWFlag1 = PUSHCOUNTER1 // 2

select case SWFlag1
case 0
PortB = Motor(LEDNum)
pauseus 15000
case 1S
PortB = Motor(3 - LEDNum)
pauseus 15000
end select

if SW2 = 0 then pause 100
if SW2 = 0 then
PUSHCOUNTER2 = PUSHCOUNTER2 +1
endif
if PUSHCOUNTER2 > 255 then PUSHCOUNTER2 = 0
SWFlag2 = PUSHCOUNTER2 // 4

select case SWFlag2
case 0
PortB = Motor(4)
case 1
pauseus 10000
case 2
pauseus 30000
case 3
pauseus 50000
end select
goto main
end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

thkana

2021/06/28 11:36 編集

> 動かないとのことでした。 自分でやってるわけじゃないのですか? プログラムで固定であれば、ステッピングモーターを正転または逆転させることはできるのですか? (それができていないなら「先にやることがあるでしょう」という話ですが) たぶん、この手の言語だとインデントが付くのではないでしょうか。読みにくいので、マークダウン記法でインデントつけていただけませんか? ( https://teratail.com/help/question-tips#questionTips3-5-1 等を参考に) 質問は編集出来ます。
guest

回答1

0

PICBASICを使っている人ってかなり珍しいんじゃない?
何となくレスが付かなそうなので書いておきます。

私自身、PICBASICはおろか、BASICも使わないのですけど、一通り見ると
この言語仕様の理解と、ハード的な理解が足りていないと感じました。
(と言っても、私自身、PBPのマニュアルが落ちていたのでさっと確認しただけです)

例えば、
・全角スペースがある←なので全く動かないと思う
・無駄な変数が多い。COUNTERとLEDNum、PUSHCOUNTER1とSWFlag1とか。
・SW処理が甘い(0.1秒のウェイトがあるだけ。これでは複数押しになってしまいそう)
・コード的にはユニポーラの1相励磁みたいだけど、本当にユニポーラステッピングモータですか?
また、1相励磁はほとんど実用されません。普通は2相励磁で回します。
バイポーラステッパーなら回し方(励磁の仕方)が違います。
それは兎も角、動かす際(正転⇔反転時も含めて)必ず隣の励磁状態にしなくてはいけません。
※Motor(3 - LEDNum)では出来ていません。
・速度は3段階ではあるが、ステップを入れた後にpauseus 15000があり、更に最後にSWFlag2に応じたディレイがある。
2重にディレイを取る意味が無い。更に言えば、速度はかなり遅いけど、これは想定している速度なのか?
(普通の200steps/Rのステッパーなら約5~13秒/周)
・SWFlag1をみて、ステッパーを動かして、それから、SWFlag2が0(停止)の時は1瞬、無励磁(Motor(4))にしたりと
全体の動作を理解して組んでいない。
※停止ならそもそも励磁状態(COUNTER&LEDNumあたりの変数)自体を動かしたら駄目。

凡そ、↓のような感じで回ると思います。
(ステッパーを回す、という部分のみです。PICの初期設定等は見ていません。型番もわからないですから)
上で述べたようにこの言語は使っていませんからミスはあると思ってください。

PBP

1 2'前略 3sw1State VAR byte 4sw2State VAR byte 5 6Main: 7 8sw1State=((sw1State<<1)+SW1)//4 '2回分を記録 9if sw1State=2 then 10 SWFlag1=1-SWFlag1 'SW1を押した瞬間ならフラグをトグル 11 pause 50 '反転なので、ちょっと待った方が賢明 12endif 13 14sw2State=((sw2State<<1)+SW2)//4 15if sw2State=2 then SWFlag2=(SWFlag2+1)//4 16 17 18if SWFlag2=0 then Delay '停止なら回さずにDelayへジャンプ 19 20if SWFlag1=0 then 21 LEDNum=LEDNum+1 '正転 22else 23 LEDNum=LEDNum+3 '逆転 24endif 25LEDNum=LEDNum//4 26PortB = Motor(LEDNum) 27 28Delay: 29select case SWFlag2 30case 0 31pause 10 32case 1 33pauseus 10000 34case 2 35pauseus 30000 36case 3 37pauseus 50000 38end select 39 40goto main 41end 42

投稿2021/06/30 12:49

nac_tnk

総合スコア463

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問