actuator应用层基本完成

This commit is contained in:
kirl committed 2026-07-31 17:51:37 +08:00
1 parent 32a3a87ef2
commit a226b15413
9 files changed
+1081 -44

No files matched your search

+13
View File
@@ -5,6 +5,7 @@
#include "emm_v5.h"
#include <string.h>
#include <math.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_timer.h"
@@ -161,6 +162,18 @@ void Emm_V5_Pos_Control(uint8_t addr, uint8_t dir, uint16_t vel, uint8_t acc,
Emm_V5_Send(cmd, 13);
}
void Emm_V5_Pos_Control_Angle(uint8_t addr, uint8_t dir, uint16_t vel,
uint8_t acc, float angle_deg, bool raF, bool snF)
{
/* 负角度 → 取绝对值 + 翻转方向 */
float abs_deg = fabsf(angle_deg);
uint32_t clk = EMM_V5_DEG_TO_CLK(abs_deg);
if (angle_deg < 0.0f) dir = (uint8_t)(!dir);
ESP_LOGD("EMM_V5", "角度→脉冲: %.1f° (%s) → %lu",
(double)angle_deg, dir ? "CCW" : "CW", (unsigned long)clk);
Emm_V5_Pos_Control(addr, dir, vel, acc, clk, raF, snF);
}
void Emm_V5_Stop_Now(uint8_t addr, bool snF)
{
uint8_t cmd[5] = {addr, 0xFE, 0x98, (uint8_t)snF, 0x6B};
+25 -1
View File
@@ -30,6 +30,16 @@ extern "C" {
/* 接收超时时间 (毫秒) */
#define EMM_V5_RX_TIMEOUT_MS 100
/**
* Emm 固件角度 ↔ 脉冲 换算
* 1.8° 步进电机 + 16 微步 → 3200 脉冲/圈
* 每脉冲 = 1.8° / 16 = 0.1125°
*/
#define EMM_V5_PULSES_PER_REV 3200
#define EMM_V5_DEG_TO_CLK(deg) ((uint32_t)((float)(deg) * \
(float)EMM_V5_PULSES_PER_REV / 360.0f + 0.5f))
#define EMM_V5_CLK_TO_DEG(clk) ((float)(clk) * 0.1125f)
/* ============================================================
* 系统参数枚举 (与 Arduino 版本一致)
* ============================================================ */
@@ -120,6 +130,19 @@ void Emm_V5_Vel_Control(uint8_t addr, uint8_t dir, uint16_t vel, uint8_t acc, bo
void Emm_V5_Pos_Control(uint8_t addr, uint8_t dir, uint16_t vel, uint8_t acc,
uint32_t clk, bool raF, bool snF);
/**
* @brief 位置模式控制 (角度输入, °)
* @param addr 电机地址
* @param dir 方向, 0=CW, 其他=CCW
* @param vel 速度 0~5000 RPM
* @param acc 加速度 0~255 (0=直接启动)
* @param angle_deg 目标角度 (°), 内部换算为脉冲 (3200=360°)
* @param raF 相对/绝对, false=相对, true=绝对
* @param snF 多机同步标志, false=不启用, true=启用
*/
void Emm_V5_Pos_Control_Angle(uint8_t addr, uint8_t dir, uint16_t vel,
uint8_t acc, float angle_deg, bool raF, bool snF);
/**
* @brief 立即停止电机 (所有控制模式通用)
* @param addr 电机地址
@@ -129,7 +152,8 @@ void Emm_V5_Stop_Now(uint8_t addr, bool snF);
/**
* @brief 触发多机同步开始运动
* @param addr 电机地址
* @param addr 电机地址; 协议约定使用广播地址 0 发送一次,
* 所有以 snF=true 入队的电机会同时启动
*/
void Emm_V5_Synchronous_motion(uint8_t addr);