// #include // #include // #include // // #define PWM_DEV_NAME "pwm1" // #define PWM_DEV_CHANNEL 1 // // /* 常见舵机刷新周期 20ms (50Hz) */ // #define SERVO_PERIOD_NS 20000000UL // // /* 你的规格:脉宽限幅 */ // #define SERVO_MIN_US 800 // #define SERVO_MAX_US 2200 // // /* 你的标定点:-50/0/+50 -> 1000/1500/2000 */ // #define SERVO_CENTER_US 1500 // #define SERVO_US_PER_DEG 10 /* 1° 对应 10us */ // // static struct rt_device_pwm *pwm_dev = RT_NULL; // // static int clamp_int(int v, int lo, int hi) // { // if (v < lo) return lo; // if (v > hi) return hi; // return v; // } // // /* 角度(°) -> 脉宽(us),按你的三点标定线性换算,并做 800~2200us 限幅 */ // static int angle_to_pulse_us(int angle_deg) // { // int pulse = SERVO_CENTER_US + angle_deg * SERVO_US_PER_DEG; // return clamp_int(pulse, SERVO_MIN_US, SERVO_MAX_US); // } // // /* 设置角度(单位:度),例如 -50 / 0 / +50 */ // static void servo_set_angle(int angle_deg) // { // int pulse_us = angle_to_pulse_us(angle_deg); // rt_uint32_t pulse_ns = (rt_uint32_t)pulse_us * 1000UL; /* us -> ns */ // rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, SERVO_PERIOD_NS, pulse_ns); // } // // static void servo_thread_entry(void *parameter) // { // while (1) // { // servo_set_angle(50); // rt_thread_mdelay(1500); // servo_set_angle(-50); // rt_thread_mdelay(1500); // // } // } // // static int servo_app_init(void) // { // pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME); // if (pwm_dev == RT_NULL) // { // rt_kprintf("can't find %s\n", PWM_DEV_NAME); // return -RT_ERROR; // } // // /* 中位 0° -> 1500us */ // rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, SERVO_PERIOD_NS, (rt_uint32_t)SERVO_CENTER_US * 1000UL); // rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL); // // rt_thread_t tid = rt_thread_create("servo", // servo_thread_entry, // RT_NULL, // 1024, // 20, // 10); // if (tid == RT_NULL) // { // rt_kprintf("create servo thread failed\n"); // return -RT_ERROR; // } // rt_thread_startup(tid); // // return RT_EOK; // } // INIT_APP_EXPORT(servo_app_init);