Zephyr API Documentation 4.1.99
A Scalable Open Source RTOS
 4.1.99
All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Modules Pages
stepper_trinamic.h
Go to the documentation of this file.
1
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
25#include <stdint.h>
27
28#ifdef __cplusplus
29extern "C" {
30#endif
31
35#define TMC_RAMP_VSTART_MAX GENMASK(17, 0)
36#define TMC_RAMP_VSTART_MIN 0
37#define TMC_RAMP_V1_MAX GENMASK(19, 0)
38#define TMC_RAMP_V1_MIN 0
39#define TMC_RAMP_VMAX_MAX (GENMASK(22, 0) - 512)
40#define TMC_RAMP_VMAX_MIN 0
41#define TMC_RAMP_A1_MAX GENMASK(15, 0)
42#define TMC_RAMP_A1_MIN 0
43#define TMC_RAMP_AMAX_MAX GENMASK(15, 0)
44#define TMC_RAMP_AMAX_MIN 0
45#define TMC_RAMP_D1_MAX GENMASK(15, 0)
46#define TMC_RAMP_D1_MIN 1
47#define TMC_RAMP_DMAX_MAX GENMASK(15, 0)
48#define TMC_RAMP_DMAX_MIN 0
49#define TMC_RAMP_VSTOP_MAX GENMASK(17, 0)
50#define TMC_RAMP_VSTOP_MIN 1
51#define TMC_RAMP_TZEROWAIT_MAX (GENMASK(15, 0) - 512)
52#define TMC_RAMP_TZEROWAIT_MIN 0
53#define TMC_RAMP_IHOLD_IRUN_MAX GENMASK(4, 0)
54#define TMC_RAMP_IHOLD_IRUN_MIN 0
55#define TMC_RAMP_IHOLDDELAY_MAX GENMASK(3, 0)
56#define TMC_RAMP_IHOLDDELAY_MIN 0
57#define TMC_RAMP_VACTUAL_SHIFT 22
58#define TMC_RAMP_XACTUAL_SHIFT 31
59
60/* TMC50XX specific */
61#define TMC_RAMP_VCOOLTHRS_MAX GENMASK(22, 0)
62#define TMC_RAMP_VCOOLTHRS_MIN 0
63#define TMC_RAMP_VHIGH_MAX GENMASK(22, 0)
64#define TMC_RAMP_VHIGH_MIN 0
65
66/* TMC51XX specific */
67#define TMC_RAMP_TPOWERDOWN_MAX GENMASK(7, 0)
68#define TMC_RAMP_TPOWERDOWN_MIN 0
69#define TMC_RAMP_TPWMTHRS_MAX GENMASK(19, 0)
70#define TMC_RAMP_TPWMTHRS_MIN 0
71#define TMC_RAMP_TCOOLTHRS_MAX GENMASK(19, 0)
72#define TMC_RAMP_TCOOLTHRS_MIN 0
73#define TMC_RAMP_THIGH_MAX GENMASK(19, 0)
74#define TMC_RAMP_THIGH_MIN 0
75
105
109#define CHECK_RAMP_DT_DATA(node) \
110 COND_CODE_1(DT_PROP_EXISTS(node, vstart), \
111 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstart), TMC_RAMP_VSTART_MIN, \
112 TMC_RAMP_VSTART_MAX), "vstart out of range"), ()); \
113 COND_CODE_1(DT_PROP_EXISTS(node, v1), \
114 BUILD_ASSERT(IN_RANGE(DT_PROP(node, v1), TMC_RAMP_V1_MIN, \
115 TMC_RAMP_V1_MAX), "v1 out of range"), ()); \
116 COND_CODE_1(DT_PROP_EXISTS(node, vmax), \
117 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vmax), TMC_RAMP_VMAX_MIN, \
118 TMC_RAMP_VMAX_MAX), "vmax out of range"), ()); \
119 COND_CODE_1(DT_PROP_EXISTS(node, a1), \
120 BUILD_ASSERT(IN_RANGE(DT_PROP(node, a1), TMC_RAMP_A1_MIN, \
121 TMC_RAMP_A1_MAX), "a1 out of range"), ()); \
122 COND_CODE_1(DT_PROP_EXISTS(node, amax), \
123 BUILD_ASSERT(IN_RANGE(DT_PROP(node, amax), TMC_RAMP_AMAX_MIN, \
124 TMC_RAMP_AMAX_MAX), "amax out of range"), ()); \
125 COND_CODE_1(DT_PROP_EXISTS(node, d1), \
126 BUILD_ASSERT(IN_RANGE(DT_PROP(node, d1), TMC_RAMP_D1_MIN, \
127 TMC_RAMP_D1_MAX), "d1 out of range"), ()); \
128 COND_CODE_1(DT_PROP_EXISTS(node, dmax), \
129 BUILD_ASSERT(IN_RANGE(DT_PROP(node, dmax), TMC_RAMP_DMAX_MIN, \
130 TMC_RAMP_DMAX_MAX), "dmax out of range"), ()); \
131 COND_CODE_1(DT_PROP_EXISTS(node, vstop), \
132 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vstop), TMC_RAMP_VSTOP_MIN, \
133 TMC_RAMP_VSTOP_MAX), "vstop out of range"), ()); \
134 COND_CODE_1(DT_PROP_EXISTS(node, tzerowait), \
135 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tzerowait), TMC_RAMP_TZEROWAIT_MIN, \
136 TMC_RAMP_TZEROWAIT_MAX), "tzerowait out of range"), ()); \
137 COND_CODE_1(DT_PROP_EXISTS(node, ihold), \
138 BUILD_ASSERT(IN_RANGE(DT_PROP(node, ihold), TMC_RAMP_IHOLD_IRUN_MIN, \
139 TMC_RAMP_IHOLD_IRUN_MAX), "ihold out of range"), ()); \
140 COND_CODE_1(DT_PROP_EXISTS(node, irun), \
141 BUILD_ASSERT(IN_RANGE(DT_PROP(node, irun), TMC_RAMP_IHOLD_IRUN_MIN, \
142 TMC_RAMP_IHOLD_IRUN_MAX), "irun out of range"), ()); \
143 COND_CODE_1(DT_PROP_EXISTS(node, iholddelay), \
144 BUILD_ASSERT(IN_RANGE(DT_PROP(node, iholddelay), TMC_RAMP_IHOLDDELAY_MIN, \
145 TMC_RAMP_IHOLDDELAY_MAX), "iholddelay out of range"), ());\
146 /* TMC50XX specific */ \
147 COND_CODE_1(DT_PROP_EXISTS(node, vcoolthrs), \
148 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vcoolthrs), TMC_RAMP_VCOOLTHRS_MIN, \
149 TMC_RAMP_VCOOLTHRS_MAX), "vcoolthrs out of range"), ()); \
150 COND_CODE_1(DT_PROP_EXISTS(node, vhigh), \
151 BUILD_ASSERT(IN_RANGE(DT_PROP(node, vhigh), TMC_RAMP_VHIGH_MIN, \
152 TMC_RAMP_VHIGH_MAX), "vhigh out of range"), ()); \
153 /* TMC51XX specific */ \
154 COND_CODE_1(DT_PROP_EXISTS(node, tpowerdown), \
155 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tpowerdown), TMC_RAMP_TPOWERDOWN_MIN, \
156 TMC_RAMP_TPOWERDOWN_MAX), "tpowerdown out of range"), ());\
157 COND_CODE_1(DT_PROP_EXISTS(node, tpwmthrs), \
158 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tpwmthrs), TMC_RAMP_TPWMTHRS_MIN, \
159 TMC_RAMP_TPWMTHRS_MAX), "tpwmthrs out of range"), ()); \
160 COND_CODE_1(DT_PROP_EXISTS(node, tcoolthrs), \
161 BUILD_ASSERT(IN_RANGE(DT_PROP(node, tcoolthrs), TMC_RAMP_TCOOLTHRS_MIN, \
162 TMC_RAMP_TCOOLTHRS_MAX), "tcoolthrs out of range"), ()); \
163 COND_CODE_1(DT_PROP_EXISTS(node, thigh), \
164 BUILD_ASSERT(IN_RANGE(DT_PROP(node, thigh), TMC_RAMP_THIGH_MIN, \
165 TMC_RAMP_THIGH_MAX), "thigh out of range"), ());
166
174#define TMC_RAMP_DT_SPEC_GET_COMMON(node) \
175 .vstart = DT_PROP(node, vstart), \
176 .v1 = DT_PROP(node, v1), \
177 .vmax = DT_PROP(node, vmax), \
178 .a1 = DT_PROP(node, a1), \
179 .amax = DT_PROP(node, amax), \
180 .d1 = DT_PROP(node, d1), \
181 .dmax = DT_PROP(node, dmax), \
182 .vstop = DT_PROP(node, vstop), \
183 .tzerowait = DT_PROP(node, tzerowait), \
184 .iholdrun = (TMC5XXX_IRUN(DT_PROP(node, irun)) | \
185 TMC5XXX_IHOLD(DT_PROP(node, ihold)) | \
186 TMC5XXX_IHOLDDELAY(DT_PROP(node, iholddelay))),
187
188#define TMC_RAMP_DT_SPEC_GET_TMC50XX(node) \
189 { \
190 TMC_RAMP_DT_SPEC_GET_COMMON(node) \
191 .vhigh = DT_PROP(node, vhigh), \
192 .vcoolthrs = DT_PROP(node, vcoolthrs), \
193 }
194
195#define TMC_RAMP_DT_SPEC_GET_TMC51XX(node) \
196 { \
197 TMC_RAMP_DT_SPEC_GET_COMMON(DT_DRV_INST(node)) \
198 .tpowerdown = DT_INST_PROP(node, tpowerdown), \
199 .tpwmthrs = DT_INST_PROP(node, tpwmthrs), \
200 .tcoolthrs = DT_INST_PROP(node, tcoolthrs), \
201 .thigh = DT_INST_PROP(node, thigh), \
202 }
203
214int tmc50xx_stepper_set_ramp(const struct device *dev,
215 const struct tmc_ramp_generator_data *ramp_data);
216
226int tmc50xx_stepper_set_max_velocity(const struct device *dev, uint32_t velocity);
227
232#ifdef __cplusplus
233}
234#endif
235
236#endif /* ZEPHYR_INCLUDE_DRIVERS_STEPPER_STEPPER_TRINAMIC_H_ */
int tmc50xx_stepper_set_ramp(const struct device *dev, const struct tmc_ramp_generator_data *ramp_data)
Configure Trinamic Stepper Ramp Generator.
int tmc50xx_stepper_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
Public API for Stepper Driver.
Runtime device structure (in ROM) per driver instance.
Definition device.h:504
Trinamic Stepper Ramp Generator data.
Definition stepper_trinamic.h:79
uint16_t amax
Definition stepper_trinamic.h:84
uint16_t dmax
Definition stepper_trinamic.h:86
uint32_t tpowerdown
Definition stepper_trinamic.h:98
uint32_t vcoolthrs
Definition stepper_trinamic.h:93
uint32_t vmax
Definition stepper_trinamic.h:82
uint32_t vhigh
Definition stepper_trinamic.h:94
uint32_t vstop
Definition stepper_trinamic.h:87
uint32_t vstart
Definition stepper_trinamic.h:80
uint32_t thigh
Definition stepper_trinamic.h:101
uint16_t d1
Definition stepper_trinamic.h:85
uint32_t tcoolthrs
Definition stepper_trinamic.h:100
uint32_t tpwmthrs
Definition stepper_trinamic.h:99
uint32_t iholdrun
Definition stepper_trinamic.h:89
uint16_t tzerowait
Definition stepper_trinamic.h:88
uint32_t v1
Definition stepper_trinamic.h:81
uint16_t a1
Definition stepper_trinamic.h:83