1 /*
2  * SPDX-FileCopyrightText: Copyright (c) 2025 Jilay Sandeep Pandya.
3  * SPDX-License-Identifier: Apache-2.0
4  */
5 
6 #include <zephyr/device.h>
7 #include <zephyr/drivers/gpio.h>
8 #include <zephyr/drivers/stepper.h>
9 #include <zephyr/kernel.h>
10 #include <zephyr/drivers/stepper/stepper_trinamic.h>
11 
12 const struct device *stepper = DEVICE_DT_GET(DT_ALIAS(stepper));
13 
14 int32_t ping_pong_target_position = CONFIG_STEPS_PER_REV * CONFIG_PING_PONG_N_REV *
15 				    DT_PROP(DT_ALIAS(stepper), micro_step_res);
16 
17 K_SEM_DEFINE(steps_completed_sem, 0, 1);
18 
stepper_callback(const struct device * dev,const enum stepper_event event,void * user_data)19 void stepper_callback(const struct device *dev, const enum stepper_event event, void *user_data)
20 {
21 	switch (event) {
22 	case STEPPER_EVENT_STEPS_COMPLETED:
23 		k_sem_give(&steps_completed_sem);
24 		break;
25 	default:
26 		break;
27 	}
28 }
29 
main(void)30 int main(void)
31 {
32 	printf("Starting tmc50xx stepper sample\n");
33 	if (!device_is_ready(stepper)) {
34 		printf("Device %s is not ready\n", stepper->name);
35 		return -ENODEV;
36 	}
37 	printf("stepper is %p, name is %s\n", stepper, stepper->name);
38 
39 	stepper_set_event_callback(stepper, stepper_callback, NULL);
40 	stepper_enable(stepper, true);
41 	stepper_set_reference_position(stepper, 0);
42 	stepper_move_by(stepper, ping_pong_target_position);
43 
44 	/* Change Max Velocity during runtime */
45 	int32_t tmc_velocity = DT_PROP(DT_ALIAS(stepper), vmax) * CONFIG_MAX_VELOCITY_MULTIPLIER;
46 	(void)tmc50xx_stepper_set_max_velocity(stepper, tmc_velocity);
47 
48 	for (;;) {
49 		if (k_sem_take(&steps_completed_sem, K_FOREVER) == 0) {
50 			ping_pong_target_position *= -1;
51 			stepper_move_by(stepper, ping_pong_target_position);
52 		}
53 	}
54 	return 0;
55 }
56