I2Cセンサーの種類 |
ステッピングモーターコントローラ |
|
主な機能 |
1chの4相ユニポーラ・ステッピングモータコントローラ (ドライバーは除く) レジスタにパラメータを与えれば、後は勝手に台形制御をします。 |
|
I2Cデバイス名 |
PCA9629APW |
|
写真
|
||
開発したデバイスの入手先 製品名 品番・型番 |
スイッチサイエンス PCA9629APW ステッピングモータードライバ ピッチ変換済みモジュール (SSCI-023740) |
|
デバイスのData-Sheet
パラメータを求めるEXCEL |
http://www.nxp.com/documents/data_sheet/PCA9629A.pdf (日本語訳のPCA9629のData-sheetとは仕様が異なりますので注意して下さい) http://sa.nxp-lpc.com/docs/pca9629_ramp_up_and_down_v1_3_1r.zip |
|
デバイスの主な仕様
|
電源電圧 I2Cアドレス
相駆動方式 ステップレート ステップカウンタ I2C通信速度 |
4.5V~5.5V (3.3Vでは使えません、レベルシフターが必要です) 0X40~0X5EAD0、AD1のPinをVDD,VSS,SDA,SCLの接続先で選択。16通り可能。 1相、2相、1-2相励磁の選択可能 333.3Kpps~0.3pps 32bit 1Mbps |
説明 |
I2Cデバイスならではのデバイスです。初速、加減速度、トップスピード、総パルス数等 のパラメータをレジスタに書き込み、動け!と指示すると、その設定に合った台形駆動でパルを生成して出力します。 従来は、CPUで台形パターンを計算して常時GPIO出力で制御していた処理が、このデバイスはパラメータを与えると自分で計算してパルスを発生する為、CPU負荷が非常に少なくてステッピングモーターを駆動できます。
また、GPIO端子でCW、CCWのリミットスイッチ入力も可能で原点復帰等もワンチップで可能なので、ボールネジ等のリニアアクチェータ等の制御はこのチップ単品で可能です。 スッテピングモーターも25mA以下の超小型であれば直接駆動可能で、マイクロアクチェータ等にも利用可能です。
しかし、設定するレジスタの数が多く、希望する動作をさせる為には、電卓を叩きながら 計算を行い、レジスタ値を決定しなければ成りません。 NXPのページには、各パラメータを自動計算するExcelが提供されています。 I2Cセンサー・ドライバーでは台形制御のパラメータ自動計算は行いませんので、Excelで 求めた値をプロパティに設定して下さい。
総ステップ数の設定は32bitです32bitデータを8bitへ分割書込み等の処理を行わなければなりませんが、I2Cセンサードライバーでは32bitや16bitデータへの合算/分割はドライバー内部で処理しますのでレジスタ分割等をきにせず、プロパティへ10進数での設定で実現できます。
通常のレジスタの読み書きは、register |
|
他に準備した方が良い物 |
電源
ドライバー
ロジックレベル変換 |
・ステッピングモータ駆動用電源(モーターの電圧、電流に合わせて下さい) ・ロジック電源 5.0V(PCA9629A用の電源) 今回は、ドライバーに5V生成回路が有ったので流用してます。
4相ユニポーラ用のステッピングモータードライバー 使用するモーターの電圧、電流に合わせて下さい。 PCA9629Aは5V/20mAまで駆動できます。この入力でモーター駆動が可能なドライバーでなければ成りません。
Raspberry Piとの接続で3.3v、5vを双方向で変換する物です。 スイッチサイエンスに色々な種類が有ります。 今回はPCA9600Dを用いましたが、他には以下の製品が有ります ・PCA9517ADP ・PCA9306搭載 I2C用ロジックレベル変換ボード ・NTB0104 レベルシフタ ピッチ変換済みモジュール ・TXS0108E レベルシフタ ピッチ変換済みモジュール ・TXS0108E レベルシフタ ピッチ変換済みモジュール ・BSS138搭載4CH-I2C用双方向ロジックレベルコンバータ ・PCA9600D 高ドライブ電流I2Cバスバッファ基板 各々Data-Sheet等を入手の上、正確に接続して下さい。誤って接続すると壊れます |
|
|
|
開発・テスト風景
写真の左からスッテッピングモーター、ドライバー、PCA9629A、PCA9600D、Raspberry PiRaspberry
|
I2Cデバイス内部のレジスタ構成(レジスタに対する設定値、レジスタの内容等のご質問はお答えできません)
Mode register |
Number of steps |
Mode register |
Number of steps |
Watchdog time-out |
Number of steps |
Watchdog control |
Number of steps |
I/O Configuration |
Step pulse width |
Interrupt mode register |
Step pulse width |
Mask interrupt register |
Step pulse width |
Interrupt status |
Step pulse width for CCW rotation |
Input port register |
Motor start/stop |
Interrupt motor action |
Step pulse width |
Count value for extra |
Step pulse width for CCW rotation |
Count value for extra |
Motor start/stop |
Output port |
2C-bus subaddress 1 |
Output port |
I2C-bus |
Ramp up control register |
I2C-bus |
Ramp down control register |
All Call I2C-bus |
Perform multiple |
Step counter |
Loop delay time |
Step counter |
Loop delay time |
Step counter |
|
Step counter |
I2Cセンサー・ドライバーで準備済みのプロパティ・メソッド
プロパティ
機能名 |
機能説明 |
MODE |
Mode |
WDTOI |
WDCNTL |
WDMOD |
WDCNTL[0:0] ウォッチドッグ割り込みとモータ停止モード。 |
WDEN |
IO_CFG[7:4] |
P0_CFG |
IO_CFG[0:0] P0入出力設定 |
P1_CFG |
IO_CFG[1:1] P1入出力設定 |
P2_CFG |
IO_CFG[2:2] P2入出力設定 |
P3_CFG |
IO_CFG[3:3] P3入出力設定 |
P0_INTMODE |
INTMODE[0:0] |
P1_INTMODE |
INTMODE[1:1] |
P2_INTMODE |
INTMODE[2:2] |
P3_INTMODE |
INTMODE[3:3] |
機能名 |
機能説明 |
P0P1_FILTER |
INTMODE[6:4] |
P0_MSK |
MSK |
P1_MSK |
MSK |
P2_MSK |
MSK |
P3_MSK |
MSK |
MOTOR_MSK |
MSK |
INTP0_FLAG |
INTSTAT |
INTP1_FLAG |
INTSTAT |
INTP2_FLAG |
INTSTAT |
INTP3_FLAG |
INTSTAT |
MOTOR_STOP_FLAG |
INTSTAT |
WDINT_WATCHDOG_FLAG |
INTSTAT |
IP |
I / O |
MOTOR_CONTROL |
INT_MTR_ACT[7:5] |
INT_AUTO |
INT_MTR_ACT[4:3] |
INT_MOTOR |
INT_MTR_ACT[0] |
EXTRASTEPS0 |
EXTRASTEPSのカウント値(ステップ)INTP0の場合 |
EXTRASTEPS1 |
EXTRASTEPSのカウント値(ステップ)INTP1の場合 |
機能名 |
機能説明 |
PH_CNTL |
OP_CFG_PHS[7:6] |
OUT_CNTL |
OP_CFG_PHS[4:4] |
OP_LEVELS |
OP_CFG_PHS[3:0] |
Motor_stop_timer |
OP_STAT_TO[7:5] |
CCW_stop |
OP_STAT_TO[3:2] |
CW_stop |
OP_STAT_TO[1:0] |
RUCNTL_enable |
RUCNTL[5:5] 開始時にランプアップ |
RUCNTL_change |
RUCNTL[4:4] ランプアップを再度有効にしてランプアップ率を変更する |
RUCNTL_Multiplication_factor |
RUCNTL[3:0] ランプアップステップ増倍率 |
RDCNTL_enable |
RDCNTL |
RDCNTL_change |
RDCNTL |
RDCNTL_Multiplication_factor |
RDCNTL |
PMA |
複数のアクションを制御する |
LOOPDLY_CW |
反転するためのループ遅延カウンタ 時計回り→反時計回り |
LOOPDLY_CCW |
反転するためのループ遅延カウンタ 反時計回りから反時計回り |
CWSCOUNT |
時計回りのステップ数 |
CCWSCOUNT |
反時計回りのステップ数 |
CWPWL_PRESCALER |
時計回りのステップパルス幅 PRESCALER |
機能名 |
機能説明 |
CWPWL_STEP_PULSE_WIDTH |
時計回りのステップパルス幅 |
CCWPWL_PRESCALER |
反時計回りのステップパルス幅 PRESCALER |
CCWPWL_STEP_PULSE_WIDTH |
反時計回りのステップパルス幅 |
MCNTL |
Motor |
SUBADR1 |
I2C-bus |
SUBADR2 |
I2C-bus |
SUBADR3 |
I2C-bus |
ALLCALLADR |
All |
STEPCOUNT |
Step |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
メソッド
機能名 |
機能説明 |
Init |
I2Cバスコントローラに指定された接続設定を使って非同期的に接続します。 |
Read |
指定レジスタ読込 |
Write |
指定レジスタ書込 |
定数
機能名 |
機能説明 |
定数値 |
REG_ADDR.MODE |
Mode |
0x00 |
REG_ADDR.WDTOI |
Watchdog |
0x01 |
REG_ADDR.WDCNTL |
Watchdog |
0x02 |
REG_ADDR.IO_CFG |
I/O |
0x03 |
REG_ADDR.INTMODE |
Interrupt |
0x04 |
REG_ADDR.MSK |
Mask |
0x05 |
REG_ADDR.INTSTAT |
Interrupt |
0x06 |
REG_ADDR.IP |
Input |
0x07 |
REG_ADDR.INT_MTR_ACT |
Interrupt |
0x08 |
REG_ADDR.EXTRASTEPS0 |
Count |
0x09 |
REG_ADDR.EXTRASTEPS1 |
Count |
0x0A |
REG_ADDR.OP_CFG_PHS |
Output |
0x0B |
REG_ADDR.OP_STAT_TO |
Output |
0x0C |
REG_ADDR.RUCNTL |
Ramp up |
0x0D |
REG_ADDR.RDCNTL |
Ramp |
0x0E |
REG_ADDR.PMA |
Perform |
0x0F |
REG_ADDR.LOOPDLY_CW |
Loop |
0x10 |
REG_ADDR.LOOPDLY_CCW |
Loop |
0x11 |
機能名 |
機能説明 |
定数値 |
REG_ADDR.CWSCOUNTL |
Number |
0x12 |
REG_ADDR.CWSCOUNTH |
Number |
0x13 |
REG_ADDR.CCWSCOUNTL |
Number |
0x14 |
REG_ADDR.CCWSCOUNTH |
Number |
0x15 |
REG_ADDR.CWPWL |
Step |
0x16 |
REG_ADDR.CWPWH |
Step |
0x17 |
REG_ADDR.CCWPWL |
Step |
0x18 |
REG_ADDR.CCWPWH |
Step |
0x19 |
REG_ADDR.MCNTL |
Motor |
0x1A |
REG_ADDR.SUBADR1 |
I2C-bus |
0x1B |
REG_ADDR.SUBADR2 |
I2C-bus |
0x1C |
REG_ADDR.SUBADR3 |
I2C-bus |
0x1D |
REG_ADDR.ALLCALLADR |
All |
0x1E |
REG_ADDR.STEPCOUNT0 |
Step |
0x1F |
REG_ADDR.STEPCOUNT1 |
Step |
0x20 |
REG_ADDR.STEPCOUNT2 |
Step |
0x21 |
REG_ADDR.STEPCOUNT3 |
Step |
0x22 |
|
|
|
Auto_Increment |
Auto-Increment |
0x80 |
I2Cセンサードライバーを使ったVBでのサンプルソース
Imports I2CLibrary Public NotInheritable Class PCA9629APWPage Inherits Page
Private Const PCA9629APW_Address As Byte = &H22 Private PCA9629APW As PCA9629APW = New PCA9629APW() Private WithEvents RefreshTimer As DispatcherTimer = New DispatcherTimer()
Public Sub New() InitializeComponent() Call Init() End Sub
Private Async Sub Init() Await PCA9629APW.Init(PCA9629APW_Address) End Sub
Private Sub btnStart_Click(sender As Object, e As RoutedEventArgs) RefreshTimer.Interval = TimeSpan.FromMilliseconds(100)
Call SetConfig()
’MCNTL書込 PCA9629APW.MCNTL = &H80 PCA9629APW.Write(PCA9629APW.REG_ADDR.MCNTL)
RefreshTimer.Start() End Sub
Private Sub Measurement(sender As Object, e As Object) Handles RefreshTimer.Tick RefreshTimer.Stop()
PCA9629APW.Read(PCA9629APW.REG_ADDR.STEPCOUNT) Debug.WriteLine(“STEPCOUNT {0:#,##0}”, PCA9629APW.STEPCOUNT)
PCA9629APW.Read(PCA9629APW.REG_ADDR.IP) Debug.WriteLine(“IP:{0:D}”, PCA9629APW.IP)
PCA9629APW.Read(PCA9629APW.REG_ADDR.INTSTAT) Debug.WriteLine(“INTP0_FLAG:{0}”, PCA9629APW.INTP0_FLAG) Debug.WriteLine(“INTP1_FLAG:{0}”, PCA9629APW.INTP1_FLAG) Debug.WriteLine(“INTP2_FLAG:{0}”, PCA9629APW.INTP2_FLAG) Debug.WriteLine(“MOTOR_STOP_FLAG:{0}”, PCA9629APW.MOTOR_STOP_FLAG) Debug.WriteLine(“WDINT_WATCHDOG_FLAG:{0}”, PCA9629APW.WDINT_WATCHDOG_FLAG)
RefreshTimer.Start() End Sub
Private Sub btnStop_Click(sender As Object, e As RoutedEventArgs) RefreshTimer.Stop() End Sub
Private Sub SetConfig()
’MODE書込 PCA9629APW.MODE = &H0 PCA9629APW.Write(PCA9629APW.REG_ADDR.MODE)
’OP_CFG_PHS書込 PCA9629APW.PH_CNTL = 1 ‘ two-phase PCA9629APW.OUT_CNTL = True PCA9629APW.OP_LEVELS = &H0 PCA9629APW.Write(PCA9629APW.REG_ADDR.OP_CFG_PHS)
’CWPW書込 PCA9629APW.CWPWL_PRESCALER = PCA9629APW.Prescaler_range.MicroSec3 PCA9629APW.CWPWL_STEP_PULSE_WIDTH = 1024 PCA9629APW.Write(PCA9629APW.REG_ADDR.CWPW)
’CWPW書込 PCA9629APW.CCWPWL_PRESCALER = PCA9629APW.Prescaler_range.MicroSec3 PCA9629APW.CCWPWL_STEP_PULSE_WIDTH = &H800 PCA9629APW.Write(PCA9629APW.REG_ADDR.CCWPW)
’CWSCOUNT書込 PCA9629APW.CWSCOUNT = 512 PCA9629APW.Write(PCA9629APW.REG_ADDR.CWSCOUNT)
’CCWSCOUNT書込 PCA9629APW.CCWSCOUNT = &H80 PCA9629APW.Write(PCA9629APW.REG_ADDR.CCWSCOUNT)
’RUCNTL書込 PCA9629APW.RUCNTL_enable = True PCA9629APW.RUCNTL_change = False PCA9629APW.RUCNTL_Multiplication_factor = 4 PCA9629APW.Write(PCA9629APW.REG_ADDR.RUCNTL)
‘RDCTNL書込 PCA9629APW.RDCNTL_enable = True PCA9629APW.RDCNTL_change = False PCA9629APW.RDCNTL_Multiplication_factor = 4 PCA9629APW.Write(PCA9629APW.REG_ADDR.RDCNTL)
‘PMA書込 Debug.WriteLine(“PMA書込“) PCA9629APW.PMA = &H2 PCA9629APW.Write(PCA9629APW.REG_ADDR.PMA)
’IO_CFG PCA9629APW.P0_CFG = True PCA9629APW.P1_CFG = True PCA9629APW.P2_CFG = False PCA9629APW.P3_CFG = False PCA9629APW.Write(PCA9629APW.REG_ADDR.IO_CFG)
’ INT_MTR_ACT PCA9629APW.INT_MOTOR = &H3 PCA9629APW.INT_AUTO = &H0 PCA9629APW.MOTOR_CONTROL = True PCA9629APW.Write(PCA9629APW.REG_ADDR.INT_MTR_ACT)
’ INTMODE[10] PCA9629APW.P0_INTMODE = False PCA9629APW.P1_INTMODE = False PCA9629APW.P2_INTMODE = False PCA9629APW.P3_INTMODE = False PCA9629APW.P0P1_FILTER = &H1 PCA9629APW.Write(PCA9629APW.REG_ADDR.INTMODE)
’ MSK 割り込みモーターストップ PCA9629APW.P0_MSK = False PCA9629APW.P1_MSK = False PCA9629APW.P2_MSK = False PCA9629APW.P3_MSK = False PCA9629APW.MOTOR_MSK = False PCA9629APW.Write(PCA9629APW.REG_ADDR.MSK) End Sub
Private Sub btnBack_Click(sender As Object, e As RoutedEventArgs) RefreshTimer.Stop() PCA9629APW.close() App.rootFrame.Navigate(GetType(MenuPage)) End Sub End Class
|