mirror of
https://github.com/tinygo-org/drivers.git
synced 2026-08-11 02:13:42 +00:00
486949686c
TMC5160: Added TMC5160 support * Added example code for tmc5160 and smoke test * Update go.mod * Updated mod file * Cleaned up commented out code and updated readme. * ran go fmt * Fixed setrampspeed func * Removed spi1 pin setup in example.go. Renamed SPIComm to spicomm.go * Removed unused test file * Removed commented line
2081 lines
63 KiB
Go
2081 lines
63 KiB
Go
package tmc5160
|
|
|
|
import (
|
|
math "github.com/orsinium-labs/tinymath"
|
|
)
|
|
|
|
// RegisterComm defines an interface for reading from and writing to hardware registers.
|
|
type RegisterComm interface {
|
|
ReadRegister(register uint8, driverIndex uint8) (uint32, error)
|
|
WriteRegister(register uint8, value uint32, driverIndex uint8) error
|
|
}
|
|
|
|
// ReadRegister function using the register constants
|
|
func ReadRegister(comm RegisterComm, driverIndex uint8, register uint8) (uint32, error) {
|
|
// Read the register value using the comm interface
|
|
|
|
value, err := comm.ReadRegister(register, driverIndex)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return value, nil
|
|
}
|
|
|
|
// WriteRegister function using the register constants
|
|
func WriteRegister(comm RegisterComm, register uint8, driverIndex uint8, value uint32) error {
|
|
// Write the value to the register using the comm interface
|
|
return comm.WriteRegister(register, value, driverIndex)
|
|
}
|
|
|
|
// Register and methods to pack and unpack
|
|
// Base Register struct
|
|
type Register struct {
|
|
RegisterAddr uint8
|
|
Bytes uint32
|
|
}
|
|
|
|
// Common New function for creating a new register instance
|
|
func NewRegister(addr uint8) *Register {
|
|
return &Register{
|
|
RegisterAddr: addr,
|
|
}
|
|
}
|
|
|
|
// Common Pack method: for subclasses to implement their packing logic
|
|
func (r *Register) Pack() uint32 {
|
|
return r.Bytes // Default, should be overridden in register-specific structs
|
|
}
|
|
|
|
// Common Unpack method: for subclasses to implement their unpacking logic
|
|
func (r *Register) Unpack(registerValue uint32) {
|
|
r.Bytes = registerValue // Default, should be overridden in register-specific structs
|
|
}
|
|
|
|
// Common GetAddress method
|
|
func (r *Register) GetAddress() uint8 {
|
|
return r.RegisterAddr
|
|
}
|
|
|
|
// Common Read method (assuming the communication interface is implemented)
|
|
func (r *Register) Read(comm RegisterComm, driverIndex uint8) (uint32, error) {
|
|
return ReadRegister(comm, driverIndex, r.RegisterAddr)
|
|
}
|
|
|
|
// Common Write method
|
|
func (r *Register) Write(comm RegisterComm, driverIndex uint8, value uint32) error {
|
|
return WriteRegister(comm, r.RegisterAddr, driverIndex, value)
|
|
}
|
|
|
|
// GCONF Register bit fields' masks and shifts
|
|
const (
|
|
// Recalibrate: Zero crossing recalibration during driver disable
|
|
GCONF_Recalibrate_Mask = 1 << 0
|
|
// Faststandstill: Timeout for step execution until standstill detection
|
|
GCONF_Faststandstill_Mask = 1 << 1
|
|
// Enable PWM mode for StealthChop
|
|
GCONF_EnPwmMode_Mask = 1 << 2
|
|
// Enable step input filtering for StealthChop optimization
|
|
GCONF_MultistepFilt_Mask = 1 << 3
|
|
// Motor direction
|
|
GCONF_Shaft_Mask = 1 << 4
|
|
// Error flags on DIAG0 pin
|
|
GCONF_Diag0Error_Mask = 1 << 5
|
|
// Enable DIAG0 for Over temperature warning
|
|
GCONF_Diag0Otpw_Mask = 1 << 6
|
|
// Enable DIAG0 for stall step detection
|
|
GCONF_Diag0StallStep_Mask = 1 << 7
|
|
// Enable DIAG1 for stall direction
|
|
GCONF_Diag1StallDir_Mask = 1 << 8
|
|
// Enable DIAG1 for index position
|
|
GCONF_Diag1Index_Mask = 1 << 9
|
|
// Enable DIAG1 for chopper on state
|
|
GCONF_Diag1Onstate_Mask = 1 << 10
|
|
// Enable DIAG1 for skipped steps
|
|
GCONF_Diag1StepsSkipped_Mask = 1 << 11
|
|
// Enable DIAG0 push-pull output
|
|
GCONF_Diag0IntPushPull_Mask = 1 << 12
|
|
// Enable DIAG1 push-pull output
|
|
GCONF_Diag1PosCompPushPull_Mask = 1 << 13
|
|
// Small hysteresis for step frequency comparison
|
|
GCONF_SmallHysteresis_Mask = 1 << 14
|
|
// Enable emergency stop
|
|
GCONF_StopEnable_Mask = 1 << 15
|
|
// Direct motor coil current and polarity control
|
|
GCONF_DirectMode_Mask = 1 << 16
|
|
// Test mode (not for normal use)
|
|
GCONF_TestMode_Mask = 1 << 17
|
|
)
|
|
|
|
// GCONF Register structure
|
|
type GCONF_Register struct {
|
|
Register
|
|
// Fields corresponding to individual settings in GCONF register
|
|
Recalibrate bool
|
|
Faststandstill bool
|
|
EnPwmMode bool
|
|
MultistepFilt bool
|
|
Shaft bool
|
|
Diag0Error bool
|
|
Diag0Otpw bool
|
|
Diag0StallStep bool
|
|
Diag1StallDir bool
|
|
Diag1Index bool
|
|
Diag1Onstate bool
|
|
Diag1StepsSkipped bool
|
|
Diag0IntPushPull bool
|
|
Diag1PosCompPushPull bool
|
|
SmallHysteresis bool
|
|
StopEnable bool
|
|
DirectMode bool
|
|
TestMode bool
|
|
}
|
|
|
|
// NewGCONF initializes a new GCONF register instance
|
|
func NewGCONF() *GCONF_Register {
|
|
return &GCONF_Register{
|
|
Register: Register{
|
|
RegisterAddr: GCONF, // GSTAT register address
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack the fields into a single 32-bit register value
|
|
func (g *GCONF_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Use bitwise OR to set individual bits based on the field values
|
|
if g.Recalibrate {
|
|
registerValue |= GCONF_Recalibrate_Mask
|
|
}
|
|
if g.Faststandstill {
|
|
registerValue |= GCONF_Faststandstill_Mask
|
|
}
|
|
if g.EnPwmMode {
|
|
registerValue |= GCONF_EnPwmMode_Mask
|
|
}
|
|
if g.MultistepFilt {
|
|
registerValue |= GCONF_MultistepFilt_Mask
|
|
}
|
|
if g.Shaft {
|
|
registerValue |= GCONF_Shaft_Mask
|
|
}
|
|
if g.Diag0Error {
|
|
registerValue |= GCONF_Diag0Error_Mask
|
|
}
|
|
if g.Diag0Otpw {
|
|
registerValue |= GCONF_Diag0Otpw_Mask
|
|
}
|
|
if g.Diag0StallStep {
|
|
registerValue |= GCONF_Diag0StallStep_Mask
|
|
}
|
|
if g.Diag1StallDir {
|
|
registerValue |= GCONF_Diag1StallDir_Mask
|
|
}
|
|
if g.Diag1Index {
|
|
registerValue |= GCONF_Diag1Index_Mask
|
|
}
|
|
if g.Diag1Onstate {
|
|
registerValue |= GCONF_Diag1Onstate_Mask
|
|
}
|
|
if g.Diag1StepsSkipped {
|
|
registerValue |= GCONF_Diag1StepsSkipped_Mask
|
|
}
|
|
if g.Diag0IntPushPull {
|
|
registerValue |= GCONF_Diag0IntPushPull_Mask
|
|
}
|
|
if g.Diag1PosCompPushPull {
|
|
registerValue |= GCONF_Diag1PosCompPushPull_Mask
|
|
}
|
|
if g.SmallHysteresis {
|
|
registerValue |= GCONF_SmallHysteresis_Mask
|
|
}
|
|
if g.StopEnable {
|
|
registerValue |= GCONF_StopEnable_Mask
|
|
}
|
|
if g.DirectMode {
|
|
registerValue |= GCONF_DirectMode_Mask
|
|
}
|
|
if g.TestMode {
|
|
registerValue |= GCONF_TestMode_Mask
|
|
}
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack a 32-bit register value into individual fields
|
|
func (g *GCONF_Register) Unpack(registerValue uint32) {
|
|
g.Recalibrate = (registerValue & GCONF_Recalibrate_Mask) != 0
|
|
g.Faststandstill = (registerValue & GCONF_Faststandstill_Mask) != 0
|
|
g.EnPwmMode = (registerValue & GCONF_EnPwmMode_Mask) != 0
|
|
g.MultistepFilt = (registerValue & GCONF_MultistepFilt_Mask) != 0
|
|
g.Shaft = (registerValue & GCONF_Shaft_Mask) != 0
|
|
g.Diag0Error = (registerValue & GCONF_Diag0Error_Mask) != 0
|
|
g.Diag0Otpw = (registerValue & GCONF_Diag0Otpw_Mask) != 0
|
|
g.Diag0StallStep = (registerValue & GCONF_Diag0StallStep_Mask) != 0
|
|
g.Diag1StallDir = (registerValue & GCONF_Diag1StallDir_Mask) != 0
|
|
g.Diag1Index = (registerValue & GCONF_Diag1Index_Mask) != 0
|
|
g.Diag1Onstate = (registerValue & GCONF_Diag1Onstate_Mask) != 0
|
|
g.Diag1StepsSkipped = (registerValue & GCONF_Diag1StepsSkipped_Mask) != 0
|
|
g.Diag0IntPushPull = (registerValue & GCONF_Diag0IntPushPull_Mask) != 0
|
|
g.Diag1PosCompPushPull = (registerValue & GCONF_Diag1PosCompPushPull_Mask) != 0
|
|
g.SmallHysteresis = (registerValue & GCONF_SmallHysteresis_Mask) != 0
|
|
g.StopEnable = (registerValue & GCONF_StopEnable_Mask) != 0
|
|
g.DirectMode = (registerValue & GCONF_DirectMode_Mask) != 0
|
|
g.TestMode = (registerValue & GCONF_TestMode_Mask) != 0
|
|
}
|
|
|
|
// Example Register: GSTAT
|
|
type GSTAT_Register struct {
|
|
Register
|
|
Reset bool
|
|
DrvErr bool
|
|
UvCp bool
|
|
}
|
|
|
|
// NewGSTAT creates a new GSTAT register instance
|
|
func NewGSTAT() *GSTAT_Register {
|
|
return &GSTAT_Register{
|
|
Register: Register{
|
|
RegisterAddr: GSTAT, // GSTAT register address
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for GSTAT: overrides the base Pack
|
|
func (g *GSTAT_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
if g.Reset {
|
|
registerValue |= 1 << 0
|
|
}
|
|
if g.DrvErr {
|
|
registerValue |= 1 << 1
|
|
}
|
|
if g.UvCp {
|
|
registerValue |= 1 << 2
|
|
}
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for GSTAT: overrides the base Unpack
|
|
func (g *GSTAT_Register) Unpack(registerValue uint32) {
|
|
g.Reset = (registerValue & (1 << 0)) != 0
|
|
g.DrvErr = (registerValue & (1 << 1)) != 0
|
|
g.UvCp = (registerValue & (1 << 2)) != 0
|
|
}
|
|
|
|
// IOIN_Register struct to represent the IOIN register
|
|
type IOIN_Register struct {
|
|
Register
|
|
ReflStep bool
|
|
RefrDir bool
|
|
EncbDcenCfg4 bool
|
|
EncaDcinCfg5 bool
|
|
DrvEnn bool
|
|
EncNDcoCfg6 bool
|
|
SdMode bool
|
|
SwcompIn bool
|
|
Version uint8
|
|
}
|
|
|
|
// NewIOIN creates a new IOIN register instance
|
|
func NewIOIN() *IOIN_Register {
|
|
return &IOIN_Register{
|
|
Register: Register{
|
|
RegisterAddr: IOIN,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for IOIN: overrides the base Pack
|
|
func (i *IOIN_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Set individual bits based on the field values
|
|
if i.ReflStep {
|
|
registerValue |= 1 << 0
|
|
}
|
|
if i.RefrDir {
|
|
registerValue |= 1 << 1
|
|
}
|
|
if i.EncbDcenCfg4 {
|
|
registerValue |= 1 << 2
|
|
}
|
|
if i.EncaDcinCfg5 {
|
|
registerValue |= 1 << 3
|
|
}
|
|
if i.DrvEnn {
|
|
registerValue |= 1 << 4
|
|
}
|
|
if i.EncNDcoCfg6 {
|
|
registerValue |= 1 << 5
|
|
}
|
|
if i.SdMode {
|
|
registerValue |= 1 << 6
|
|
}
|
|
if i.SwcompIn {
|
|
registerValue |= 1 << 7
|
|
}
|
|
// Handle the version field (8 bits, starting at bit 24)
|
|
registerValue |= uint32(i.Version) << 24
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for IOIN: overrides the base Unpack
|
|
func (i *IOIN_Register) Unpack(registerValue uint32) {
|
|
i.ReflStep = (registerValue & (1 << 0)) != 0
|
|
i.RefrDir = (registerValue & (1 << 1)) != 0
|
|
i.EncbDcenCfg4 = (registerValue & (1 << 2)) != 0
|
|
i.EncaDcinCfg5 = (registerValue & (1 << 3)) != 0
|
|
i.DrvEnn = (registerValue & (1 << 4)) != 0
|
|
i.EncNDcoCfg6 = (registerValue & (1 << 5)) != 0
|
|
i.SdMode = (registerValue & (1 << 6)) != 0
|
|
i.SwcompIn = (registerValue & (1 << 7)) != 0
|
|
// Extract the version field (8 bits, starting at bit 24)
|
|
i.Version = uint8((registerValue >> 24) & 0xFF)
|
|
}
|
|
|
|
// SHORT_CONF_Register struct to represent the SHORT_CONF register
|
|
type SHORT_CONF_Register struct {
|
|
Register
|
|
S2vsLevel uint8 // Short to VS detector sensitivity (4 bits)
|
|
S2gLevel uint8 // Short to GND detector sensitivity (4 bits)
|
|
ShortFilter uint8 // Spike filtering bandwidth for short detection (2 bits)
|
|
ShortDelay bool // Short detection delay (1 bit)
|
|
}
|
|
|
|
// NewSHORT_CONF creates a new SHORT_CONF register instance
|
|
func NewSHORT_CONF() *SHORT_CONF_Register {
|
|
return &SHORT_CONF_Register{
|
|
Register: Register{
|
|
RegisterAddr: SHORT_CONF,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for SHORT_CONF: overrides the base Pack
|
|
func (s *SHORT_CONF_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(s.S2vsLevel&0xF) << 0 // S2vsLevel: 4 bits
|
|
registerValue |= uint32(s.S2gLevel&0xF) << 8 // S2gLevel: 4 bits
|
|
registerValue |= uint32(s.ShortFilter&0x3) << 16 // ShortFilter: 2 bits
|
|
if s.ShortDelay {
|
|
registerValue |= 1 << 18 // ShortDelay: 1 bit
|
|
}
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for SHORT_CONF: overrides the base Unpack
|
|
func (s *SHORT_CONF_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
s.S2vsLevel = uint8((registerValue >> 0) & 0xF) // Extract 4 bits for S2vsLevel
|
|
s.S2gLevel = uint8((registerValue >> 8) & 0xF) // Extract 4 bits for S2gLevel
|
|
s.ShortFilter = uint8((registerValue >> 16) & 0x3) // Extract 2 bits for ShortFilter
|
|
s.ShortDelay = (registerValue & (1 << 18)) != 0 // Extract 1 bit for ShortDelay
|
|
}
|
|
|
|
// DRV_CONF_Register struct to represent the DRV_CONF register
|
|
type DRV_CONF_Register struct {
|
|
Register
|
|
BBMTime uint8 // Break before make delay (5 bits)
|
|
BBMClks uint8 // Digital BBM Time in clock cycles (4 bits)
|
|
OTSelect uint8 // Over temperature level selection for bridge disable (2 bits)
|
|
DrvStrength uint8 // Gate drivers current selection (2 bits)
|
|
FiltIsense uint8 // Filter time constant of sense amplifier (2 bits)
|
|
}
|
|
|
|
// NewDRV_CONF creates a new DRV_CONF register instance
|
|
func NewDRV_CONF() *DRV_CONF_Register {
|
|
return &DRV_CONF_Register{
|
|
Register: Register{
|
|
RegisterAddr: DRV_CONF,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for DRV_CONF: overrides the base Pack
|
|
func (d *DRV_CONF_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(d.BBMTime&0x1F) << 0 // BBMTime: 5 bits
|
|
registerValue |= uint32(d.BBMClks&0xF) << 8 // BBMClks: 4 bits
|
|
registerValue |= uint32(d.OTSelect&0x3) << 16 // OTSelect: 2 bits
|
|
registerValue |= uint32(d.DrvStrength&0x3) << 18 // DrvStrength: 2 bits
|
|
registerValue |= uint32(d.FiltIsense&0x3) << 20 // FiltIsense: 2 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for DRV_CONF: overrides the base Unpack
|
|
func (d *DRV_CONF_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
d.BBMTime = uint8((registerValue >> 0) & 0x1F) // Extract 5 bits for BBMTime
|
|
d.BBMClks = uint8((registerValue >> 8) & 0xF) // Extract 4 bits for BBMClks
|
|
d.OTSelect = uint8((registerValue >> 16) & 0x3) // Extract 2 bits for OTSelect
|
|
d.DrvStrength = uint8((registerValue >> 18) & 0x3) // Extract 2 bits for DrvStrength
|
|
d.FiltIsense = uint8((registerValue >> 20) & 0x3) // Extract 2 bits for FiltIsense
|
|
}
|
|
|
|
// OFFSET_READ_Register struct to represent the OFFSET_READ register
|
|
type OFFSET_READ_Register struct {
|
|
Register
|
|
PhaseB uint8 // Phase B offset (8 bits)
|
|
PhaseA uint8 // Phase A offset (8 bits)
|
|
}
|
|
|
|
// NewOFFSET_READ creates a new OFFSET_READ register instance
|
|
func NewOFFSET_READ() *OFFSET_READ_Register {
|
|
return &OFFSET_READ_Register{
|
|
Register: Register{
|
|
RegisterAddr: OFFSET_READ,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for OFFSET_READ: overrides the base Pack
|
|
func (o *OFFSET_READ_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(o.PhaseB&0xFF) << 0 // PhaseB: 8 bits
|
|
registerValue |= uint32(o.PhaseA&0xFF) << 8 // PhaseA: 8 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for OFFSET_READ: overrides the base Unpack
|
|
func (o *OFFSET_READ_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
o.PhaseB = uint8((registerValue >> 0) & 0xFF) // Extract 8 bits for PhaseB
|
|
o.PhaseA = uint8((registerValue >> 8) & 0xFF) // Extract 8 bits for PhaseA
|
|
}
|
|
|
|
// IHOLD_IRUN_Register struct to represent the IHOLD_IRUN register
|
|
type IHOLD_IRUN_Register struct {
|
|
Register
|
|
Ihold uint8 // Standstill current (5 bits)
|
|
Irun uint8 // Motor run current (5 bits)
|
|
IholdDelay uint8 // Motor power down delay (4 bits)
|
|
}
|
|
|
|
// NewIHOLD_IRUN creates a new IHOLD_IRUN register instance
|
|
func NewIHOLD_IRUN() *IHOLD_IRUN_Register {
|
|
return &IHOLD_IRUN_Register{
|
|
Register: Register{
|
|
RegisterAddr: IHOLD_IRUN,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for IHOLD_IRUN: overrides the base Pack
|
|
func (i *IHOLD_IRUN_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(i.Ihold&0x1F) << 0 // Ihold: 5 bits
|
|
registerValue |= uint32(i.Irun&0x1F) << 8 // Irun: 5 bits
|
|
registerValue |= uint32(i.IholdDelay&0xF) << 16 // IholdDelay: 4 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for IHOLD_IRUN: overrides the base Unpack
|
|
func (i *IHOLD_IRUN_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
i.Ihold = uint8((registerValue >> 0) & 0x1F) // Extract 5 bits for Ihold
|
|
i.Irun = uint8((registerValue >> 8) & 0x1F) // Extract 5 bits for Irun
|
|
i.IholdDelay = uint8((registerValue >> 16) & 0xF) // Extract 4 bits for IholdDelay
|
|
}
|
|
|
|
// SW_MODE_Register struct to represent the SW_MODE register
|
|
type SW_MODE_Register struct {
|
|
Register
|
|
StopLEnable bool // Enable automatic motor stop during active left reference switch input
|
|
StopREnable bool // Enable automatic motor stop during active right reference switch input
|
|
PolStopL bool // Sets the active polarity of the left reference switch input
|
|
PolStopR bool // Sets the active polarity of the right reference switch input
|
|
SwapLR bool // Swap the left and right reference switch inputs
|
|
LatchLActive bool // Activate latching of the position to XLATCH upon an active going edge on REFL
|
|
LatchLInactive bool // Activate latching of the position to XLATCH upon an inactive going edge on REFL
|
|
LatchRActive bool // Activate latching of the position to XLATCH upon an active going edge on REFR
|
|
LatchRInactive bool // Activate latching of the position to XLATCH upon an inactive going edge on REFR
|
|
EnLatchEncoder bool // Latch encoder position to ENC_LATCH upon reference switch event
|
|
SgStop bool // Enable stop by stallGuard2
|
|
EnSoftStop bool // Enable soft stop upon a stop event
|
|
}
|
|
|
|
// NewSW_MODE creates a new SW_MODE register instance
|
|
func NewSW_MODE() *SW_MODE_Register {
|
|
return &SW_MODE_Register{
|
|
Register: Register{
|
|
RegisterAddr: SW_MODE,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for SW_MODE: overrides the base Pack
|
|
func (s *SW_MODE_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
if s.StopLEnable {
|
|
registerValue |= 1 << 0
|
|
}
|
|
if s.StopREnable {
|
|
registerValue |= 1 << 1
|
|
}
|
|
if s.PolStopL {
|
|
registerValue |= 1 << 2
|
|
}
|
|
if s.PolStopR {
|
|
registerValue |= 1 << 3
|
|
}
|
|
if s.SwapLR {
|
|
registerValue |= 1 << 4
|
|
}
|
|
if s.LatchLActive {
|
|
registerValue |= 1 << 5
|
|
}
|
|
if s.LatchLInactive {
|
|
registerValue |= 1 << 6
|
|
}
|
|
if s.LatchRActive {
|
|
registerValue |= 1 << 7
|
|
}
|
|
if s.LatchRInactive {
|
|
registerValue |= 1 << 8
|
|
}
|
|
if s.EnLatchEncoder {
|
|
registerValue |= 1 << 9
|
|
}
|
|
if s.SgStop {
|
|
registerValue |= 1 << 10
|
|
}
|
|
if s.EnSoftStop {
|
|
registerValue |= 1 << 11
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for SW_MODE: overrides the base Unpack
|
|
func (s *SW_MODE_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
s.StopLEnable = (registerValue & (1 << 0)) != 0
|
|
s.StopREnable = (registerValue & (1 << 1)) != 0
|
|
s.PolStopL = (registerValue & (1 << 2)) != 0
|
|
s.PolStopR = (registerValue & (1 << 3)) != 0
|
|
s.SwapLR = (registerValue & (1 << 4)) != 0
|
|
s.LatchLActive = (registerValue & (1 << 5)) != 0
|
|
s.LatchLInactive = (registerValue & (1 << 6)) != 0
|
|
s.LatchRActive = (registerValue & (1 << 7)) != 0
|
|
s.LatchRInactive = (registerValue & (1 << 8)) != 0
|
|
s.EnLatchEncoder = (registerValue & (1 << 9)) != 0
|
|
s.SgStop = (registerValue & (1 << 10)) != 0
|
|
s.EnSoftStop = (registerValue & (1 << 11)) != 0
|
|
}
|
|
|
|
// RAMP_STAT_Register struct to represent the RAMP_STAT register
|
|
type RAMP_STAT_Register struct {
|
|
Register
|
|
StatusStopL bool // Reference switch left status (1=active)
|
|
StatusStopR bool // Reference switch right status (1=active)
|
|
StatusLatchL bool // Latch left ready (enable position latching)
|
|
StatusLatchR bool // Latch right ready (enable position latching)
|
|
EventStopL bool // Active stop left condition due to stop switch
|
|
EventStopR bool // Active stop right condition due to stop switch
|
|
EventStopSG bool // Active StallGuard2 stop event
|
|
EventPosReached bool // Target position reached
|
|
VelocityReached bool // Target velocity reached
|
|
PositionReached bool // Target position reached
|
|
VZero bool // Actual velocity is 0
|
|
TZeroWaitActive bool // TZEROWAIT is active after motor stop
|
|
SecondMove bool // Automatic ramp required moving back in opposite direction
|
|
StatusSG bool // Active stallGuard2 input
|
|
}
|
|
|
|
// NewRAMP_STAT creates a new RAMP_STAT register instance
|
|
func NewRAMP_STAT() *RAMP_STAT_Register {
|
|
return &RAMP_STAT_Register{
|
|
Register: Register{
|
|
RegisterAddr: RAMP_STAT,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for RAMP_STAT: overrides the base Pack
|
|
func (r *RAMP_STAT_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
if r.StatusStopL {
|
|
registerValue |= 1 << 0
|
|
}
|
|
if r.StatusStopR {
|
|
registerValue |= 1 << 1
|
|
}
|
|
if r.StatusLatchL {
|
|
registerValue |= 1 << 2
|
|
}
|
|
if r.StatusLatchR {
|
|
registerValue |= 1 << 3
|
|
}
|
|
if r.EventStopL {
|
|
registerValue |= 1 << 4
|
|
}
|
|
if r.EventStopR {
|
|
registerValue |= 1 << 5
|
|
}
|
|
if r.EventStopSG {
|
|
registerValue |= 1 << 6
|
|
}
|
|
if r.EventPosReached {
|
|
registerValue |= 1 << 7
|
|
}
|
|
if r.VelocityReached {
|
|
registerValue |= 1 << 8
|
|
}
|
|
if r.PositionReached {
|
|
registerValue |= 1 << 9
|
|
}
|
|
if r.VZero {
|
|
registerValue |= 1 << 10
|
|
}
|
|
if r.TZeroWaitActive {
|
|
registerValue |= 1 << 11
|
|
}
|
|
if r.SecondMove {
|
|
registerValue |= 1 << 12
|
|
}
|
|
if r.StatusSG {
|
|
registerValue |= 1 << 13
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for RAMP_STAT: overrides the base Unpack
|
|
func (r *RAMP_STAT_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
r.StatusStopL = (registerValue & (1 << 0)) != 0
|
|
r.StatusStopR = (registerValue & (1 << 1)) != 0
|
|
r.StatusLatchL = (registerValue & (1 << 2)) != 0
|
|
r.StatusLatchR = (registerValue & (1 << 3)) != 0
|
|
r.EventStopL = (registerValue & (1 << 4)) != 0
|
|
r.EventStopR = (registerValue & (1 << 5)) != 0
|
|
r.EventStopSG = (registerValue & (1 << 6)) != 0
|
|
r.EventPosReached = (registerValue & (1 << 7)) != 0
|
|
r.VelocityReached = (registerValue & (1 << 8)) != 0
|
|
r.PositionReached = (registerValue & (1 << 9)) != 0
|
|
r.VZero = (registerValue & (1 << 10)) != 0
|
|
r.TZeroWaitActive = (registerValue & (1 << 11)) != 0
|
|
r.SecondMove = (registerValue & (1 << 12)) != 0
|
|
r.StatusSG = (registerValue & (1 << 13)) != 0
|
|
}
|
|
|
|
// ENCMODE_Register struct to represent the ENCMODE register
|
|
type ENCMODE_Register struct {
|
|
Register
|
|
PolA bool // Required A polarity for an N channel event
|
|
PolB bool // Required B polarity for an N channel event
|
|
PolN bool // Defines active polarity of N (0=low active, 1=high active)
|
|
IgnoreAB bool // Ignore A and B polarity for N channel event
|
|
ClrCont bool // Always latch or latch and clear X_ENC upon an N event
|
|
ClrOnce bool // Latch or latch and clear X_ENC on the next N event
|
|
Sensitivity uint8 // N channel event sensitivity (2 bits)
|
|
ClrEncX bool // Clear encoder counter X_ENC upon N-event
|
|
LatchXAct bool // Also latch XACTUAL position together with X_ENC
|
|
EncSelDecimal bool // Encoder prescaler divisor binary mode (0) / decimal mode (1)
|
|
}
|
|
|
|
// NewENCMODE creates a new ENCMODE register instance
|
|
func NewENCMODE() *ENCMODE_Register {
|
|
return &ENCMODE_Register{
|
|
Register: Register{
|
|
RegisterAddr: ENCMODE,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for ENCMODE: overrides the base Pack
|
|
func (e *ENCMODE_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
if e.PolA {
|
|
registerValue |= 1 << 0
|
|
}
|
|
if e.PolB {
|
|
registerValue |= 1 << 1
|
|
}
|
|
if e.PolN {
|
|
registerValue |= 1 << 2
|
|
}
|
|
if e.IgnoreAB {
|
|
registerValue |= 1 << 3
|
|
}
|
|
if e.ClrCont {
|
|
registerValue |= 1 << 4
|
|
}
|
|
if e.ClrOnce {
|
|
registerValue |= 1 << 5
|
|
}
|
|
registerValue |= uint32(e.Sensitivity&0x3) << 6 // Sensitivity: 2 bits
|
|
if e.ClrEncX {
|
|
registerValue |= 1 << 8
|
|
}
|
|
if e.LatchXAct {
|
|
registerValue |= 1 << 9
|
|
}
|
|
if e.EncSelDecimal {
|
|
registerValue |= 1 << 10
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for ENCMODE: overrides the base Unpack
|
|
func (e *ENCMODE_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
e.PolA = (registerValue & (1 << 0)) != 0
|
|
e.PolB = (registerValue & (1 << 1)) != 0
|
|
e.PolN = (registerValue & (1 << 2)) != 0
|
|
e.IgnoreAB = (registerValue & (1 << 3)) != 0
|
|
e.ClrCont = (registerValue & (1 << 4)) != 0
|
|
e.ClrOnce = (registerValue & (1 << 5)) != 0
|
|
e.Sensitivity = uint8((registerValue >> 6) & 0x3) // Extract 2 bits for Sensitivity
|
|
e.ClrEncX = (registerValue & (1 << 8)) != 0
|
|
e.LatchXAct = (registerValue & (1 << 9)) != 0
|
|
e.EncSelDecimal = (registerValue & (1 << 10)) != 0
|
|
}
|
|
|
|
// ENC_STATUS_Register struct to represent the ENC_STATUS register
|
|
type ENC_STATUS_Register struct {
|
|
Register
|
|
NEvent bool // N event detected
|
|
DeviationWarn bool // Deviation between X_ACTUAL and X_ENC detected
|
|
}
|
|
|
|
// NewENC_STATUS creates a new ENC_STATUS register instance
|
|
func NewENC_STATUS() *ENC_STATUS_Register {
|
|
return &ENC_STATUS_Register{
|
|
Register: Register{
|
|
RegisterAddr: ENC_STATUS,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for ENC_STATUS: overrides the base Pack
|
|
func (e *ENC_STATUS_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
if e.NEvent {
|
|
registerValue |= 1 << 0
|
|
}
|
|
if e.DeviationWarn {
|
|
registerValue |= 1 << 1
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for ENC_STATUS: overrides the base Unpack
|
|
func (e *ENC_STATUS_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
e.NEvent = (registerValue & (1 << 0)) != 0
|
|
e.DeviationWarn = (registerValue & (1 << 1)) != 0
|
|
}
|
|
|
|
// CHOPCONF_Register struct to represent the CHOPCONF register
|
|
type CHOPCONF_Register struct {
|
|
Register
|
|
Toff uint8 // Off time setting (4 bits)
|
|
HstrtTfd uint8 // Hysteresis start value or fast decay time setting (3 bits)
|
|
HendOffset uint8 // Hysteresis low value or sine wave offset (4 bits)
|
|
Tfd3 bool // Fast decay time setting bit 3
|
|
Disfdcc bool // Disable current comparator usage for fast decay termination
|
|
Rndtf bool // Enable random modulation of chopper TOFF time
|
|
Chm bool // Chopper mode (0=standard, 1=constant off time with fast decay)
|
|
Tbl uint8 // Comparator blank time select (2 bits)
|
|
Vsense bool // Select resistor voltage sensitivity (low or high)
|
|
Vhighfs bool // Enable fullstep switching when VHIGH is exceeded
|
|
Vhighchm bool // Enable switching to chm=1 and fd=0 when VHIGH is exceeded
|
|
Tpfd uint8 // Passive fast decay time (4 bits)
|
|
Mres uint8 // Microstep resolution (4 bits)
|
|
Intpol bool // Enable interpolation to 256 microsteps
|
|
Dedge bool // Enable double edge step pulses
|
|
Diss2g bool // Disable short to GND protection
|
|
Diss2vs bool // Disable short to supply protection
|
|
}
|
|
|
|
// NewCHOPCONF creates a new CHOPCONF register instance
|
|
func NewCHOPCONF() *CHOPCONF_Register {
|
|
return &CHOPCONF_Register{
|
|
Register: Register{
|
|
RegisterAddr: CHOPCONF,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for CHOPCONF: overrides the base Pack
|
|
func (c *CHOPCONF_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(c.Toff&0xF) << 0 // Toff: 4 bits
|
|
registerValue |= uint32(c.HstrtTfd&0x7) << 4 // HstrtTfd: 3 bits
|
|
registerValue |= uint32(c.HendOffset&0xF) << 7 // HendOffset: 4 bits
|
|
if c.Tfd3 {
|
|
registerValue |= 1 << 11 // Tfd3: 1 bit
|
|
}
|
|
if c.Disfdcc {
|
|
registerValue |= 1 << 12 // Disfdcc: 1 bit
|
|
}
|
|
if c.Rndtf {
|
|
registerValue |= 1 << 13 // Rndtf: 1 bit
|
|
}
|
|
if c.Chm {
|
|
registerValue |= 1 << 14 // Chm: 1 bit
|
|
}
|
|
registerValue |= uint32(c.Tbl&0x3) << 15 // Tbl: 2 bits
|
|
if c.Vsense {
|
|
registerValue |= 1 << 17 // Vsense: 1 bit
|
|
}
|
|
if c.Vhighfs {
|
|
registerValue |= 1 << 18 // Vhighfs: 1 bit
|
|
}
|
|
if c.Vhighchm {
|
|
registerValue |= 1 << 19 // Vhighchm: 1 bit
|
|
}
|
|
registerValue |= uint32(c.Tpfd&0xF) << 20 // Tpfd: 4 bits
|
|
registerValue |= uint32(c.Mres&0xF) << 24 // Mres: 4 bits
|
|
if c.Intpol {
|
|
registerValue |= 1 << 28 // Intpol: 1 bit
|
|
}
|
|
if c.Dedge {
|
|
registerValue |= 1 << 29 // Dedge: 1 bit
|
|
}
|
|
if c.Diss2g {
|
|
registerValue |= 1 << 30 // Diss2g: 1 bit
|
|
}
|
|
if c.Diss2vs {
|
|
registerValue |= 1 << 31 // Diss2vs: 1 bit
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for CHOPCONF: overrides the base Unpack
|
|
func (c *CHOPCONF_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
c.Toff = uint8((registerValue >> 0) & 0xF) // Extract 4 bits for Toff
|
|
c.HstrtTfd = uint8((registerValue >> 4) & 0x7) // Extract 3 bits for HstrtTfd
|
|
c.HendOffset = uint8((registerValue >> 7) & 0xF) // Extract 4 bits for HendOffset
|
|
c.Tfd3 = (registerValue & (1 << 11)) != 0 // Extract 1 bit for Tfd3
|
|
c.Disfdcc = (registerValue & (1 << 12)) != 0 // Extract 1 bit for Disfdcc
|
|
c.Rndtf = (registerValue & (1 << 13)) != 0 // Extract 1 bit for Rndtf
|
|
c.Chm = (registerValue & (1 << 14)) != 0 // Extract 1 bit for Chm
|
|
c.Tbl = uint8((registerValue >> 15) & 0x3) // Extract 2 bits for Tbl
|
|
c.Vsense = (registerValue & (1 << 17)) != 0 // Extract 1 bit for Vsense
|
|
c.Vhighfs = (registerValue & (1 << 18)) != 0 // Extract 1 bit for Vhighfs
|
|
c.Vhighchm = (registerValue & (1 << 19)) != 0 // Extract 1 bit for Vhighchm
|
|
c.Tpfd = uint8((registerValue >> 20) & 0xF) // Extract 4 bits for Tpfd
|
|
c.Mres = uint8((registerValue >> 24) & 0xF) // Extract 4 bits for Mres
|
|
c.Intpol = (registerValue & (1 << 28)) != 0 // Extract 1 bit for Intpol
|
|
c.Dedge = (registerValue & (1 << 29)) != 0 // Extract 1 bit for Dedge
|
|
c.Diss2g = (registerValue & (1 << 30)) != 0 // Extract 1 bit for Diss2g
|
|
c.Diss2vs = (registerValue & (1 << 31)) != 0 // Extract 1 bit for Diss2vs
|
|
}
|
|
|
|
// COOLCONF_Register struct to represent the COOLCONF register
|
|
type COOLCONF_Register struct {
|
|
Register
|
|
Semin uint8 // Minimum stallGuard2 value for smart current control (4 bits)
|
|
Seup uint8 // Current increment step width (2 bits)
|
|
Semax uint8 // stallGuard2 hysteresis value for smart current control (4 bits)
|
|
Sedn uint8 // Current decrement step speed (2 bits)
|
|
Seimin bool // Minimum current for smart current control (1 bit)
|
|
Sgt uint8 // stallGuard2 threshold value (7 bits)
|
|
Sfilt bool // Enable stallGuard2 filter (1 bit)
|
|
}
|
|
|
|
// NewCOOLCONF creates a new COOLCONF register instance
|
|
func NewCOOLCONF() *COOLCONF_Register {
|
|
return &COOLCONF_Register{
|
|
Register: Register{
|
|
RegisterAddr: COOLCONF,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for COOLCONF: overrides the base Pack
|
|
func (c *COOLCONF_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(c.Semin&0xF) << 0 // Semin: 4 bits
|
|
registerValue |= uint32(c.Seup&0x3) << 5 // Seup: 2 bits
|
|
registerValue |= uint32(c.Semax&0xF) << 8 // Semax: 4 bits
|
|
registerValue |= uint32(c.Sedn&0x3) << 13 // Sedn: 2 bits
|
|
if c.Seimin {
|
|
registerValue |= 1 << 15 // Seimin: 1 bit
|
|
}
|
|
registerValue |= uint32(c.Sgt&0x7F) << 16 // Sgt: 7 bits
|
|
if c.Sfilt {
|
|
registerValue |= 1 << 24 // Sfilt: 1 bit
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for COOLCONF: overrides the base Unpack
|
|
func (c *COOLCONF_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
c.Semin = uint8((registerValue >> 0) & 0xF) // Extract 4 bits for Semin
|
|
c.Seup = uint8((registerValue >> 5) & 0x3) // Extract 2 bits for Seup
|
|
c.Semax = uint8((registerValue >> 8) & 0xF) // Extract 4 bits for Semax
|
|
c.Sedn = uint8((registerValue >> 13) & 0x3) // Extract 2 bits for Sedn
|
|
c.Seimin = (registerValue & (1 << 15)) != 0 // Extract 1 bit for Seimin
|
|
c.Sgt = uint8((registerValue >> 16) & 0x7F) // Extract 7 bits for Sgt
|
|
c.Sfilt = (registerValue & (1 << 24)) != 0 // Extract 1 bit for Sfilt
|
|
}
|
|
|
|
// DCCTRL_Register struct to represent the DCCTRL register
|
|
type DCCTRL_Register struct {
|
|
Register
|
|
DcTime uint16 // Upper PWM on time limit for commutation (10 bits)
|
|
DcSg uint8 // Max. PWM on time for step loss detection using dcStep (8 bits)
|
|
}
|
|
|
|
// NewDCCTRL creates a new DCCTRL register instance
|
|
func NewDCCTRL() *DCCTRL_Register {
|
|
return &DCCTRL_Register{
|
|
Register: Register{
|
|
RegisterAddr: DCCTRL,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for DCCTRL: overrides the base Pack
|
|
func (d *DCCTRL_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(d.DcTime&0x3FF) << 0 // DcTime: 10 bits
|
|
registerValue |= uint32(d.DcSg&0xFF) << 16 // DcSg: 8 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for DCCTRL: overrides the base Unpack
|
|
func (d *DCCTRL_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
d.DcTime = uint16((registerValue >> 0) & 0x3FF) // Extract 10 bits for DcTime
|
|
d.DcSg = uint8((registerValue >> 16) & 0xFF) // Extract 8 bits for DcSg
|
|
}
|
|
|
|
// DRV_STATUS_Register struct to represent the DRV_STATUS register
|
|
type DRV_STATUS_Register struct {
|
|
Register
|
|
SgResult uint16 // stallGuard2 result or motor temperature estimation in standstill (9 bits)
|
|
S2vsa bool // Short to supply indicator phase A
|
|
S2vsb bool // Short to supply indicator phase B
|
|
Stealth bool // stealthChop indicator
|
|
FsActive bool // Full step active indicator
|
|
CsActual uint8 // Actual motor current / smart energy current (5 bits)
|
|
StallGuard bool // stallGuard2 status
|
|
Ot bool // Overtemperature flag
|
|
Otpw bool // Overtemperature pre-warning flag
|
|
S2ga bool // Short to ground indicator phase A
|
|
S2gb bool // Short to ground indicator phase B
|
|
Ola bool // Open load indicator phase A
|
|
Olb bool // Open load indicator phase B
|
|
Stst bool // Standstill indicator
|
|
}
|
|
|
|
// NewDRV_STATUS creates a new DRV_STATUS register instance
|
|
func NewDRV_STATUS() *DRV_STATUS_Register {
|
|
return &DRV_STATUS_Register{
|
|
Register: Register{
|
|
RegisterAddr: DRV_STATUS,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for DRV_STATUS: overrides the base Pack
|
|
func (d *DRV_STATUS_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(d.SgResult&0x1FF) << 0 // SgResult: 9 bits
|
|
if d.S2vsa {
|
|
registerValue |= 1 << 12 // S2vsa: 1 bit
|
|
}
|
|
if d.S2vsb {
|
|
registerValue |= 1 << 13 // S2vsb: 1 bit
|
|
}
|
|
if d.Stealth {
|
|
registerValue |= 1 << 14 // Stealth: 1 bit
|
|
}
|
|
if d.FsActive {
|
|
registerValue |= 1 << 15 // FsActive: 1 bit
|
|
}
|
|
registerValue |= uint32(d.CsActual&0x1F) << 16 // CsActual: 5 bits
|
|
if d.StallGuard {
|
|
registerValue |= 1 << 24 // StallGuard: 1 bit
|
|
}
|
|
if d.Ot {
|
|
registerValue |= 1 << 25 // Ot: 1 bit
|
|
}
|
|
if d.Otpw {
|
|
registerValue |= 1 << 26 // Otpw: 1 bit
|
|
}
|
|
if d.S2ga {
|
|
registerValue |= 1 << 27 // S2ga: 1 bit
|
|
}
|
|
if d.S2gb {
|
|
registerValue |= 1 << 28 // S2gb: 1 bit
|
|
}
|
|
if d.Ola {
|
|
registerValue |= 1 << 29 // Ola: 1 bit
|
|
}
|
|
if d.Olb {
|
|
registerValue |= 1 << 30 // Olb: 1 bit
|
|
}
|
|
if d.Stst {
|
|
registerValue |= 1 << 31 // Stst: 1 bit
|
|
}
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for DRV_STATUS: overrides the base Unpack
|
|
func (d *DRV_STATUS_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
d.SgResult = uint16((registerValue >> 0) & 0x1FF) // Extract 9 bits for SgResult
|
|
d.S2vsa = (registerValue & (1 << 12)) != 0 // Extract 1 bit for S2vsa
|
|
d.S2vsb = (registerValue & (1 << 13)) != 0 // Extract 1 bit for S2vsb
|
|
d.Stealth = (registerValue & (1 << 14)) != 0 // Extract 1 bit for Stealth
|
|
d.FsActive = (registerValue & (1 << 15)) != 0 // Extract 1 bit for FsActive
|
|
d.CsActual = uint8((registerValue >> 16) & 0x1F) // Extract 5 bits for CsActual
|
|
d.StallGuard = (registerValue & (1 << 24)) != 0 // Extract 1 bit for StallGuard
|
|
d.Ot = (registerValue & (1 << 25)) != 0 // Extract 1 bit for Ot
|
|
d.Otpw = (registerValue & (1 << 26)) != 0 // Extract 1 bit for Otpw
|
|
d.S2ga = (registerValue & (1 << 27)) != 0 // Extract 1 bit for S2ga
|
|
d.S2gb = (registerValue & (1 << 28)) != 0 // Extract 1 bit for S2gb
|
|
d.Ola = (registerValue & (1 << 29)) != 0 // Extract 1 bit for Ola
|
|
d.Olb = (registerValue & (1 << 30)) != 0 // Extract 1 bit for Olb
|
|
d.Stst = (registerValue & (1 << 31)) != 0 // Extract 1 bit for Stst
|
|
}
|
|
|
|
// PWMCONF_Register struct to represent the PWMCONF register
|
|
type PWMCONF_Register struct {
|
|
Register
|
|
PwmOfs uint8 // User defined PWM amplitude offset (8 bits)
|
|
PwmGrad uint8 // User defined PWM amplitude gradient (8 bits)
|
|
PwmFreq uint8 // PWM frequency selection (2 bits)
|
|
PwmAutoscale bool // Enable PWM automatic amplitude scaling (1 bit)
|
|
PwmAutograd bool // PWM automatic gradient adaptation (1 bit)
|
|
Freewheel uint8 // Standstill option when motor current setting is zero (2 bits)
|
|
PwmReg uint8 // Regulation loop gradient (4 bits)
|
|
PwmLim uint8 // PWM automatic scale amplitude limit when switching on (4 bits)
|
|
}
|
|
|
|
// NewPWMCONF creates a new PWMCONF register instance
|
|
func NewPWMCONF() *PWMCONF_Register {
|
|
return &PWMCONF_Register{
|
|
Register: Register{
|
|
RegisterAddr: PWMCONF,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for PWMCONF: overrides the base Pack
|
|
func (p *PWMCONF_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(p.PwmOfs&0xFF) << 0 // PwmOfs: 8 bits
|
|
registerValue |= uint32(p.PwmGrad&0xFF) << 8 // PwmGrad: 8 bits
|
|
registerValue |= uint32(p.PwmFreq&0x3) << 16 // PwmFreq: 2 bits
|
|
if p.PwmAutoscale {
|
|
registerValue |= 1 << 18 // PwmAutoscale: 1 bit
|
|
}
|
|
if p.PwmAutograd {
|
|
registerValue |= 1 << 19 // PwmAutograd: 1 bit
|
|
}
|
|
registerValue |= uint32(p.Freewheel&0x3) << 20 // Freewheel: 2 bits
|
|
registerValue |= uint32(p.PwmReg&0xF) << 24 // PwmReg: 4 bits
|
|
registerValue |= uint32(p.PwmLim&0xF) << 28 // PwmLim: 4 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for PWMCONF: overrides the base Unpack
|
|
func (p *PWMCONF_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
p.PwmOfs = uint8((registerValue >> 0) & 0xFF) // Extract 8 bits for PwmOfs
|
|
p.PwmGrad = uint8((registerValue >> 8) & 0xFF) // Extract 8 bits for PwmGrad
|
|
p.PwmFreq = uint8((registerValue >> 16) & 0x3) // Extract 2 bits for PwmFreq
|
|
p.PwmAutoscale = (registerValue & (1 << 18)) != 0 // Extract 1 bit for PwmAutoscale
|
|
p.PwmAutograd = (registerValue & (1 << 19)) != 0 // Extract 1 bit for PwmAutograd
|
|
p.Freewheel = uint8((registerValue >> 20) & 0x3) // Extract 2 bits for Freewheel
|
|
p.PwmReg = uint8((registerValue >> 24) & 0xF) // Extract 4 bits for PwmReg
|
|
p.PwmLim = uint8((registerValue >> 28) & 0xF) // Extract 4 bits for PwmLim
|
|
}
|
|
|
|
// PWM_SCALE_Register struct to represent the PWM_SCALE register
|
|
type PWM_SCALE_Register struct {
|
|
Register
|
|
PwmScaleSum uint8 // Actual PWM duty cycle (8 bits)
|
|
PwmScaleAuto uint16 // Result of the automatic amplitude regulation based on current measurement (9 bits)
|
|
}
|
|
|
|
// NewPWM_SCALE creates a new PWM_SCALE register instance
|
|
func NewPWM_SCALE() *PWM_SCALE_Register {
|
|
return &PWM_SCALE_Register{
|
|
Register: Register{
|
|
RegisterAddr: PWM_SCALE,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for PWM_SCALE: overrides the base Pack
|
|
func (p *PWM_SCALE_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(p.PwmScaleSum&0xFF) << 0 // PwmScaleSum: 8 bits
|
|
registerValue |= uint32(p.PwmScaleAuto&0x1FF) << 16 // PwmScaleAuto: 9 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for PWM_SCALE: overrides the base Unpack
|
|
func (p *PWM_SCALE_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
p.PwmScaleSum = uint8((registerValue >> 0) & 0xFF) // Extract 8 bits for PwmScaleSum
|
|
p.PwmScaleAuto = uint16((registerValue >> 16) & 0x1FF) // Extract 9 bits for PwmScaleAuto
|
|
}
|
|
|
|
// PWM_AUTO_Register struct to represent the PWM_AUTO register
|
|
type PWM_AUTO_Register struct {
|
|
Register
|
|
PwmOfsAuto uint8 // Automatically determined offset value (8 bits)
|
|
PwmGradAuto uint8 // Automatically determined gradient value (8 bits)
|
|
}
|
|
|
|
// NewPWM_AUTO creates a new PWM_AUTO register instance
|
|
func NewPWM_AUTO() *PWM_AUTO_Register {
|
|
return &PWM_AUTO_Register{
|
|
Register: Register{
|
|
RegisterAddr: PWM_AUTO,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for PWM_AUTO: overrides the base Pack
|
|
func (p *PWM_AUTO_Register) Pack() uint32 {
|
|
var registerValue uint32
|
|
|
|
// Pack each field using bitwise operations
|
|
registerValue |= uint32(p.PwmOfsAuto&0xFF) << 0 // PwmOfsAuto: 8 bits
|
|
registerValue |= uint32(p.PwmGradAuto&0xFF) << 16 // PwmGradAuto: 8 bits
|
|
|
|
return registerValue
|
|
}
|
|
|
|
// Unpack method for PWM_AUTO: overrides the base Unpack
|
|
func (p *PWM_AUTO_Register) Unpack(registerValue uint32) {
|
|
// Unpack each field using bitwise operations
|
|
p.PwmOfsAuto = uint8((registerValue >> 0) & 0xFF) // Extract 8 bits for PwmOfsAuto
|
|
p.PwmGradAuto = uint8((registerValue >> 16) & 0xFF) // Extract 8 bits for PwmGradAuto
|
|
}
|
|
|
|
// MSCNT_Register struct to represent the MSCNT register (10-bit value)
|
|
type MSCNT_Register struct {
|
|
Register
|
|
Value uint16 // Microstep counter value (10 bits)
|
|
}
|
|
|
|
// NewMSCNT creates a new MSCNT register instance
|
|
func NewMSCNT() *MSCNT_Register {
|
|
return &MSCNT_Register{
|
|
Register: Register{
|
|
RegisterAddr: MSCNT,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for MSCNT: combines the 10-bit value into a 16-bit value
|
|
func (m *MSCNT_Register) Pack() uint16 {
|
|
return m.Value & 0x3FF // Mask the value to ensure it is within the 10-bit range (0-1023)
|
|
}
|
|
|
|
// Unpack method for MSCNT: extracts the 10-bit value from a 16-bit value
|
|
func (m *MSCNT_Register) Unpack(registerValue uint16) {
|
|
m.Value = registerValue & 0x3FF // Mask to extract the 10-bit value (0-1023)
|
|
}
|
|
|
|
// VDCMIN_Register struct for VDCMIN register (23 bits)
|
|
type VDCMIN_Register struct {
|
|
Register
|
|
Value uint32 // 23-bit value
|
|
}
|
|
|
|
// NewVDCMIN creates a new VDCMIN register instance
|
|
func NewVDCMIN() *VDCMIN_Register {
|
|
return &VDCMIN_Register{
|
|
Register: Register{
|
|
RegisterAddr: VDCMIN,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for VDCMIN: packs the 23-bit value into a 32-bit value
|
|
func (v *VDCMIN_Register) Pack() uint32 {
|
|
return v.Value & 0x7FFFFF // Mask to 23 bits
|
|
}
|
|
|
|
// Unpack method for VDCMIN: unpacks the 23-bit value from a 32-bit value
|
|
func (v *VDCMIN_Register) Unpack(registerValue uint32) {
|
|
v.Value = registerValue & 0x7FFFFF // Mask to 23 bits
|
|
}
|
|
|
|
// XLATCH_Register struct for XLATCH register (32 bits)
|
|
type XLATCH_Register struct {
|
|
Register
|
|
Value uint32 // 32-bit value
|
|
}
|
|
|
|
// NewXLATCH creates a new XLATCH register instance
|
|
func NewXLATCH() *XLATCH_Register {
|
|
return &XLATCH_Register{
|
|
Register: Register{
|
|
RegisterAddr: XLATCH,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for XLATCH: directly returns the 32-bit value
|
|
func (x *XLATCH_Register) Pack() uint32 {
|
|
return x.Value // No mask needed, since it's 32 bits
|
|
}
|
|
|
|
// Unpack method for XLATCH: unpacks the 32-bit value from a 32-bit register
|
|
func (x *XLATCH_Register) Unpack(registerValue uint32) {
|
|
x.Value = registerValue // Direct assignment since it's 32 bits
|
|
}
|
|
|
|
// RAMPMODE_Register struct for RAMPMODE register (2 bits)
|
|
type RAMPMODE_Register struct {
|
|
Register
|
|
mode RampMode // Mode is now an enum-like type
|
|
comm RegisterComm
|
|
driverIndex uint8
|
|
}
|
|
type RampMode uint8
|
|
|
|
const (
|
|
PositioningMode RampMode = iota // 0
|
|
VelocityPositiveMode // 1
|
|
VelocityNegativeMode // 2
|
|
HoldMode // 3
|
|
)
|
|
|
|
func NewRAMPMODE(comm RegisterComm, driverIndex uint8) *RAMPMODE_Register {
|
|
return &RAMPMODE_Register{
|
|
Register: Register{
|
|
RegisterAddr: RAMPMODE,
|
|
},
|
|
driverIndex: driverIndex,
|
|
comm: comm,
|
|
mode: PositioningMode, // Default to Positioning Mode
|
|
}
|
|
}
|
|
|
|
// SetMode sets the mode of the RAMPMODE register
|
|
func (r *RAMPMODE_Register) SetMode(mode RampMode) error {
|
|
r.mode = mode
|
|
registerValue := r.Pack()
|
|
return r.comm.WriteRegister(r.RegisterAddr, uint32(registerValue), r.driverIndex)
|
|
}
|
|
|
|
// GetMode returns the current mode of the RAMPMODE register
|
|
func (r *RAMPMODE_Register) GetMode() (RampMode, error) {
|
|
registerValue, err := r.comm.ReadRegister(r.RegisterAddr, r.driverIndex)
|
|
if err != nil {
|
|
return 0, err //Defaults to Postioning Mode
|
|
}
|
|
|
|
// Unpack the register value to get the mode
|
|
r.Unpack(uint8(registerValue))
|
|
return r.mode, nil
|
|
|
|
}
|
|
|
|
// Pack method for RAMPMODE: packs the mode value into a single byte (now using enums)
|
|
func (r *RAMPMODE_Register) Pack() uint8 {
|
|
return uint8(r.mode) // Simply cast the mode to uint8
|
|
}
|
|
|
|
// Unpack method for RAMPMODE: unpacks the mode value from a byte
|
|
func (r *RAMPMODE_Register) Unpack(registerValue uint8) {
|
|
r.mode = RampMode(registerValue & 0x03) // Mask to 2 bits
|
|
}
|
|
|
|
// String method to display the mode as a string (useful for logging or debugging)
|
|
func (r RampMode) String() string {
|
|
switch r {
|
|
case PositioningMode:
|
|
return "Positioning Mode"
|
|
case VelocityPositiveMode:
|
|
return "Velocity Mode (Positive VMAX)"
|
|
case VelocityNegativeMode:
|
|
return "Velocity Mode (Negative VMAX)"
|
|
case HoldMode:
|
|
return "Hold Mode"
|
|
default:
|
|
return "Unknown Mode"
|
|
}
|
|
}
|
|
|
|
// XACTUAL_Register struct for XACTUAL register (32 bits)
|
|
type XACTUAL_Register struct {
|
|
Register
|
|
Value uint32 // 32-bit value
|
|
}
|
|
|
|
// NewXACTUAL creates a new XACTUAL register instance
|
|
func NewXACTUAL() *XACTUAL_Register {
|
|
return &XACTUAL_Register{
|
|
Register: Register{
|
|
RegisterAddr: XACTUAL,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for XACTUAL: returns the 32-bit value
|
|
func (x *XACTUAL_Register) Pack() uint32 {
|
|
return x.Value // 32 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for XACTUAL: unpacks the 32-bit value
|
|
func (x *XACTUAL_Register) Unpack(registerValue uint32) {
|
|
x.Value = registerValue // Direct assignment since it's 32 bits
|
|
}
|
|
|
|
// VACTUAL_Register struct for VACTUAL register (24 bits)
|
|
type VACTUAL_Register struct {
|
|
Register
|
|
Value uint32 // 24-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewVACTUAL creates a new VACTUAL register instance
|
|
func NewVACTUAL() *VACTUAL_Register {
|
|
return &VACTUAL_Register{
|
|
Register: Register{
|
|
RegisterAddr: VACTUAL,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for VACTUAL: packs the 24-bit value into a 32-bit value
|
|
func (v *VACTUAL_Register) Pack() uint32 {
|
|
return v.Value & 0xFFFFFF // Mask to 24 bits
|
|
}
|
|
|
|
// Unpack method for VACTUAL: unpacks the 24-bit value from a 32-bit value
|
|
func (v *VACTUAL_Register) Unpack(registerValue uint32) {
|
|
v.Value = registerValue & 0xFFFFFF // Mask to 24 bits
|
|
}
|
|
|
|
// VSTART_Register struct for VSTART register (18 bits)
|
|
type VSTART_Register struct {
|
|
Register
|
|
Value uint32 // 18-bit value
|
|
}
|
|
|
|
// NewVSTART creates a new VSTART register instance
|
|
func NewVSTART() *VSTART_Register {
|
|
return &VSTART_Register{
|
|
Register: Register{
|
|
RegisterAddr: VSTART,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for VSTART: packs the 18-bit value into a 16-bit value
|
|
func (v *VSTART_Register) Pack() uint32 {
|
|
return v.Value & 0x3FFFF // Mask to 18 bits
|
|
}
|
|
|
|
// Unpack method for VSTART: unpacks the 18-bit value from a 16-bit value
|
|
func (v *VSTART_Register) Unpack(registerValue uint32) {
|
|
v.Value = registerValue & 0x3FFFF // Mask to 18 bits
|
|
}
|
|
|
|
// A1_Register struct for A1 register (16 bits)
|
|
type A1_Register struct {
|
|
Register
|
|
Value uint16 // 16-bit value
|
|
}
|
|
|
|
// NewA1 creates a new A1 register instance
|
|
func NewA1() *A1_Register {
|
|
return &A1_Register{
|
|
Register: Register{
|
|
RegisterAddr: A_1,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for A1: returns the 16-bit value
|
|
func (a *A1_Register) Pack() uint16 {
|
|
return a.Value // 16 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for A1: unpacks the 16-bit value
|
|
func (a *A1_Register) Unpack(registerValue uint16) {
|
|
a.Value = registerValue // Direct assignment since it's 16 bits
|
|
}
|
|
|
|
// V1_Register struct for V1 register (20 bits)
|
|
type V1_Register struct {
|
|
Register
|
|
Value uint32 // 20-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewV1 creates a new V1 register instance
|
|
func NewV1() *V1_Register {
|
|
return &V1_Register{
|
|
Register: Register{
|
|
RegisterAddr: V_1,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for V1: packs the 20-bit value into a 32-bit value
|
|
func (v *V1_Register) Pack() uint32 {
|
|
return v.Value & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// Unpack method for V1: unpacks the 20-bit value from a 32-bit value
|
|
func (v *V1_Register) Unpack(registerValue uint32) {
|
|
v.Value = registerValue & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// AMAX_Register struct for AMAX register (16 bits)
|
|
type AMAX_Register struct {
|
|
Register
|
|
Value uint16 // 16-bit value
|
|
}
|
|
|
|
// NewAMAX creates a new AMAX register instance
|
|
func NewAMAX() *AMAX_Register {
|
|
return &AMAX_Register{
|
|
Register: Register{
|
|
RegisterAddr: AMAX,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for AMAX: returns the 16-bit value
|
|
func (a *AMAX_Register) Pack() uint16 {
|
|
return a.Value // 16 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for AMAX: unpacks the 16-bit value
|
|
func (a *AMAX_Register) Unpack(registerValue uint16) {
|
|
a.Value = registerValue // Direct assignment since it's 16 bits
|
|
}
|
|
|
|
// VMAX_Register struct for VMAX register (23 bits)
|
|
type VMAX_Register struct {
|
|
Register
|
|
Value uint32 // 23-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewVMAX creates a new VMAX register instance
|
|
func NewVMAX() *VMAX_Register {
|
|
return &VMAX_Register{
|
|
Register: Register{
|
|
RegisterAddr: VMAX,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for VMAX: packs the 23-bit value into a 32-bit value
|
|
func (v *VMAX_Register) Pack() uint32 {
|
|
return v.Value & 0x7FFFFF // Mask to 23 bits
|
|
}
|
|
|
|
// Unpack method for VMAX: unpacks the 23-bit value from a 32-bit value
|
|
func (v *VMAX_Register) Unpack(registerValue uint32) {
|
|
v.Value = registerValue & 0x7FFFFF // Mask to 23 bits
|
|
}
|
|
|
|
// D1_Register struct for D1 register (16 bits)
|
|
type D1_Register struct {
|
|
Register
|
|
Value uint16 // 16-bit value
|
|
}
|
|
|
|
// NewD1 creates a new D1 register instance
|
|
func NewD1() *D1_Register {
|
|
return &D1_Register{
|
|
Register: Register{
|
|
RegisterAddr: D_1,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for D1: returns the 16-bit value
|
|
func (d *D1_Register) Pack() uint16 {
|
|
return d.Value // 16 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for D1: unpacks the 16-bit value
|
|
func (d *D1_Register) Unpack(registerValue uint16) {
|
|
d.Value = registerValue // Direct assignment since it's 16 bits
|
|
}
|
|
|
|
// VSTOP_Register struct for VSTOP register (18 bits)
|
|
type VSTOP_Register struct {
|
|
Register
|
|
Value uint32 // 18-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewVSTOP creates a new VSTOP register instance
|
|
func NewVSTOP() *VSTOP_Register {
|
|
return &VSTOP_Register{
|
|
Register: Register{
|
|
RegisterAddr: VSTOP,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for VSTOP: packs the 18-bit value into a 32-bit value
|
|
func (v *VSTOP_Register) Pack() uint32 {
|
|
return v.Value & 0x3FFFF // Mask to 18 bits
|
|
}
|
|
|
|
// Unpack method for VSTOP: unpacks the 18-bit value from a 32-bit value
|
|
func (v *VSTOP_Register) Unpack(registerValue uint32) {
|
|
v.Value = registerValue & 0x3FFFF // Mask to 18 bits
|
|
}
|
|
|
|
// TZEROWAIT_Register struct for TZEROWAIT register (16 bits)
|
|
type TZEROWAIT_Register struct {
|
|
Register
|
|
Value uint16 // 16-bit value
|
|
}
|
|
|
|
// NewTZEROWAIT creates a new TZEROWAIT register instance
|
|
func NewTZEROWAIT() *TZEROWAIT_Register {
|
|
return &TZEROWAIT_Register{
|
|
Register: Register{
|
|
RegisterAddr: TZEROWAIT,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for TZEROWAIT: returns the 16-bit value
|
|
func (t *TZEROWAIT_Register) Pack() uint16 {
|
|
return t.Value // 16 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for TZEROWAIT: unpacks the 16-bit value
|
|
func (t *TZEROWAIT_Register) Unpack(registerValue uint16) {
|
|
t.Value = registerValue // Direct assignment since it's 16 bits
|
|
}
|
|
|
|
// XTARGET_Register struct for XTARGET register (32 bits)
|
|
type XTARGET_Register struct {
|
|
Register
|
|
Value uint32 // 32-bit value
|
|
}
|
|
|
|
// NewXTARGET creates a new XTARGET register instance
|
|
func NewXTARGET() *XTARGET_Register {
|
|
return &XTARGET_Register{
|
|
Register: Register{
|
|
RegisterAddr: XTARGET,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for XTARGET: returns the 32-bit value
|
|
func (x *XTARGET_Register) Pack() uint32 {
|
|
return x.Value // 32 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for XTARGET: unpacks the 32-bit value
|
|
func (x *XTARGET_Register) Unpack(registerValue uint32) {
|
|
x.Value = registerValue // Direct assignment since it's 32 bits
|
|
}
|
|
|
|
// X_COMPARE_Register struct for X_COMPARE register (32 bits)
|
|
type X_COMPARE_Register struct {
|
|
Register
|
|
Value uint32 // 32-bit value for position comparison
|
|
}
|
|
|
|
// NewX_COMPARE creates a new X_COMPARE register instance
|
|
func NewX_COMPARE() *X_COMPARE_Register {
|
|
return &X_COMPARE_Register{
|
|
Register: Register{
|
|
RegisterAddr: X_COMPARE,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for X_COMPARE: returns the 32-bit value
|
|
func (x *X_COMPARE_Register) Pack() uint32 {
|
|
return x.Value // 32 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for X_COMPARE: unpacks the 32-bit value
|
|
func (x *X_COMPARE_Register) Unpack(registerValue uint32) {
|
|
x.Value = registerValue // Direct assignment since it's 32 bits
|
|
}
|
|
|
|
// GLOBAL_SCALER_Register struct for GLOBAL SCALER register (8 bits)
|
|
type GLOBAL_SCALER_Register struct {
|
|
Register
|
|
Value uint8 // 8-bit value for global motor current scaling
|
|
}
|
|
|
|
// NewGLOBAL_SCALER creates a new GLOBAL_SCALER register instance
|
|
func NewGLOBAL_SCALER() *GLOBAL_SCALER_Register {
|
|
return &GLOBAL_SCALER_Register{
|
|
Register: Register{
|
|
RegisterAddr: GLOBAL_SCALER,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for GLOBAL_SCALER: returns the 8-bit value
|
|
func (g *GLOBAL_SCALER_Register) Pack() uint8 {
|
|
return g.Value // 8 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for GLOBAL_SCALER: unpacks the 8-bit value
|
|
func (g *GLOBAL_SCALER_Register) Unpack(registerValue uint8) {
|
|
g.Value = registerValue // Direct assignment since it's 8 bits
|
|
}
|
|
|
|
// TPOWERDOWN_Register struct for TPOWERDOWN register (8 bits)
|
|
type TPOWERDOWN_Register struct {
|
|
Register
|
|
Value uint8 // 8-bit value for time delay after standstill
|
|
}
|
|
|
|
// NewTPOWERDOWN creates a new TPOWERDOWN register instance
|
|
func NewTPOWERDOWN() *TPOWERDOWN_Register {
|
|
return &TPOWERDOWN_Register{
|
|
Register: Register{
|
|
RegisterAddr: TPOWERDOWN,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for TPOWERDOWN: returns the 8-bit value
|
|
func (t *TPOWERDOWN_Register) Pack() uint8 {
|
|
return t.Value // 8 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for TPOWERDOWN: unpacks the 8-bit value
|
|
func (t *TPOWERDOWN_Register) Unpack(registerValue uint8) {
|
|
t.Value = registerValue // Direct assignment since it's 8 bits
|
|
}
|
|
|
|
// PWMTHRS_Register struct for PWMTHRS register (20 bits)
|
|
type PWMTHRS_Register struct {
|
|
Register
|
|
Value uint32 // 20-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewPWMTHRS creates a new PWMTHRS register instance
|
|
func NewPWMTHRS() *PWMTHRS_Register {
|
|
return &PWMTHRS_Register{
|
|
Register: Register{
|
|
RegisterAddr: TPWMTHRS,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for PWMTHRS: packs the 20-bit value into a 32-bit value
|
|
func (p *PWMTHRS_Register) Pack() uint32 {
|
|
return p.Value & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// Unpack method for PWMTHRS: unpacks the 20-bit value from a 32-bit value
|
|
func (p *PWMTHRS_Register) Unpack(registerValue uint32) {
|
|
p.Value = registerValue & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// TCOOLTHRS_Register struct for TCOOLTHRS register (20 bits)
|
|
type TCOOLTHRS_Register struct {
|
|
Register
|
|
Value uint32 // 20-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewTCOOLTHRS creates a new TCOOLTHRS register instance
|
|
func NewTCOOLTHRS() *TCOOLTHRS_Register {
|
|
return &TCOOLTHRS_Register{
|
|
Register: Register{
|
|
RegisterAddr: TCOOLTHRS,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for TCOOLTHRS: packs the 20-bit value into a 32-bit value
|
|
func (t *TCOOLTHRS_Register) Pack() uint32 {
|
|
return t.Value & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// Unpack method for TCOOLTHRS: unpacks the 20-bit value from a 32-bit value
|
|
func (t *TCOOLTHRS_Register) Unpack(registerValue uint32) {
|
|
t.Value = registerValue & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// THIGH_Register struct for THIGH register (16 bits)
|
|
type THIGH_Register struct {
|
|
Register
|
|
Value uint16 // 16-bit value
|
|
}
|
|
|
|
// NewTHIGH creates a new THIGH register instance
|
|
func NewTHIGH() *THIGH_Register {
|
|
return &THIGH_Register{
|
|
Register: Register{
|
|
RegisterAddr: THIGH,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for THIGH: returns the 16-bit value
|
|
func (t *THIGH_Register) Pack() uint16 {
|
|
return t.Value // 16 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for THIGH: unpacks the 16-bit value
|
|
func (t *THIGH_Register) Unpack(registerValue uint16) {
|
|
t.Value = registerValue // Direct assignment since it's 16 bits
|
|
}
|
|
|
|
// DMAX_Register struct for DMAX register (16 bits)
|
|
type DMAX_Register struct {
|
|
Register
|
|
Value uint16 // 16-bit value for deceleration between VMAX and VSTOP
|
|
}
|
|
|
|
// NewDMAX creates a new DMAX register instance
|
|
func NewDMAX() *DMAX_Register {
|
|
return &DMAX_Register{
|
|
Register: Register{
|
|
RegisterAddr: DMAX,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for DMAX: returns the 16-bit value
|
|
func (d *DMAX_Register) Pack() uint16 {
|
|
return d.Value // 16 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for DMAX: unpacks the 16-bit value
|
|
func (d *DMAX_Register) Unpack(registerValue uint16) {
|
|
d.Value = registerValue // Direct assignment since it's 16 bits
|
|
}
|
|
|
|
// TSTEP_Register struct for TSTEP register (20 bits)
|
|
type TSTEP_Register struct {
|
|
Register
|
|
Value uint32 // 20-bit value (stored in a 32-bit field)
|
|
}
|
|
|
|
// NewTSTEP creates a new TSTEP register instance
|
|
func NewTSTEP() *TSTEP_Register {
|
|
return &TSTEP_Register{
|
|
Register: Register{
|
|
RegisterAddr: TSTEP,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for TSTEP: packs the 20-bit value into a 32-bit value
|
|
func (t *TSTEP_Register) Pack() uint32 {
|
|
return t.Value & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// Unpack method for TSTEP: unpacks the 20-bit value from a 32-bit value
|
|
func (t *TSTEP_Register) Unpack(registerValue uint32) {
|
|
t.Value = registerValue & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// X_ENC_Register struct for X_ENC register (32 bits)
|
|
type X_ENC_Register struct {
|
|
Register
|
|
Value int32 // 32-bit signed value for actual encoder position
|
|
}
|
|
|
|
// NewX_ENC creates a new X_ENC register instance
|
|
func NewX_ENC() *X_ENC_Register {
|
|
return &X_ENC_Register{
|
|
Register: Register{
|
|
RegisterAddr: X_ENC,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for X_ENC: returns the 32-bit signed value
|
|
func (x *X_ENC_Register) Pack() int32 {
|
|
return x.Value // 32 bits, no masking needed for signed integer
|
|
}
|
|
|
|
// Unpack method for X_ENC: unpacks the 32-bit signed value
|
|
func (x *X_ENC_Register) Unpack(registerValue int32) {
|
|
x.Value = registerValue // Direct assignment since it's 32 bits signed integer
|
|
}
|
|
|
|
// ENC_CONST_Register struct for ENC_CONST register (32 bits)
|
|
type ENC_CONST_Register struct {
|
|
Register
|
|
Value int32 // 32-bit signed accumulation constant
|
|
}
|
|
|
|
// NewENC_CONST creates a new ENC_CONST register instance
|
|
func NewENC_CONST() *ENC_CONST_Register {
|
|
return &ENC_CONST_Register{
|
|
Register: Register{
|
|
RegisterAddr: ENC_CONST,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for ENC_CONST: returns the 32-bit signed accumulation constant
|
|
func (e *ENC_CONST_Register) Pack() int32 {
|
|
return e.Value // 32 bits, no masking needed for signed integer
|
|
}
|
|
|
|
// Unpack method for ENC_CONST: unpacks the 32-bit signed accumulation constant
|
|
func (e *ENC_CONST_Register) Unpack(registerValue int32) {
|
|
e.Value = registerValue // Direct assignment since it's 32 bits signed integer
|
|
}
|
|
|
|
// ENC_LATCH_Register struct for ENC_LATCH register (32 bits)
|
|
type ENC_LATCH_Register struct {
|
|
Register
|
|
Value int32 // 32-bit signed value for encoder position latched on N event
|
|
}
|
|
|
|
// NewENC_LATCH creates a new ENC_LATCH register instance
|
|
func NewENC_LATCH() *ENC_LATCH_Register {
|
|
return &ENC_LATCH_Register{
|
|
Register: Register{
|
|
RegisterAddr: ENC_LATCH,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for ENC_LATCH: returns the 32-bit signed value
|
|
func (e *ENC_LATCH_Register) Pack() int32 {
|
|
return e.Value // 32 bits, no masking needed for signed integer
|
|
}
|
|
|
|
// Unpack method for ENC_LATCH: unpacks the 32-bit signed value
|
|
func (e *ENC_LATCH_Register) Unpack(registerValue int32) {
|
|
e.Value = registerValue // Direct assignment since it's 32 bits signed integer
|
|
}
|
|
|
|
// ENC_DEVIATION_Register struct for ENC_DEVIATION register (20 bits)
|
|
type ENC_DEVIATION_Register struct {
|
|
Register
|
|
Value uint32 // 20-bit unsigned value for maximum deviation
|
|
}
|
|
|
|
// NewENC_DEVIATION creates a new ENC_DEVIATION register instance
|
|
func NewENC_DEVIATION() *ENC_DEVIATION_Register {
|
|
return &ENC_DEVIATION_Register{
|
|
Register: Register{
|
|
RegisterAddr: ENC_DEVIATION,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for ENC_DEVIATION: packs the 20-bit value into a 32-bit value
|
|
func (e *ENC_DEVIATION_Register) Pack() uint32 {
|
|
return e.Value & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// Unpack method for ENC_DEVIATION: unpacks the 20-bit value from a 32-bit value
|
|
func (e *ENC_DEVIATION_Register) Unpack(registerValue uint32) {
|
|
e.Value = registerValue & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// MSCURACT_Register struct for MSCURACT register (18 bits)
|
|
type MSCURACT_Register struct {
|
|
Register
|
|
CUR_B int16 // 9-bit signed value for motor phase B (sine wave)
|
|
CUR_A int16 // 9-bit signed value for motor phase A (cosine wave)
|
|
}
|
|
|
|
// NewMSCURACT creates a new MSCURACT register instance
|
|
func NewMSCURACT() *MSCURACT_Register {
|
|
return &MSCURACT_Register{
|
|
Register: Register{
|
|
RegisterAddr: MSCURACT,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for MSCURACT: packs the 9-bit signed values for CUR_B and CUR_A into a 32-bit value
|
|
func (m *MSCURACT_Register) Pack() uint32 {
|
|
return uint32(m.CUR_A<<16 | m.CUR_B) // Combine CUR_A and CUR_B into a 32-bit value
|
|
}
|
|
|
|
// Unpack method for MSCURACT: unpacks the 32-bit value into CUR_B and CUR_A
|
|
func (m *MSCURACT_Register) Unpack(registerValue uint32) {
|
|
m.CUR_B = int16(registerValue & 0x1FF) // Mask to get the lower 9 bits for CUR_B
|
|
m.CUR_A = int16((registerValue >> 16) & 0x1FF) // Mask to get the next 9 bits for CUR_A
|
|
}
|
|
|
|
// LOST_STEPS_Register struct for LOST_STEPS register (20 bits)
|
|
type LOST_STEPS_Register struct {
|
|
Register
|
|
Value uint32 // 20-bit unsigned value for lost steps count
|
|
}
|
|
|
|
// NewLOST_STEPS creates a new LOST_STEPS register instance
|
|
func NewLOST_STEPS() *LOST_STEPS_Register {
|
|
return &LOST_STEPS_Register{
|
|
Register: Register{
|
|
RegisterAddr: LOST_STEPS,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for LOST_STEPS: returns the 20-bit value
|
|
func (l *LOST_STEPS_Register) Pack() uint32 {
|
|
return l.Value & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// Unpack method for LOST_STEPS: unpacks the 20-bit value from a 32-bit value
|
|
func (l *LOST_STEPS_Register) Unpack(registerValue uint32) {
|
|
l.Value = registerValue & 0xFFFFF // Mask to 20 bits
|
|
}
|
|
|
|
// MSLUTSEL_Register struct for MSLUTSEL register (32 bits)
|
|
type MSLUTSEL_Register struct {
|
|
Register
|
|
X3 uint8 // 3-bit value for LUT segment 3 start
|
|
X2 uint8 // 3-bit value for LUT segment 2 start
|
|
X1 uint8 // 3-bit value for LUT segment 1 start
|
|
W3 uint8 // 2-bit value for LUT width control W3
|
|
W2 uint8 // 2-bit value for LUT width control W2
|
|
W1 uint8 // 2-bit value for LUT width control W1
|
|
W0 uint8 // 2-bit value for LUT width control W0
|
|
}
|
|
|
|
// NewMSLUTSEL creates a new MSLUTSEL register instance
|
|
func NewMSLUTSEL() *MSLUTSEL_Register {
|
|
return &MSLUTSEL_Register{
|
|
Register: Register{
|
|
RegisterAddr: MSLUTSEL,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for MSLUTSEL: combines all the fields into a 32-bit value
|
|
func (m *MSLUTSEL_Register) Pack() uint32 {
|
|
return uint32(m.X3<<27 | m.X2<<24 | m.X1<<21 | m.W3<<18 | m.W2<<16 | m.W1<<14 | m.W0<<12) // Combine fields into a 32-bit value
|
|
}
|
|
|
|
// Unpack method for MSLUTSEL: unpacks the 32-bit value into individual fields
|
|
func (m *MSLUTSEL_Register) Unpack(registerValue uint32) {
|
|
m.X3 = uint8((registerValue >> 27) & 0x07) // Extract the 3 bits for X3
|
|
m.X2 = uint8((registerValue >> 24) & 0x07) // Extract the 3 bits for X2
|
|
m.X1 = uint8((registerValue >> 21) & 0x07) // Extract the 3 bits for X1
|
|
m.W3 = uint8((registerValue >> 18) & 0x03) // Extract the 2 bits for W3
|
|
m.W2 = uint8((registerValue >> 16) & 0x03) // Extract the 2 bits for W2
|
|
m.W1 = uint8((registerValue >> 14) & 0x03) // Extract the 2 bits for W1
|
|
m.W0 = uint8((registerValue >> 12) & 0x03) // Extract the 2 bits for W0
|
|
}
|
|
|
|
// MSLUT_Register struct for MSLUT register (32 bits)
|
|
type MSLUT_Register struct {
|
|
Register
|
|
Value uint32 // 32-bit value for microstep table entry
|
|
}
|
|
|
|
// NewMSLUT creates a new MSLUT register instance
|
|
func NewMSLUT() *MSLUT_Register {
|
|
return &MSLUT_Register{
|
|
Register: Register{
|
|
RegisterAddr: MSLUT0,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for MSLUT: returns the 32-bit value for the microstep entry
|
|
func (m *MSLUT_Register) Pack() uint32 {
|
|
return m.Value // 32 bits, no masking needed
|
|
}
|
|
|
|
// Unpack method for MSLUT: unpacks the 32-bit value into the microstep entry
|
|
func (m *MSLUT_Register) Unpack(registerValue uint32) {
|
|
m.Value = registerValue // Direct assignment since it's 32 bits
|
|
}
|
|
|
|
// MSLUTSTART_Register struct for MSLUTSTART register (16 bits)
|
|
type MSLUTSTART_Register struct {
|
|
Register
|
|
START_SIN int8 // 8-bit signed value for the absolute current at microstep entry 0
|
|
START_SIN90 int8 // 8-bit signed value for the absolute current at microstep entry 256
|
|
}
|
|
|
|
// NewMSLUTSTART creates a new MSLUTSTART register instance
|
|
func NewMSLUTSTART() *MSLUTSTART_Register {
|
|
return &MSLUTSTART_Register{
|
|
Register: Register{
|
|
RegisterAddr: MSLUTSTART,
|
|
},
|
|
}
|
|
}
|
|
|
|
// Pack method for MSLUTSTART: combines START_SIN and START_SIN90 into a 16-bit value
|
|
func (m *MSLUTSTART_Register) Pack() uint16 {
|
|
return uint16(m.START_SIN) | (uint16(m.START_SIN90) << 8) // Combine the 8-bit values into a 16-bit value
|
|
}
|
|
|
|
// Unpack method for MSLUTSTART: unpacks the 16-bit value into START_SIN and START_SIN90
|
|
func (m *MSLUTSTART_Register) Unpack(registerValue uint16) {
|
|
m.START_SIN = int8(registerValue & 0xFF) // Extract the lower 8 bits for START_SIN
|
|
m.START_SIN90 = int8((registerValue >> 8) & 0xFF) // Extract the upper 8 bits for START_SIN90
|
|
}
|
|
|
|
// Function to calculate the sine wave values for the microstep table
|
|
func calculateSineWaveTable() []int {
|
|
// Create a slice to store the sine wave table
|
|
table := make([]int, 256)
|
|
|
|
// Loop through each table index (i)
|
|
for i := 0; i < 256; i++ {
|
|
// Calculate the sine value and scale it by 248
|
|
sineValue := 248 * math.Sin(2*math.Pi*float32(i)/1024)
|
|
|
|
// Round the result and subtract 1
|
|
roundedValue := int(math.Round(sineValue)) - 1
|
|
|
|
// Store the value in the table
|
|
table[i] = roundedValue
|
|
}
|
|
|
|
return table
|
|
}
|