テキスト ボックス:  PCA9629A

 

 

 

I2Cセンサーの種類

ステッピングモーターコントローラ

主な機能

chの4相ユニポーラ・ステッピングモータコントローラ (ドライバーは除く)

レジスタにパラメータを与えれば、後は勝手に台形制御をします。

I2Cデバイス名

PCA9629APW

写真

 

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.5~5.5V (3.3Vでは使えません、レベルシフターが必要です)

040~05EAD0AD1PinVDD,VSS,SDA,SCLの接続先で選択。16通り可能。

1相、2相、1-2相励磁の選択可能

333.3Kpps~0.3pps

32bit

1bps

説明

I2Cデバイスならではのデバイスです。初速、加減速度、トップスピード、総パルス数等

のパラメータをレジスタに書き込み、動け!と指示すると、その設定に合った台形駆動でパルを生成して出力します。

従来は、CPUで台形パターンを計算して常時GPIO出力で制御していた処理が、このデバイスはパラメータを与えると自分で計算してパルスを発生する為、CPU負荷が非常に少なくてステッピングモーターを駆動できます。

 

また、GPIO端子でCWCCWのリミットスイッチ入力も可能で原点復帰等もワンチップで可能なので、ボールネジ等のリニアアクチェータ等の制御はこのチップ単品で可能です。

スッテピングモーターも25mA以下の超小型であれば直接駆動可能で、マイクロアクチェータ等にも利用可能です。

 

しかし、設定するレジスタの数が多く、希望する動作をさせる為には、電卓を叩きながら

計算を行い、レジスタ値を決定しなければ成りません。

NXPのページには、各パラメータを自動計算するExcelが提供されています。

I2Cセンサー・ドライバーでは台形制御のパラメータ自動計算は行いませんので、Excel

求めた値をプロパティに設定して下さい。

 

総ステップ数の設定は32bitです32bitデータを8bitへ分割書込み等の処理を行わなければなりませんが、I2Cセンサードライバーでは32bit16bitデータへの合算/分割はドライバー内部で処理しますのでレジスタ分割等をきにせず、プロパティへ10進数での設定で実現できます。

 

通常のレジスタの読み書きは、register
address
を指定した後に処理を行いますが、I2Cセンサー・ドライバーを使用する場合は使用するプロパティにregister addressが紐づけして有る為レジスタアドレスの指定は不要でプロパティへ値の代入、読み出しのみで可能です。

他に準備した方が良い物

電源

 

 

 

ドライバー

 

 

 

 

ロジックレベル変換

・ステッピングモータ駆動用電源(モーターの電圧、電流に合わせて下さい)

・ロジック電源 5.0VPCA9629A用の電源)

今回は、ドライバーに5V生成回路が有ったので流用してます。

 

4相ユニポーラ用のステッピングモータードライバー

使用するモーターの電圧、電流に合わせて下さい。

PCA9629A5V/20Aまで駆動できます。この入力でモーター駆動が可能なドライバーでなければ成りません。

 

Raspberry Piとの接続で3.3v5vを双方向で変換する物です。

スイッチサイエンスに色々な種類が有ります。

今回はPCA9600Dを用いましたが、他には以下の製品が有ります

PCA9517ADP
I2C
レベル変換バスバッファ基板

PCA9306搭載 I2C用ロジックレベル変換ボード

NTB0104 レベルシフタ ピッチ変換済みモジュール

TXS0108E レベルシフタ ピッチ変換済みモジュール

TXS0108E レベルシフタ ピッチ変換済みモジュール

BSS138搭載4CH-I2C用双方向ロジックレベルコンバータ

PCA9600D 高ドライブ電流I2Cバスバッファ基板

各々Data-Sheet等を入手の上、正確に接続して下さい。誤って接続すると壊れます

 

 

 

 

開発・テスト風景

IMG_1049

写真の左からスッテッピングモーター、ドライバー、PCA9629APCA9600DRaspberry Pi

Raspberry
Pi
3.3vI2CラインをPCA9600D3.3V5V変換を行います。

5Vに変換されたI2CラインをPCA9629Aに接続、PCA9629AOUT0~OUT3をステッピングモータードライバーに接続、ドライバーの出力をステッピングモータに接続します。

手作り感満載ですが、きちんと動作します。

 

 

I2Cデバイス内部のレジスタ構成(レジスタに対する設定値、レジスタの内容等のご質問はお答えできません)

Mode register

Number of steps
CW low byte

Mode register

Number of steps
CW high byte

Watchdog time-out
interval register

Number of steps
CCW low byte

Watchdog control
register

Number of steps
CCW high byte

I/O Configuration
register

Step pulse width
for CW rotation low byte

Interrupt mode register

Step pulse width
for CW rotation high byte

Mask interrupt register

Step pulse width
for CCW rotation low byte

Interrupt status
register

Step pulse width for CCW rotation
high byte

Input port register

Motor start/stop
and rotate direction control

Interrupt motor action
control register

Step pulse width
for CCW rotation low byte

Count value for extra
steps for INTP0

Step pulse width for CCW rotation
high byte

Count value for extra
steps for INTP1

Motor start/stop
and rotate direction control

Output port
configuration and phase control register

2C-bus subaddress 1

Output port
state and time-out control register

I2C-bus
subaddress 2

Ramp up control register

I2C-bus
subaddress 3

Ramp down control register

All Call I2C-bus
address

Perform multiple
of actions control register

Step counter
byte 0

Loop delay time
for reversing from CW to CCW register

Step counter
byte 1

Loop delay time
for reversing from CCW to CW register

Step counter
byte 2

 

Step counter
byte 3

 

I2Cセンサー・ドライバーで準備済みのプロパティ・メソッド

プロパティ

機能名

機能説明

MODE

Mode
register

WDTOI

WDCNTL
[2:1]  Watchdog time-out interval
register

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]
P0
割込設定

P1_INTMODE

INTMODE[1:1]
P1
割込設定

P2_INTMODE

INTMODE[2:2]
P2
割込設定

P3_INTMODE

INTMODE[3:3]
P3
割込設定

 

機能名

機能説明

P0P1_FILTER

INTMODE[6:4]
pulse width of spike or noise that must be suppressed by the input filter for
P0 and P1 inputs

P0_MSK

MSK
[0:0] P0
に対する割込の有効/無効

P1_MSK

MSK
[1:1] P1
に対する割込の有効/無効

P2_MSK

MSK
[2:2] P2
に対する割込の有効/無効

P3_MSK

MSK
[3:3] P3
に対する割込の有効/無効

MOTOR_MSK

MSK
[4:4]
モータ停止時の割り込み有効/無効

INTP0_FLAG

INTSTAT
[0:0] INTP0
の割込ステータス

INTP1_FLAG

INTSTAT
[1:1] INTP1
の割込ステータス

INTP2_FLAG

INTSTAT
[2:2] INTP2
の割込ステータス

INTP3_FLAG

INTSTAT
[3:3] INTP3
の割込ステータス

MOTOR_STOP_FLAG

INTSTAT
[4:4] Motor stop
の割込ステータス

WDINT_WATCHDOG_FLAG

INTSTAT
[5:5] WDINT watchdog
の割込ステータス

IP

I / O
P0
P3の入力論理レベルを反映します

MOTOR_CONTROL

INT_MTR_ACT[7:5]
motor on INT

INT_AUTO

INT_MTR_ACT[4:3]

INT_MOTOR

INT_MTR_ACT[0]
enable interrupt based control of motor

EXTRASTEPS0

EXTRASTEPSのカウント値(ステップ)INTP0の場合

EXTRASTEPS1

EXTRASTEPSのカウント値(ステップ)INTP1の場合

 

 

機能名

機能説明

PH_CNTL

OP_CFG_PHS[7:6]
単相ドライブ 2相ドライブ ハーフステップドライブ出力

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]
CCW stop

CW_stop

OP_STAT_TO[1:0]
CW stop

RUCNTL_enable

RUCNTL[5:5]  開始時にランプアップ

RUCNTL_change

RUCNTL[4:4]  ランプアップを再度有効にしてランプアップ率を変更する

RUCNTL_Multiplication_factor

RUCNTL[3:0]  ランプアップステップ増倍率

RDCNTL_enable

RDCNTL
[5:5] 
停止時にランプダウン

RDCNTL_change

RDCNTL
[4:4] 
ランプダウンを再び有効にしてランプダウン率を変更する

RDCNTL_Multiplication_factor

RDCNTL
[3:0] 
ランプダウンステップ増倍率

PMA

複数のアクションを制御する

LOOPDLY_CW

反転するためのループ遅延カウンタ 時計回り→反時計回り

LOOPDLY_CCW

反転するためのループ遅延カウンタ 反時計回りから反時計回り

CWSCOUNT

時計回りのステップ数

CCWSCOUNT

反時計回りのステップ数

CWPWL_PRESCALER

時計回りのステップパルス幅 PRESCALER

 

機能名

機能説明

CWPWL_STEP_PULSE_WIDTH

時計回りのステップパルス幅

CCWPWL_PRESCALER

反時計回りのステップパルス幅 PRESCALER

CCWPWL_STEP_PULSE_WIDTH

反時計回りのステップパルス幅

MCNTL

Motor
control

SUBADR1

I2C-bus
subaddress1

SUBADR2

I2C-bus
subaddress2

SUBADR3

I2C-bus
subaddress3

ALLCALLADR

All
Call I2C-bus address

STEPCOUNT

Step
counter

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

メソッド

機能名

機能説明

Init

I2Cバスコントローラに指定された接続設定を使って非同期的に接続します。

Read

指定レジスタ読込

Write

指定レジスタ書込

定数

機能名

機能説明

定数値

REG_ADDR.MODE

Mode
register

0x00

REG_ADDR.WDTOI

Watchdog
time-out interval register

0x01

REG_ADDR.WDCNTL

Watchdog
control register

0x02

REG_ADDR.IO_CFG

I/O
Configuration register

0x03

REG_ADDR.INTMODE

Interrupt
mode register

0x04

REG_ADDR.MSK

Mask
interrupt register

0x05

REG_ADDR.INTSTAT

Interrupt
status register

0x06

REG_ADDR.IP

Input
port register

0x07

REG_ADDR.INT_MTR_ACT

Interrupt
motor action control register

0x08

REG_ADDR.EXTRASTEPS0

Count
value for extra steps for INTP0

0x09

REG_ADDR.EXTRASTEPS1

Count
value for extra steps for INTP1

0x0A

REG_ADDR.OP_CFG_PHS

Output
port configuration and phase control register

0x0B

REG_ADDR.OP_STAT_TO

Output
port state and time-out control register

0x0C

REG_ADDR.RUCNTL

Ramp up
control register

0x0D

REG_ADDR.RDCNTL

Ramp
down control register

0x0E

REG_ADDR.PMA

Perform
multiple of actions control register

0x0F

REG_ADDR.LOOPDLY_CW

Loop
delay time for reversing from CW to CCW register

0x10

REG_ADDR.LOOPDLY_CCW

Loop
delay time for reversing from CCW to CW register

0x11

 

機能名

機能説明

定数値

REG_ADDR.CWSCOUNTL

Number
of steps CW low byte

0x12

REG_ADDR.CWSCOUNTH

Number
of steps CW high byte

0x13

REG_ADDR.CCWSCOUNTL

Number
of steps CCW low byte

0x14

REG_ADDR.CCWSCOUNTH

Number
of steps CCW high byte

0x15

REG_ADDR.CWPWL

Step
pulse width for CW rotation low byte

0x16

REG_ADDR.CWPWH

Step
pulse width for CW rotation high byte

0x17

REG_ADDR.CCWPWL

Step
pulse width for CCW rotation low byte

0x18

REG_ADDR.CCWPWH

Step
pulse width for CCW rotation high byte

0x19

REG_ADDR.MCNTL

Motor
start/stop and rotate direction control

0x1A

REG_ADDR.SUBADR1

I2C-bus
subaddress 1

0x1B

REG_ADDR.SUBADR2

I2C-bus
subaddress 2

0x1C

REG_ADDR.SUBADR3

I2C-bus
subaddress 3

0x1D

REG_ADDR.ALLCALLADR

All
Call I2C-bus address

0x1E

REG_ADDR.STEPCOUNT0

Step
counter byte 0

0x1F

REG_ADDR.STEPCOUNT1

Step
counter byte 1

0x20

REG_ADDR.STEPCOUNT2

Step
counter byte 2

0x21

REG_ADDR.STEPCOUNT3

Step
counter byte 3

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