2024-05-19 16:04:33 +08:00
|
|
|
#include "by_servo.h"
|
|
|
|
|
|
|
|
|
|
#include "at32f415.h"
|
|
|
|
|
#include "lwprintf.h"
|
2024-06-10 17:47:25 +08:00
|
|
|
#include "by_debug.h"
|
2024-05-19 16:04:33 +08:00
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设置云台摇臂
|
|
|
|
|
*
|
|
|
|
|
* @param angle 角度 (0-180)
|
|
|
|
|
*/
|
|
|
|
|
void by_servo_set_claw_arm(int16_t angle)
|
|
|
|
|
{
|
|
|
|
|
#define PULSE_WIDTH_MIN 0.5f
|
|
|
|
|
#define PULSE_WIDTH_MAX 2.5f
|
|
|
|
|
|
|
|
|
|
uint32_t ch_val = 0;
|
|
|
|
|
|
|
|
|
|
if (angle < 0) {
|
|
|
|
|
angle = 0;
|
2024-06-10 16:56:04 +08:00
|
|
|
} else if (angle > 270) {
|
|
|
|
|
angle = 270;
|
2024-05-19 16:04:33 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-10 16:56:04 +08:00
|
|
|
ch_val = (uint32_t)(((float)angle / 270.0f * (PULSE_WIDTH_MAX - PULSE_WIDTH_MIN) + PULSE_WIDTH_MIN) / 20.0f * 9999.0f);
|
2024-05-19 16:04:33 +08:00
|
|
|
|
|
|
|
|
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_2, ch_val);
|
|
|
|
|
|
|
|
|
|
#undef PULSE_WIDTH_MIN
|
|
|
|
|
#undef PULSE_WIDTH_MAX
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设置云台摇臂
|
|
|
|
|
*
|
|
|
|
|
* @param angle 角度 (0-180)
|
|
|
|
|
*/
|
|
|
|
|
void by_servo_set_claw(int16_t angle)
|
|
|
|
|
{
|
2024-06-10 16:56:04 +08:00
|
|
|
#define PULSE_WIDTH_MIN 0.5f
|
2024-05-19 16:04:33 +08:00
|
|
|
#define PULSE_WIDTH_MAX 2.5f
|
|
|
|
|
|
|
|
|
|
uint32_t ch_val = 0;
|
|
|
|
|
|
|
|
|
|
if (angle < 0) {
|
|
|
|
|
angle = 0;
|
|
|
|
|
} else if (angle > 180) {
|
|
|
|
|
angle = 180;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ch_val = (uint32_t)(((float)angle / 180.0f * (PULSE_WIDTH_MAX - PULSE_WIDTH_MIN) + PULSE_WIDTH_MIN) / 20.0f * 9999.0f);
|
|
|
|
|
|
|
|
|
|
tmr_channel_value_set(TMR1, TMR_SELECT_CHANNEL_1, ch_val);
|
|
|
|
|
|
|
|
|
|
#undef PULSE_WIDTH_MIN
|
|
|
|
|
#undef PULSE_WIDTH_MAX
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief 设置云台摇臂
|
|
|
|
|
*
|
|
|
|
|
* @param angle 角度 (0-180)
|
|
|
|
|
*/
|
|
|
|
|
void by_servo_set_camera(int16_t angle)
|
|
|
|
|
{
|
2024-06-10 16:56:04 +08:00
|
|
|
#define PULSE_WIDTH_MIN 0.5f
|
2024-05-19 16:04:33 +08:00
|
|
|
#define PULSE_WIDTH_MAX 2.5f
|
|
|
|
|
|
|
|
|
|
uint32_t ch_val = 0;
|
|
|
|
|
|
|
|
|
|
if (angle < 0) {
|
|
|
|
|
angle = 0;
|
2024-06-10 16:56:04 +08:00
|
|
|
} else if (angle > 270) {
|
|
|
|
|
angle = 270;
|
2024-05-19 16:04:33 +08:00
|
|
|
}
|
|
|
|
|
|
2024-06-10 16:56:04 +08:00
|
|
|
ch_val = (uint32_t)(((float)angle / 270.0f * (PULSE_WIDTH_MAX - PULSE_WIDTH_MIN) + PULSE_WIDTH_MIN) / 20.0f * 9999.0f);
|
2024-05-19 16:04:33 +08:00
|
|
|
|
|
|
|
|
tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_4, ch_val);
|
|
|
|
|
|
|
|
|
|
#undef PULSE_WIDTH_MIN
|
|
|
|
|
#undef PULSE_WIDTH_MAX
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
2024-06-10 16:56:04 +08:00
|
|
|
* @brief 设置顶端抓取机构
|
2024-05-19 16:04:33 +08:00
|
|
|
*
|
|
|
|
|
* @param angle 角度 (0-180)
|
|
|
|
|
*/
|
|
|
|
|
void by_servo_set_scoop(int16_t angle)
|
|
|
|
|
{
|
2024-06-10 16:56:04 +08:00
|
|
|
#define PULSE_WIDTH_MIN 0.5f
|
2024-05-19 16:04:33 +08:00
|
|
|
#define PULSE_WIDTH_MAX 2.5f
|
|
|
|
|
|
|
|
|
|
uint32_t ch_val = 0;
|
|
|
|
|
|
|
|
|
|
if (angle < 0) {
|
|
|
|
|
angle = 0;
|
|
|
|
|
} else if (angle > 180) {
|
|
|
|
|
angle = 180;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ch_val = (uint32_t)(((float)angle / 180.0f * (PULSE_WIDTH_MAX - PULSE_WIDTH_MIN) + PULSE_WIDTH_MIN) / 20.0f * 9999.0f);
|
|
|
|
|
|
|
|
|
|
tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_3, ch_val);
|
|
|
|
|
|
|
|
|
|
#undef PULSE_WIDTH_MIN
|
|
|
|
|
#undef PULSE_WIDTH_MAX
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-10 16:56:04 +08:00
|
|
|
/**
|
|
|
|
|
* @brief 设置置物平台
|
|
|
|
|
*
|
|
|
|
|
* @param angle 角度 (0-180)
|
|
|
|
|
*/
|
|
|
|
|
void by_servo_set_storage(int16_t angle)
|
|
|
|
|
{
|
|
|
|
|
#define PULSE_WIDTH_MIN 0.5f
|
|
|
|
|
#define PULSE_WIDTH_MAX 2.5f
|
|
|
|
|
|
|
|
|
|
uint32_t ch_val = 0;
|
|
|
|
|
|
|
|
|
|
if (angle < 0) {
|
|
|
|
|
angle = 0;
|
|
|
|
|
} else if (angle > 180) {
|
|
|
|
|
angle = 180;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ch_val = (uint32_t)(((float)angle / 180.0f * (PULSE_WIDTH_MAX - PULSE_WIDTH_MIN) + PULSE_WIDTH_MIN) / 20.0f * 9999.0f);
|
|
|
|
|
|
|
|
|
|
tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_2, ch_val);
|
|
|
|
|
|
|
|
|
|
#undef PULSE_WIDTH_MIN
|
|
|
|
|
#undef PULSE_WIDTH_MAX
|
|
|
|
|
}
|
|
|
|
|
|
2024-06-14 17:43:32 +08:00
|
|
|
void by_servo_set_zhuan(int16_t angle)
|
|
|
|
|
{
|
|
|
|
|
#define PULSE_WIDTH_MIN 0.5f
|
|
|
|
|
#define PULSE_WIDTH_MAX 2.5f
|
|
|
|
|
|
|
|
|
|
uint32_t ch_val = 0;
|
|
|
|
|
|
|
|
|
|
if (angle < -10) {
|
|
|
|
|
angle = -10;
|
|
|
|
|
} else if (angle > 10) {
|
|
|
|
|
angle = 10;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
angle += 10;
|
|
|
|
|
|
|
|
|
|
ch_val = (uint32_t)(((float)angle / 20.0f * (PULSE_WIDTH_MAX - PULSE_WIDTH_MIN) + PULSE_WIDTH_MIN) / 20.0f * 9999.0f);
|
|
|
|
|
|
|
|
|
|
tmr_channel_value_set(TMR3, TMR_SELECT_CHANNEL_1, ch_val);
|
|
|
|
|
|
|
|
|
|
#undef PULSE_WIDTH_MIN
|
|
|
|
|
#undef PULSE_WIDTH_MAX
|
|
|
|
|
}
|
|
|
|
|
|
2024-05-19 16:04:33 +08:00
|
|
|
void by_servo_init(void)
|
|
|
|
|
{
|
|
|
|
|
// 后续要不全初始化为空值,由主控按顺序初始化
|
2024-06-10 17:47:25 +08:00
|
|
|
by_servo_set_claw(25); // 25-90
|
2024-06-10 16:56:04 +08:00
|
|
|
by_servo_set_camera(45);
|
2024-07-17 18:19:39 +08:00
|
|
|
by_servo_set_scoop(25);
|
|
|
|
|
by_servo_set_storage(20);
|
|
|
|
|
delay_sec(2);
|
|
|
|
|
by_servo_set_claw_arm(225); // 36-220 新 45-225
|
2024-06-14 17:43:32 +08:00
|
|
|
by_servo_set_zhuan(0); //-10-10
|
2024-05-19 16:04:33 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void by_servo_can_handle(uint16_t stdd_id, const uint8_t *data, uint8_t len)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
int16_t angle = 0;
|
|
|
|
|
|
|
|
|
|
angle = (int16_t)(data[0] | (data[1] << 8));
|
|
|
|
|
|
|
|
|
|
switch (stdd_id) {
|
|
|
|
|
case 0x009:
|
|
|
|
|
by_servo_set_claw_arm(angle);
|
|
|
|
|
break;
|
|
|
|
|
case 0x00A:
|
|
|
|
|
by_servo_set_claw(angle);
|
|
|
|
|
break;
|
|
|
|
|
case 0x00B:
|
|
|
|
|
by_servo_set_camera(angle);
|
|
|
|
|
break;
|
|
|
|
|
case 0x00C:
|
|
|
|
|
by_servo_set_scoop(angle);
|
|
|
|
|
break;
|
2024-06-10 16:56:04 +08:00
|
|
|
case 0x00D:
|
|
|
|
|
by_servo_set_storage(angle);
|
|
|
|
|
break;
|
2024-06-14 17:43:32 +08:00
|
|
|
case 0x00E:
|
|
|
|
|
by_servo_set_zhuan(angle);
|
|
|
|
|
break;
|
2024-05-19 16:04:33 +08:00
|
|
|
default:
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|