飞特总线舵机STS3215位置模式控制代码

总线舵机STS3215的几个控制函数:

增加了一个开关函数,目的是让舵机停下来


/*
**********************************************************************
*函数名称:void outputKey(uint8_t id, uint8_t KeyFlag))
*函数功能:飞特STS3215舵机扭矩输出开关
*使用说明:1为开,0为关
*入口参数:id:舵机ID, KeyFlag:扭矩开关
*返 回 值:无
**********************************************************************

void output0(uint8_t id, int KeyFlag)    
{
    uint8_t parameters[3];
    parameters[0] = 0x28;
    parameters[1] = (uint8_t)KeyFlag;
    parameters[2] = (uint8_t)0x00 ;
    
    uint8_t length = 0x05;         // 指令包长度
    uint8_t instruction = 0x03;         // 指令类型:写入字符
    uint8_t checksum = ~(id + length + instruction + parameters[0] + parameters[1] + parameters[2]) & 0xFF;
    
    uint8_t packet[9];
    int idx = 0;
    packet[idx++] = 0xFF;   // 头部第一个字节
    packet[idx++] = 0xFF;   // 头部第二个字节
    packet[idx++] = id;          // ID
    packet[idx++] = length;      // 长度
    packet[idx++] = instruction; // 指令
    for (int i = 0; i < 3; i++) {
        packet[idx++] = parameters[i];
    }
    packet[idx++] = checksum;
   // HAL_UART_Transmit(&huart6, packet, sizeof(packet), 100);
}

/*
**********************************************************************
*函数名称:void output(uint8_t id, int input)
*函数功能:控制STS3215舵机趋向转动 
*                
*使用说明:无
*入口参数:id:舵机ID,input: 实际位置与目标位置差值
*返 回 值:无
**********************************************************************
*/
void output(uint8_t id, int input)        //input为实际位置与目标位置差值
 {
    const int16_t MAX_SPEED = 3400;  // 最大速度常量
    const int16_t MIN_SPEED = 1;     // 最小速度常量
        
    outputKey(1, 1);                //打开扭矩输出

    if (input == 0) return;        //差值为0时返回

      
    uint16_t position = (input > 0) ? 4087 : 1;         // 根据输入的正负确定方向 
    
    int16_t speed = (int16_t)(input > 0 ? input : -input);         // 将输入的绝对值赋值给speed
      if (speed > MAX_SPEED) {
        speed = MAX_SPEED;
    } else if (speed < MIN_SPEED) {
        speed = MIN_SPEED;
    }

    uint8_t header[] = {0xFF, 0xFF};          // 定义指令包的头部
   
    uint8_t length = 0x09;         // 指令包长度
   
    uint8_t instruction = 0x03;         // 指令类型
   
    uint8_t address = 0x2A;         // 地址
   
    uint16_t time = 0x0000;         // 时间数据固定为0,不考虑时间控制

    // 初步组合指令包
    uint8_t parameters[7];
    parameters[0] = address;                       // 地址参数
    parameters[1] = (uint8_t)(position & 0xFF);    // 位置低8位
    parameters[2] = (uint8_t)((position >> 8) & 0xFF); // 位置高8位
    parameters[3] = (uint8_t)(time & 0xFF);        // 时间低8位
    parameters[4] = (uint8_t)((time >> 8) & 0xFF); // 时间高8位
    parameters[5] = (uint8_t)(speed & 0xFF);       // 速度低8位
    parameters[6] = (uint8_t)((speed >> 8) & 0xFF); // 速度高8位

    // 计算校验和,使用所有数据的和取反后取低8位
    uint8_t checksum = ~(id + length + instruction +
                        parameters[0] + parameters[1] + parameters[2] +
                        parameters[3] + parameters[4] + parameters[5] +
                        parameters[6]) & 0xFF;

    // 组合完整指令包
    uint8_t packet[13];
    int idx = 0;
    packet[idx++] = header[0];   // 帧头第一个字节
    packet[idx++] = header[1];   // 帧头第二个字节
    packet[idx++] = id;          // ID
    packet[idx++] = length;      // 长度
    packet[idx++] = instruction; // 指令

    // 将参数添加到指令包中
    for (int i = 0; i < sizeof(parameters); i++) {
        packet[idx++] = parameters[i];
    }

    packet[idx++] = checksum; // 添加校验和到指令包

    // 发送指令包的代码
//    HAL_UART_Transmit(&huart3, packet, sizeof(packet), 100);

}


/*
**********************************************************************
*函数名称:void outputPosition(uint8_t id, int input)
*函数功能:控制STS3215舵机按照指定角度转动  
*                
*使用说明:注意舵机的0°位置 
*入口参数:id:舵机ID,input: 目标角度
*返 回 值:无
**********************************************************************
*/

void outputPosition(uint8_t id, int input)  //input为目标角度
{
    const int16_t MAX_SPEED = 3400;
    const int16_t MIN_SPEED = 1;
    const int16_t MAX_position = 4087;
    const int16_t MIN_position = 1; 

    outputKey(1, 1);                //打开扭矩输出

    input = 4087 * input / 360;               //转化成位置 1-4087
    uint16_t position = 1;
    position = (input > MAX_position ? MAX_position : input);
    position = (input < MIN_position ? MIN_position : input);
    
    
    int16_t speed = (int16_t) (input > 0 ? input : -input);
    if (speed > MAX_SPEED) {
        speed = MAX_SPEED;
    } else if (speed < MIN_SPEED) {
        speed = MIN_SPEED;
    }
    
    
    // 指令包要素
    uint8_t header[] = {0xFF, 0xFF};
    uint8_t length = 0x09;
    uint8_t instruction = 0x03;
    uint8_t address = 0x2A;     
    uint16_t time = 0x0000;  //时间数据固定为0,不考虑时间控制
    
    //初步组合指令包
    uint8_t parameters[7];
    parameters[0] = address;
    parameters[1] = (uint8_t)(position & 0xFF);
    parameters[2] = (uint8_t)((position >> 8) & 0xFF);
    parameters[3] = (uint8_t)(time & 0xFF);
    parameters[4] = (uint8_t)((time >> 8) & 0xFF);
    parameters[5] = (uint8_t)(speed & 0xFF);
    parameters[6] = (uint8_t)((speed >> 8) & 0xFF);

    // 计算校验和
    uint8_t checksum = ~(id + length + instruction + 
                        parameters[0] + parameters[1] + parameters[2] + 
                        parameters[3] + parameters[4] + parameters[5] + 
                        parameters[6]) & 0xFF;

    //组合完整指令包
    uint8_t packet[13];
    int idx = 0;
    packet[idx++] = header[0];
    packet[idx++] = header[1];
    packet[idx++] = id;
    packet[idx++] = length;
    packet[idx++] = instruction;
    
    for (int i = 0; i < sizeof(parameters); i++) packet[idx++] = parameters[i];
    
    packet[idx++] = checksum;

    // 发送指令包
//    HAL_UART_Transmit(&huart3, packet, sizeof(packet), 100);
}
 

### 总线舵机SCS125技术参数 总线舵机SCS125是一款适用于多种应用场景的高性能舵机。其主要技术参数如下: - **工作电压**:7V~16.8V - **额定扭矩**:12Kg·cm (12V) - **最大速度**:0.12秒/60度(无负载, 12V)[^1] - **通信协议**:支持标准Modbus RTU通讯协议,兼容Arduino等多种平台控制 ### 使用教程 为了更好地理解和使用总线舵机SCS125,在初次上手前建议先熟悉基本操作流程。 #### 连接准备 确保硬件连接正确无误非常重要。通常情况下,该型号舵机会配备一条专用的数据线用于与控制器相连。数据线一端接入舵机接口,另一端则需根据所使用的主控板类型选择合适的转接头进行匹配连接。 #### 初始化设置 通过编程环境发送指令完成初始化配置。对于Arduino而言,可以利用官方提供的库文件简化这一过程。下面是一个简单的例子展示如何向指定ID号为`servo_id`的SCS125发送读取当前温度命令并接收返回值: ```cpp #include <Servo.h> #define SERVO_ID 1 // 假设目标舵机ID为1 void setup() { Serial.begin(115200); } void loop() { uint8_t command[] = {SERVO_ID, 3, 0x2B}; // Modbus功能码03, 寄存器地址43(十进制), 即获取温度 Serial.write(command, sizeof(command)); delay(10); // 短暂等待 while(Serial.available()) { int tempValue = Serial.read(); Serial.print("Current Temperature: "); Serial.println(tempValue); } } ``` 这段代码展示了如何构建一个基础框架来查询定编号下的SCS125内部传感器状态——这里是以测量温度为例说明了整个交互的过程。 ### 控制方法 针对不同需求场景下对SCS125实施精准操控的方法主要包括位置模式、速度模式以及组合模式三种方式。 - **位置模式**允许设定精确的角度作为终点坐标; - **速度模式**则是指定了旋转速率而非具体方位; - **组合模式**结合两者优势实现更加灵活多变的动作规划。 每种模式都对应着一组独的寄存器集合用来存储相应的参数值,并可通过下发对应的Modbus指令来进行调整和监控。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值