Zephyr Project API 4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
stepper_trinamic.h
Go to the documentation of this file.
1
7
8/*
9 * SPDX-FileCopyrightText: Copyright (c) 2024 Carl Zeiss Meditec AG
10 * SPDX-FileCopyrightText: Copyright (c) 2025 Prevas A/S
11 *
12 * SPDX-License-Identifier: Apache-2.0
13 */
14
15#ifndef ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_
16#define ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_
17
26
27#include <stdint.h>
29
30#ifdef __cplusplus
31extern "C" {
32#endif
33
37#define TMC_RAMP_VSTART_MAX GENMASK(17, 0)
38#define TMC_RAMP_VSTART_MIN 0
39#define TMC_RAMP_V1_MAX GENMASK(19, 0)
40#define TMC_RAMP_V1_MIN 0
41#define TMC_RAMP_VMAX_MAX (GENMASK(22, 0) - 512)
42#define TMC_RAMP_VMAX_MIN 0
43#define TMC_RAMP_A1_MAX GENMASK(15, 0)
44#define TMC_RAMP_A1_MIN 0
45#define TMC_RAMP_AMAX_MAX GENMASK(15, 0)
46#define TMC_RAMP_AMAX_MIN 0
47#define TMC_RAMP_D1_MAX GENMASK(15, 0)
48#define TMC_RAMP_D1_MIN 1
49#define TMC_RAMP_DMAX_MAX GENMASK(15, 0)
50#define TMC_RAMP_DMAX_MIN 0
51#define TMC_RAMP_VSTOP_MAX GENMASK(17, 0)
52#define TMC_RAMP_VSTOP_MIN 1
53#define TMC_RAMP_TZEROWAIT_MAX (GENMASK(15, 0) - 512)
54#define TMC_RAMP_TZEROWAIT_MIN 0
55#define TMC_RAMP_IHOLD_IRUN_MAX GENMASK(4, 0)
56#define TMC_RAMP_IHOLD_IRUN_MIN 0
57#define TMC_RAMP_IHOLDDELAY_MAX GENMASK(3, 0)
58#define TMC_RAMP_IHOLDDELAY_MIN 0
59#define TMC_RAMP_VACTUAL_SHIFT 22
60#define TMC_RAMP_XACTUAL_SHIFT 31
61
62/* TMC50XX specific */
63#define TMC_RAMP_VCOOLTHRS_MAX GENMASK(22, 0)
64#define TMC_RAMP_VCOOLTHRS_MIN 0
65#define TMC_RAMP_VHIGH_MAX GENMASK(22, 0)
66#define TMC_RAMP_VHIGH_MIN 0
67
68/* TMC51XX specific */
69#define TMC_RAMP_TPOWERDOWN_MAX GENMASK(7, 0)
70#define TMC_RAMP_TPOWERDOWN_MIN 0
71#define TMC_RAMP_TPWMTHRS_MAX GENMASK(19, 0)
72#define TMC_RAMP_TPWMTHRS_MIN 0
73#define TMC_RAMP_TCOOLTHRS_MAX GENMASK(19, 0)
74#define TMC_RAMP_TCOOLTHRS_MIN 0
75#define TMC_RAMP_THIGH_MAX GENMASK(19, 0)
76#define TMC_RAMP_THIGH_MIN 0
77
107
111#define CHECK_RAMP_DT_DATA(node) \
112 COND_CODE_1(DT_PROP_EXISTS(node, vstart), \
113 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstart), TMC_RAMP_VSTART_MIN, \
114 TMC_RAMP_VSTART_MAX), "vstart out of range"), ()); \
115 COND_CODE_1(DT_PROP_EXISTS(node, v1), \
116 BUILD_ASSERT(IN_RANGE(DT_PROP(node, v1), TMC_RAMP_V1_MIN, \
117 TMC_RAMP_V1_MAX), "v1 out of range"), ()); \
118 COND_CODE_1(DT_PROP_EXISTS(node, vmax), \
119 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vmax), TMC_RAMP_VMAX_MIN, \
120 TMC_RAMP_VMAX_MAX), "vmax out of range"), ()); \
121 COND_CODE_1(DT_PROP_EXISTS(node, a1), \
122 BUILD_ASSERT(IN_RANGE(DT_PROP(node, a1), TMC_RAMP_A1_MIN, \
123 TMC_RAMP_A1_MAX), "a1 out of range"), ()); \
124 COND_CODE_1(DT_PROP_EXISTS(node, amax), \
125 BUILD_ASSERT(IN_RANGE(DT_PROP(node, amax), TMC_RAMP_AMAX_MIN, \
126 TMC_RAMP_AMAX_MAX), "amax out of range"), ()); \
127 COND_CODE_1(DT_PROP_EXISTS(node, d1), \
128 BUILD_ASSERT(IN_RANGE(DT_PROP(node, d1), TMC_RAMP_D1_MIN, \
129 TMC_RAMP_D1_MAX), "d1 out of range"), ()); \
130 COND_CODE_1(DT_PROP_EXISTS(node, dmax), \
131 BUILD_ASSERT(IN_RANGE(DT_PROP(node, dmax), TMC_RAMP_DMAX_MIN, \
132 TMC_RAMP_DMAX_MAX), "dmax out of range"), ()); \
133 COND_CODE_1(DT_PROP_EXISTS(node, vstop), \
134 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstop), TMC_RAMP_VSTOP_MIN, \
135 TMC_RAMP_VSTOP_MAX), "vstop out of range"), ()); \
136 COND_CODE_1(DT_PROP_EXISTS(node, tzerowait), \
137 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tzerowait), TMC_RAMP_TZEROWAIT_MIN, \
138 TMC_RAMP_TZEROWAIT_MAX), "tzerowait out of range"), ()); \
139 COND_CODE_1(DT_PROP_EXISTS(node, ihold), \
140 BUILD_ASSERT(IN_RANGE(DT_PROP(node, ihold), TMC_RAMP_IHOLD_IRUN_MIN, \
141 TMC_RAMP_IHOLD_IRUN_MAX), "ihold out of range"), ()); \
142 COND_CODE_1(DT_PROP_EXISTS(node, irun), \
143 BUILD_ASSERT(IN_RANGE(DT_PROP(node, irun), TMC_RAMP_IHOLD_IRUN_MIN, \
144 TMC_RAMP_IHOLD_IRUN_MAX), "irun out of range"), ()); \
145 COND_CODE_1(DT_PROP_EXISTS(node, iholddelay), \
146 BUILD_ASSERT(IN_RANGE(DT_PROP(node, iholddelay), TMC_RAMP_IHOLDDELAY_MIN, \
147 TMC_RAMP_IHOLDDELAY_MAX), "iholddelay out of range"), ());\
148 /* TMC50XX specific */ \
149 COND_CODE_1(DT_PROP_EXISTS(node, vcoolthrs), \
150 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vcoolthrs), TMC_RAMP_VCOOLTHRS_MIN, \
151 TMC_RAMP_VCOOLTHRS_MAX), "vcoolthrs out of range"), ()); \
152 COND_CODE_1(DT_PROP_EXISTS(node, vhigh), \
153 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vhigh), TMC_RAMP_VHIGH_MIN, \
154 TMC_RAMP_VHIGH_MAX), "vhigh out of range"), ()); \
155 /* TMC51XX specific */ \
156 COND_CODE_1(DT_PROP_EXISTS(node, tpowerdown), \
157 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tpowerdown), TMC_RAMP_TPOWERDOWN_MIN, \
158 TMC_RAMP_TPOWERDOWN_MAX), "tpowerdown out of range"), ());\
159 COND_CODE_1(DT_PROP_EXISTS(node, tpwmthrs), \
160 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tpwmthrs), TMC_RAMP_TPWMTHRS_MIN, \
161 TMC_RAMP_TPWMTHRS_MAX), "tpwmthrs out of range"), ()); \
162 COND_CODE_1(DT_PROP_EXISTS(node, tcoolthrs), \
163 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tcoolthrs), TMC_RAMP_TCOOLTHRS_MIN, \
164 TMC_RAMP_TCOOLTHRS_MAX), "tcoolthrs out of range"), ()); \
165 COND_CODE_1(DT_PROP_EXISTS(node, thigh), \
166 BUILD_ASSERT(IN_RANGE(DT_PROP(node, thigh), TMC_RAMP_THIGH_MIN, \
167 TMC_RAMP_THIGH_MAX), "thigh out of range"), ());
168
176#define TMC_RAMP_DT_SPEC_GET_COMMON(node) \
177 .vstart = DT_PROP(node, vstart), \
178 .v1 = DT_PROP(node, v1), \
179 .vmax = DT_PROP(node, vmax), \
180 .a1 = DT_PROP(node, a1), \
181 .amax = DT_PROP(node, amax), \
182 .d1 = DT_PROP(node, d1), \
183 .dmax = DT_PROP(node, dmax), \
184 .vstop = DT_PROP(node, vstop), \
185 .tzerowait = DT_PROP(node, tzerowait), \
186 .iholdrun = (TMC5XXX_IRUN(DT_PROP(node, irun)) | \
187 TMC5XXX_IHOLD(DT_PROP(node, ihold)) | \
188 TMC5XXX_IHOLDDELAY(DT_PROP(node, iholddelay))),
189
190#define TMC_RAMP_DT_SPEC_GET_TMC50XX(node) \
191 { \
192 TMC_RAMP_DT_SPEC_GET_COMMON(node) \
193 .vhigh = DT_PROP(node, vhigh), \
194 .vcoolthrs = DT_PROP(node, vcoolthrs), \
195 }
196
197#define TMC_RAMP_DT_SPEC_GET_TMC51XX(node) \
198 { \
199 TMC_RAMP_DT_SPEC_GET_COMMON(DT_DRV_INST(node)) \
200 .tpowerdown = DT_INST_PROP(node, tpowerdown), \
201 .tpwmthrs = DT_INST_PROP(node, tpwmthrs), \
202 .tcoolthrs = DT_INST_PROP(node, tcoolthrs), \
203 .thigh = DT_INST_PROP(node, thigh), \
204 }
205
217 const struct tmc_ramp_generator_data *ramp_data);
218
229
243
244#ifdef __cplusplus
245}
246#endif
247
248#endif /* ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_ */
int tmc50xx_stepper_ctrl_set_ramp(const struct device *dev, const struct tmc_ramp_generator_data *ramp_data)
Configure Trinamic Stepper Ramp Generator.
int tmc50xx_stepper_ctrl_set_max_velocity(const struct device *dev, uint32_t velocity)
Set the maximum velocity of the stepper motor.
int tmc51xx_stepper_ctrl_set_max_velocity(const struct device *dev, uint32_t velocity)
Set the maximum velocity of the stepper motor.
__UINT32_TYPE__ uint32_t
Definition stdint.h:90
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Main header file for stepper hardware driver API.
Runtime device structure (in ROM) per driver instance.
Definition device.h:513
Trinamic Stepper Ramp Generator data.
Definition stepper_trinamic.h:81
uint16_t amax
Definition stepper_trinamic.h:86
uint16_t dmax
Definition stepper_trinamic.h:88
uint32_t tpowerdown
Definition stepper_trinamic.h:100
uint32_t vcoolthrs
Definition stepper_trinamic.h:95
uint32_t vmax
Definition stepper_trinamic.h:84
uint32_t vhigh
Definition stepper_trinamic.h:96
uint32_t vstop
Definition stepper_trinamic.h:89
uint32_t vstart
Definition stepper_trinamic.h:82
uint32_t thigh
Definition stepper_trinamic.h:103
uint16_t d1
Definition stepper_trinamic.h:87
uint32_t tcoolthrs
Definition stepper_trinamic.h:102
uint32_t tpwmthrs
Definition stepper_trinamic.h:101
uint32_t iholdrun
Definition stepper_trinamic.h:91
uint16_t tzerowait
Definition stepper_trinamic.h:90
uint32_t v1
Definition stepper_trinamic.h:83
uint16_t a1
Definition stepper_trinamic.h:85