FC2BBS 50588

誹謗、中傷、虚偽情報や商用目的・宣伝目的等の利用と判断した場合は削除する事があります。


PICでのL6470制御について

1:yangmin :

2021/07/14 (Wed) 23:43:44

こんばんは。
初心者なので以前より色々と記事を参考にさせていただいており大変感謝しております。
今回"ステッピングモータドライバ(L6470)を動作させて見ます"
http://zattouka.net/GarageHouse/micon/Motor/L6470.htm
の記事を拝見し伺いたいことがありまして投稿させていただきました。

公開していただいているプログラムソースを使用して、L6470やPIC18Fのデータシートや秋月やストロベリーリナックスのPDF資料などを紐解きながら、もうかれこれ2ヶ月以上毎週末に試行錯誤を続けていましたが思ったように制御出来ず悪戦苦闘しております。

最近になりmotor41.cやmotor42.cのプログラムソース内の
以下の"5秒後に開始"というのを6秒程度にしたところ制御出来ているような気がします。
Wait(500) ; // 5秒後に開始
// SPI(MSSP1)の初期化を行う、通信速度は4MHz
SPI_Init(SPI_MODE3,SPI_CLOCK_DIV16,0) ;
// ステッピングモータドライバの初期化を行う
ans = L6470_Init() ;

それまでは理由も分からず、トータルで5秒以上あれば良いのかな?とウェイトを3秒にして、その後PICの動作確認用にLED点滅(点灯・消灯)を0.5秒おきに3回(計6回で3秒)の命令を挟んでいたりしましたが、これも上手く動かない原因の1つのような気がします。
この5秒待つというのはどういった役目を成しているものなのでしょうか?
教えていただけると助かります。
2:きむしげ :

2021/07/15 (Thu) 10:25:06

yangminさん、おはようございます。

ごめんなさい、思い出せません。m(_ _)m

L6470のデータシートの一部を翻訳してみましたのサイトで、
http://spinelify.blog.fc2.com/blog-entry-79.html
6.1 Device power-up
電源投入時には以下の条件が満たされるまで、
デバイスがリセット状態になります。
と言うのが関係しているかもです。
電源投入時に十分な電圧・電流が必要なのかも?
3:yangmin :

2021/07/15 (Thu) 14:17:15

早速の回答をありがとうございます。
たくさんの情報を公開してくれていらっしゃいますし、おそらくずいぶんと前の記事でしょうから、こちらこそ今になってのお問い合わせで申し訳ありません。
やはり電源投入後、十分な電圧や電流が必要な可能性がありそう…ということですね。
ご回答いただき感謝いたします。
ありがとうございました。
4:yangmin :

2021/07/18 (Sun) 19:50:57

度々のお問い合わせで申し訳ありません。

・モーターの動作について
"motor41.c"のRun命令なのですが、
この記述を続けて2回記載すると、ほぼ確実に動くことを発見しました。
なぜ2回記載しないと動かないのか?原因について思い当たるようなことがありましたら、アドバイスをいただけましたら幸いです。
もしかしたらSPIの通信速度が関係しているのでしょうか?
--
// 約750step/sの速度で正転回転させる
L6470_Run(Forward,50000) ;
--
これを以下のように連続して記載するとなぜか動きます。
L6470_Run(Forward,50000) ;
L6470_Run(Forward,50000) ;


・動作周波数について(一部思い違いがあったため訂正しました)
ご紹介いただいているページに「今回のPIC18F26K22のCPUクロックは64MHzで動作させています。」との記載があるのですが、
当方もPIC18F26K22を使用しておりますが、動作周波数とSPI通信速度の関係は"motor41.c"ソース内62行目以下の記述のところで良かったでしょうか?
ソースは以下のような状態になっていましが、
--
// SPI(MSSP1)の初期化を行う、通信速度は4MHz
SPI_Init(SPI_MODE3,SPI_CLOCK_DIV16,0) ;
--
この"SPI_CLOCK_DIV16"の状態ですと64MHz/16で4MHzで通信を行っているということになるのかと思いますが、
上述の2回続けて記述すると動作するというような場合、例えばFosc/64に変更し64MHz/64=1MHzとして通信速度を遅くしてみると改善される可能性があるというような考え方で良いのでしょうか?


・モーターのステップモードの変更について
ステップモードの指定は"skL6470.c"ファイルで指定するのだと思うのですが、
このソース内93行目の"val = step_mode.DT ;"の記載を"val = STEP_SEL ;"に変更して、
91行目の"step_mode.STEP_SEL = FULL_STEP ;"のFULL_STEPの記載を"skL6470.h"の定数の定義に記載されているHALF_STEPやMICROSTEP8に書き換えることでステップモードを変更できるという考え方で良かったでしょうか?

複数案件のお問い合わせとなりまして申し訳ありませんが、
お力添えいただけましたら助かります。
5:きむしげ :

2021/07/19 (Mon) 16:12:43

・モーターの動作
 当時のL6470実験時の回路が出てきました、PIC周りの回路だけ追加すれば動作する様なのでぇ動かしてみました。
結果、Wait(500) ;でも200でも関係なく動作します。
思うにL6470_Run()前でアラームが発生しているかもですね?
ans = L6470_Init() ;
の"ans"値はいくらですかねぇ、正常値は"7C03"ならOKだと思います。
68行にブレークポイントを置いて、デバッグモードで起動し、
停止したら65行の"ans"値を見る事が出来ます。
http://zattouka.net/GarageHouse/micon/MPLABX/Debug1.htm
”MPLAB XとPICKit3でPICをデバッグしてみる”を見ましょう。
でぇ、L6470_Run()を2回したらそのアラーム内容がクリアされるのかも??

・動作周波数について
 L6470のSPI動作速度はMAX5MHzなのでそれ以下でも動作するでしょうが
改善とかの話ならそれは意味ないでしょうたぶん

・モーターのステップモードの変更について
 motor42.cの所に書いて有る様に
”skL6470.c ”の”L6470_Init ”関数で
step_mode.STEP_SEL = FULL_STEP ; // フルステップに設定---91行
が記述されているので、書き換えるだけです。
とあります、もし、1/128マイクロステップモードにするなら
step_mode.STEP_SEL = MICROSTEP128 ;
です。他はいじらないで下さい。
6:yangmin :

2021/07/22 (Thu) 19:20:58

度々の素人質問にまたご回答いただきましてありがとうございました!
当時の回路もまだお持ちでわざわざ試していただいたとのこと、大変ありがとうございます!

通信速度は直接動作命令に関係ないのですね。
作業が出来る週末になり、早速教えていただいた方法でブレークポイントを置いてmotor41.cを試してみました。

ちなみに使っているモーター用電源は12V、モーターは17PM-K044-AKZ(https://akizukidenshi.com/catalog/g/gP-06578/
コイル抵抗5.6Ω 定格電流0.9A(このことから動作電圧は5Vと判断)を使っておりまして、
"停止時よりも回転時の方が電流が流れにくくなるので HOLD<ACC<RUNとした方が脱調しにくい"との情報を見掛け、
更にテスト中は低い設定のKVAL_HOLD、KVAL_RUN、KVAL_ACC、KVAL_DECでも動いたため、
現在はKVAL_HOLD(0x01)<KVAL_RUN(0x12)<(KVAL_ACC、KVAL_DEC)0x10としておりますが、
その結果をVariablesウインドウで見たところ、
L6470_Initのans値は以下のようになっていました。
※モーターの定格電圧に近い4.9608V(0x6A)や4.68V(0x64)などの値にしても結果に変わりはありませんでした。


きむしげ様のご回答(正常値)
アドレス:0x34
Value:0x7C03
111 1100 0000 0011

そのままコピペしたプログラム使用時
アドレス:0x34
Value:0x7D03
111 1101 0000 0011
※UVLO[9]
 UVLOフラグは電源投入時及びリセット時に強制的にLOWになります。
 モータ電源電圧がVsthoff電圧を下回ると、LOWになります。

自分が動作確認のためにPICのRA0-RA0を出力に設定してLED点滅などを追加したプログラム使用時
アドレス:0x34
Value:0x7C83になったり0x7D03になったりでした
111 1100 1000 0011
※WRONG_CMD[8]
 “1”で有れば、指示したコマンドは全く存在しない。

なぜ同じPIC同じ回路なのに自分は0x7D03や0x7C83になってしまうのか…。
7:きむしげ :

2021/07/23 (Fri) 09:22:27


ans値見ると、どうもぉモータ起動実行が失敗している様ですね。

SM-42BYG011(私の実験モータ)
https://akizukidenshi.com/catalog/g/gP-05372/
(17PM-K044-AKZ)
https://akizukidenshi.com/catalog/g/gP-06578/

モータの結線する線の色が異なっていますがぁ...
それを考慮して配線は出来ていますよね。
もう一度確かめて下さい。
8:yangmin :

2021/07/23 (Fri) 15:11:41

きむしげ様
ご丁寧に何度もありがとうございます!

モーター起動実行に失敗ですかぁ…。
モーター配線の色は何度か確認しているんですが、念のため再度確認しましたが間違いありませんでした。
使っているモーターの定格は5V 0.9A/相となると思うので過電流のTHは
L6470_OCD_TH 0x02(1125mA)
ストール電流のTHは
L6470_STALL_TH 0x0F(500mA)
程度にしているのですが、同じモーターで実験する必要がありますかねぇ。
調達しに行けそうなら明日にでも行ってみようかと思います。
9:きむ :

2021/07/25 (Sun) 09:40:27

おはようございます!

データシートを見ていたら、
VS Motor supply voltage VSA=VSB=VS 8-45V
となっていますがぁ、

5Vで行っているのでしたら少ないのでは?
10:yangmin :

2021/07/25 (Sun) 19:57:27

きむしげ様
データシートも見ていただきましてありがとうございます。
モーターは買いに行けませんでした…。

仰る通りモーター電源は 8-45V必要なようなんですが、
ストロベリーリナックスのページに
"このモジュールのモーター電源は8V~45Vが必要です。L6470がサポートする電圧です。8V以下はL6470のローボルテージロックアウトが働くので動作しません。モータ電源には必ず8V以上必要です。
モーターはこの範囲のものが使えますが4V,3V以下のものでもパワーのコントロールができますので使用可能です。
このパワー設定は停止時、回転時、加速時、減速時のそれぞれに設定ができますから、停止時は省エネのためにパワーを落とす、加速・減速時は脱調しないようにパワーを大きくするといったきめ細やかな設定ができます。"
という記述があり、
元々デフォルトのRUN/ACC/DECの値も0x29=(41)x0.0039*12V=1.9188V(12V電源の場合)0x29=(41)x0.0039*24V=3.8376V(24V電源の場合)なので、
12V電源を使っての定格5Vのモーター制御が可能だと思っておりました。
https://strawberry-linux.com/support.php/12023/1471031


北の国からの…様のページのコメント回答に
"L6470はモータ用電源が7.2Vを下回ると、L6470の保護機能?でモータが動かなくなります。=UVLO(詳細は L6470仕様書の VsthOFF、VsthON、UVLO(アンダーボルテージロックアウト機能?)の項目を参照してください。)
私の勝手な解釈になりますが、
モータが回転始めようとしたその際に、初動電流によって、電源電圧が12Vから7.2V以下まで瞬間的に電圧降下してしまい、
それをL6470が検知して、保護ロックが働いているのだと思います。
(電圧降下のイメージとしては、家庭の電子レンジを動かした瞬間に、蛍光灯が一瞬暗くなるのを想像してもらえれば分かるかと思います。)
解決方法は 
・電源電圧を上げる。(電圧降下しても7.2Vを下回らない電圧まで上げとく 大概14~15Vあれば大丈夫だったと思います。)
・電源の種類を変える(電圧降下しにくい電源にする。スイッチング電源→直流安定化電源装置やバッテリーなど)
・L6470の電源端子近くにコンデンサを挟む。(電圧降下を緩和する。)
のどれかです。
私は12V1Aのスイッチング電源を使用していた際に発生していた記憶があります。その際は、コンデンサで解決したような記憶があります。"
という記述を見付けたので、今まで24Vスイッチング電源アダプタを介して自作の3V~12V用可変スイッチング式電源装置から12Vを供給していたものを、24Vスイッチング電源アダプタ直接供給にしたり100μFのコンデンサを220μFにしたりしてみたのですが、ansの値は0x7C03になったり、0x7C83になったり、0x00000000となったりと動きが不安定なままの状況は変わりませんでした。
http://spinelify.blog.fc2.com/?m2=res&no=66&sp=1&page=1
https://strawberry-linux.com/support.php/12023/1485524
11:yangmin :

2021/09/21 (Tue) 00:27:49

きむしげ様
プログラムのバージョンアップをありがとうございました。
バージョンアップしていただいたプログラムも利用させていただき、あれからもずっと続きに取り組んでおります。
ステッピングモーターも同じ物を調達し、新しく公開していただいた"motor43.c"や"skL6470.h"や"skL6470.c"でのアラーム発生を試してみたく、ソースを全くいじらずそのままの状態で書き込んみましたが、やはりansの値が正常値の"0x7C03"にならず"0x7D03"や"0X00000000"となることが多いです。
プログラムが全く同じなのに動かないということはハード構成に問題があるとしか思えないのですが、チャージポンプ用のダイオードも紹介していただいている物を買って使用しておりますし、コンデンサや配線なども何回も見直しましたが実装図の通りに配置出来ていると思います。
モーター用電源は自作の3V-13V可変スイッチ電源を12Vで使用しておりましたが、12Vの市販の電源アダプタ(これもおそらくスイッチングだと思いますが)に変更してみたりもしましたが改善が見込めず、何が原因で動作不良なのか分かりません。

また"motor43.c"ソース内のアラーム発生状況用であるLED点灯命令"LATC0 = 1 ; // LED ON"や"LATC0 = 0 ; // LED OFF"ですがLEDが点灯(消灯)しません。
以前"motor41.c"に自分なりに追加していた動作確認用LEDの"PORTAbits.RA3 = 1;"や"PORTAbits.RA3 = 0;"などでの点灯(消灯)は出来ていたので、"PORTCbits.RC0 = 1;"や"PORTCbits.RC0 = 0;"へと変更してみましたがそれでもLEDは点灯(消灯)しませんでした。ちなみに接続はピン側がアノードでGND側がカソードにしています。

度々で申し訳ありませんが、なにかご助言をいただけましたら大変ありがたいです。

  • 名前: E-mail(省略可):

Copyright © 1999- FC2, inc All Rights Reserved.