跳转至

舵机例程说明

工程文件结构

User文件夹 工程结构介绍

  • USER/UartServo.uvprojx

串行总线舵机的工程文件,点击打开工程。

  • USER/main.c

主程序。程序入口。

  • SYSTEM/sys/sys.c

正点原子开发板自带库,未修改。

  • SYSTEM/sys_tick/sys_tick.c

管理系统时间。通过配置系统定时器中断,实现了延时以及倒计时的逻辑。

  • HARDWARE/ring_buffer/ring_buffer.c

用C语言实现了环形缓冲队列。用于存放管理串口通信的字节流,同时还具备向缓冲队列读取/写入特定数据类型的数值的功能。

  • HARDWARE/usart/usart.c

串口通信的库。通过配置宏,可以方便的打开关闭STM32F407开发板上USART资源。

  • HARDWARE/fashion_star_uart_servo.c

封装了Fashion Star 串行总线舵机的通信协议,是串行总线舵机STM32F407版本的SDK。

  • HARDWARE/fashion_star_uart_servo_examples/fashion_star_uart_servo_examples.c

串行总线舵机示例程序的几何,通过示例程序的ID调用不同的测试例程。

如何运行例程

修改main.c代码里面的示例代码,执行特定的示例代码。

编译然后下载到开发板上进行验证。

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_SERVO_ANGLE); // 运行例程
}

示例代码ID号定义在文件fashion_star_uart_servo_examples.h里面

// 演示例程序号(宏定义)
#define FSUS_EXAMPLE_LED_BLINK 1              // LED闪烁
#define FSUS_EXAMPLE_USART_ECHO 2             // USART收发测试
#define FSUS_EXAMPLE_PING_SERVO 3             // 舵机通讯检测
#define FSUS_EXAMPLE_SET_SERVO_ANGLE 4        // 控制单个舵机的角度
#define FSUS_EXAMPLE_SET_N_SERVO_ANGLE 5      // 控制多个舵机的角度
#define FSUS_EXAMPLE_SET_SERVO_ANGLE_MTURN 6  // 控制单个舵机的角度(多圈模式)
#define FSUS_EXAMPLE_SET_SERVO_DAMPING 7      // 舵机阻尼模式与角度回读
#define FSUS_EXAMPLE_SET_WHEEL_KEEP_MOVE 8    // 轮式模式控制(一直旋转)
#define FSUS_EXAMPLE_SET_WHEEL_MOVE_NCIRCLE 9 // 轮式模式控制(定圈)
#define FSUS_EXAMPLE_SET_WHEEL_MOVE_TIME 10   // 轮式控制模式(定时)
#define FSUS_EXAMPLE_RESET_DATA 11            // 重置用户自定义表
#define FSUS_EXAMPLE_READ_DATA 12             // 读取数据
#define FSUS_EXAMPLE_WRITE_DATA 13            // 写入数据

例程1-LED闪烁

fashion_star_uart_servo_examples.c

/* LED闪烁例程 */
void FSUSExample_LEDBlink(void)
{

    printf("===Test LED Blink===\r\n");
    // 重复执行 1s切换一下LED0的电平状态
    while (1)
    {
        SysTick_DelayMs(1000); // 延时1s
        LED0 = !LED0;          // LED电平反转
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_LED_BLINK); // 运行例程
}

例程2-串口收发实验

fashion_star_uart_servo_examples.c

/* 
 * USART收发测试
 * 功能说明: 如果有数据接收到,则打印回终端
 */
void FSUSExample_UsartEcho(void)
{
    // 变量定义
    uint16_t nbyte;                 // 记录字节个数
    uint8_t usart_echo_buffer[256]; // 接收缓冲区
    uint16_t count = 0;             // 计数

    printf("===Test Usart Echo===\r\n");
    while (1)
    {
        count += 1;
        if (count >= 100)
        {
            LED0 = 0; // LED开
            printf("Input Data\r\n");
            LED0 = 1; // LED关
            count = 0;
        }
        nbyte = RingBuffer_GetByteUsed(usart1.recvBuf); // 获取当前读入的字节个数
        if (nbyte != 0)
        {
            LED0 = 0; // LED开
            printf("Data Recv %d  Bytes\r\n", nbyte);
            printf("ECHO: ");
            RingBuffer_ReadByteArray(usart1.recvBuf, usart_echo_buffer, nbyte);
            Usart_SendByteArr(usart1.pUSARTx, usart_echo_buffer, nbyte);
            printf("\r\n");
            LED0 = 1; // LED关
        }
        SysTick_DelayMs(10); // 延时10ms
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_USART_ECHO); // 运行例程
}

例程2-舵机通讯检测

fashion_star_uart_servo_examples.c

/* 舵机通讯检测 */
void FSUSExample_PingServo(void)
{

    FSUS_STATUS status_code; // 状态码
    uint8_t servo_id = 0;    // 舵机ID = 0

    printf("===Test Uart Servo Ping===r\n");
    while (1)
    {
        // 舵机通信检测
        status_code = FSUS_Ping(servo_usart, servo_id);
        if (status_code == FSUS_STATUS_SUCCESS)
        {
            // 舵机在线, LED1闪烁(绿灯)
            printf("Servo Online \r\n");
            LED0 = LED_OFF;
            LED1 = !LED1;
        }
        else
        {
            // 舵机离线, LED0闪烁(红灯)
            printf("Servo Offline,Error Code=%d \r\n", status_code);
            LED0 = !LED0;
            LED1 = LED_OFF;
        }
        // 延时等待1s
        SysTick_DelayMs(1000);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_PING_SERVO); // 运行例程
}

例程4-控制单个舵机的角度

fashion_star_uart_servo_examples.c

/* 控制单个舵机的角度 */
void FSUSExample_SetServoAngle(void)
{
    // 舵机控制相关的参数
    // 舵机的ID号
    uint8_t servo_id = 0;
    // 舵机的目标角度
    // 舵机角度在-135度到135度之间, 精确到小数点后一位
    float angle = 0;
    // 时间间隔ms
    // 可以尝试修改设置更小的时间间隔,例如500ms
    uint16_t interval;
    // 目标转速
    float velocity;
    // 加速时间
    uint16_t t_acc;
    // 减速时间
    uint16_t t_dec;
    // 舵机执行功率 mV 默认为0
    uint16_t power = 0;
    // 设置舵机角度的时候, 是否为阻塞式
    // 0:不等待 1:等待舵机旋转到特定的位置;
    uint8_t wait = 1;
    // 读取的角度
    float angle_read;

    while (1)
    {
        printf("GOTO: 90.0f\r\n");
        // 控制舵机角度
        angle = 90.0;
        interval = 2000;
        FSUS_SetServoAngle(servo_usart, servo_id, angle, interval, power, wait);
        FSUS_QueryServoAngle(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);

        // 等待2s
        SysTick_DelayMs(2000);

        // 控制舵机角度 + 指定时间
        printf("GOTO+Interval: 0.0f\r\n");
        angle = 0.0f;
        interval = 1000;
        t_acc = 100;
        t_dec = 150;
        FSUS_SetServoAngleByInterval(servo_usart, servo_id, angle, interval, t_acc, t_dec, power, wait);
        FSUS_QueryServoAngle(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);

        // 等待2s
        SysTick_DelayMs(2000);

        // 控制舵机角度 + 指定转速
        printf("GOTO+Velocity: -9.0f\r\n");
        angle = -90.0f;
        velocity = 200.0f;
        t_acc = 100;
        t_dec = 150;
        FSUS_SetServoAngleByVelocity(servo_usart, servo_id, angle, velocity, t_acc, t_dec, power, wait);
        FSUS_QueryServoAngle(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_SERVO_ANGLE); // 运行例程
}

例程5-控制多个舵机的角度

fashion_star_uart_servo_examples.c

/* 控制多个舵机的角度 */
void FSUSExample_SetNServoAngle(void)
{
    //// 舵机控制相关的参数
    // 时间间隔ms
    // 可以尝试修改设置更小的时间间隔,例如500ms
    uint16_t interval = 2000;
    // 舵机执行功率 mV 默认为0
    uint16_t power = 0;
    // 设置舵机角度的时候, 是否为阻塞式
    // 0:不等待 1:等待舵机旋转到特定的位置;
    uint8_t wait = 0;
    // 是否为多圈模式
    // 0: 单圈模式; 1: 多圈模式;
    uint8_t is_mturn = 0;
    while (1)
    {
        // 控制舵机云台角度
        FSUS_SetServoAngle(servo_usart, 0, 90.0, interval, power, wait);
        FSUS_SetServoAngle(servo_usart, 1, 45.0, interval, power, wait);
        // 阻塞式等待, 等待旋转到目标角度
        // 注意要跟设定值相同
        FSUS_Wait(servo_usart, 0, 90.0, is_mturn);
        FSUS_Wait(servo_usart, 1, 45.0, is_mturn);

        // 等待2s
        SysTick_DelayMs(2000);

        // 控制舵机旋转到另外一个角度
        FSUS_SetServoAngle(servo_usart, 0, -90.0, interval, power, wait);
        FSUS_SetServoAngle(servo_usart, 1, -45.0, interval, power, wait);
        // 阻塞式等待, 等待旋转到目标角度
        // 注意要跟设定值相同
        FSUS_Wait(servo_usart, 0, -90.0, is_mturn);
        FSUS_Wait(servo_usart, 1, -45.0, is_mturn);

        // 等待2s
        SysTick_DelayMs(2000);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_N_SERVO_ANGLE); // 运行例程
}

例程6-设置舵机角度(多圈模式)

多圈角度模式仅限于磁编码系列舵机,其他系列不兼容该模式

fashion_star_uart_servo_examples.c

/* 设置舵机角度(多圈模式) */
void FSUSExample_SetServoAngleMTurn(void)
{
    //// 舵机控制相关的参数
    // 舵机的ID号
    uint8_t servo_id = 0;
    // 舵机的目标角度
    // 舵机角度在-135度到135度之间, 精确到小数点后一位
    float angle;
    uint32_t interval; // 时间间隔ms
    float velocity;    // 电机转速, 单位dps,°/s
    // 舵机执行功率 mV 默认为0
    uint16_t power = 0;
    // 设置舵机角度的时候, 是否为阻塞式
    // 0:不等待 1:等待舵机旋转到特定的位置;
    uint8_t wait = 1;
    // 加速时间(单位ms)
    uint16_t t_acc;
    // 减速时间
    uint16_t t_dec;
    // 读取的角度
    float angle_read;

    while (1)
    {
        printf("MTurn GOTO: 720.0f\r\n");
        // 控制舵机角度(多圈)
        angle = 720.0f;
        interval = 2000;
        FSUS_SetServoAngleMTurn(servo_usart, servo_id, angle, interval, power, wait);
        FSUS_QueryServoAngleMTurn(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);

        // 等待2s
        SysTick_DelayMs(2000);

        // 控制舵机旋转到另外一个角度(多圈)
        printf("MTurn GOTO: 0.0f\r\n");
        angle = 0.0;
        FSUS_SetServoAngleMTurn(servo_usart, servo_id, angle, interval, power, wait);
        FSUS_QueryServoAngleMTurn(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);

        // 等待2s
        SysTick_DelayMs(2000);

        // 控制舵机角度(多圈+指定周期)
        printf("MTurn+Interval GOTO: -180.0f\r\n");
        angle = 180.0f;
        interval = 1000;
        t_acc = 100;
        t_dec = 200;
        FSUS_SetServoAngleMTurnByInterval(servo_usart, servo_id, angle, interval, t_acc, t_dec, power, wait);
        FSUS_QueryServoAngleMTurn(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);

        // 等待2s
        SysTick_DelayMs(2000);

        // 控制舵机角度(多圈+指定转速)
        printf("MTurn+Velocity GOTO: -180.0f\r\n");
        angle = -180.0f;
        velocity = 100.0f;
        t_acc = 100;
        t_dec = 200;
        FSUS_SetServoAngleMTurnByVelocity(servo_usart, servo_id, angle, velocity, t_acc, t_dec, power, wait);
        FSUS_QueryServoAngleMTurn(servo_usart, servo_id, &angle_read);
        printf("Cur Angle: %.1f\r\n", angle_read);

        // 等待2s
        SysTick_DelayMs(2000);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_SERVO_ANGLE_MTURN); // 运行例程
}

例程7-舵机阻尼模式与角度回传

fashion_star_uart_servo_examples.c

/* 舵机阻尼模式与角度回传 */
void FSUSExample_SetServoDamping(void)
{
    FSUS_STATUS status_code; // 请求包的状态码
    uint8_t servo_id = 0;    // 连接在转接板上的串行总线ID号
    uint16_t power = 500;    // 阻尼模式下的功率,功率越大阻力越大
    float angle = 0;         // 舵机的角度

    // 设置舵机为阻尼模式
    FSUS_DampingMode(servo_usart, servo_id, power);
    while (1)
    {
        // 读取一下舵机的角度
        status_code = FSUS_QueryServoAngle(servo_usart, servo_id, &angle);

        if (status_code == FSUS_STATUS_SUCCESS)
        {
            // 成功的读取到了舵机的角度
            printf("[INFO] servo id= %d ; angle = %f\r\n", servo_id, angle);
        }
        else
        {
            // 没有正确的读取到舵机的角度
            printf("\r\n[INFO] read servo %d angle, status code: %d \r\n", servo_id, status_code);
            printf("[ERROR]failed to read servo angle\r\n");
        }
        // 等待1000ms
        SysTick_DelayMs(500);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_SERVO_DAMPING); // 运行例程
}

例程8-轮转模式控制(一直旋转)

fashion_star_uart_servo_examples.c

/* 轮转模式控制(一直旋转) */
void FSUSExample_WheelKeepMove(void)
{
    uint8_t servo_id = 0; // 连接在转接板上的串行总线ID号
    uint16_t speed = 20;  // 舵机的旋转方向 20°/s
    uint8_t is_cw = 0;    // 舵机的旋转方向

    while (1)
    {
        // 舵机轮转模式定速控制 顺时针旋转3s
        is_cw = 1;
        FSUS_WheelKeepMove(servo_usart, servo_id, is_cw, speed);
        SysTick_DelayMs(3000);

        // 舵机刹车 停顿2s
        FSUS_WheelStop(servo_usart, servo_id);
        SysTick_DelayMs(1000);

        // 舵机轮转模式定速控制 逆时针旋转3s
        is_cw = 0;
        FSUS_WheelKeepMove(servo_usart, servo_id, is_cw, speed);
        SysTick_DelayMs(3000);

        // 舵机刹车 停顿2s
        FSUS_WheelStop(servo_usart, servo_id);
        SysTick_DelayMs(1000);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_WHEEL_KEEP_MOVE); // 运行例程
}

例程9-轮转模式控制(定圈)

fashion_star_uart_servo_examples.c

// 估计旋转圈数所需要花费的时间
uint16_t FSUSExample_EstimateTimeMs(uint16_t n_circle, uint16_t speed)
{
    return (uint16_t)((float)n_circle * 360.0f / (float)speed * 1000.0f);
}

/* 轮转模式控制(定圈) */
void FSUSExample_WheelMoveNCircle(void)
{
    uint8_t servo_id = 0;  // 连接在转接板上的串行总线ID号
    uint16_t speed = 200;  // 舵机的旋转方向 单位°/s
    uint8_t is_cw = 0;     // 舵机的旋转方向
    uint16_t n_circle = 1; // 舵机旋转的圈数

    while (1)
    {
        // 舵机轮转模式定速控制 顺时针旋转1圈
        is_cw = 1;
        FSUS_WheelMoveNCircle(servo_usart, servo_id, is_cw, speed, n_circle);
        // FSUS_WheelMoveNCircle是非阻塞的,因为有时候需要控制多个舵机同时旋转
        // 延时估算所需时间
        SysTick_DelayMs(FSUSExample_EstimateTimeMs(n_circle, speed));

        // 停顿1s
        SysTick_DelayMs(1000);

        // 舵机轮转模式定速控制 逆时针旋转1圈
        is_cw = 0;
        FSUS_WheelMoveNCircle(servo_usart, servo_id, is_cw, speed, n_circle);
        // 注意: FSUS_WheelMoveNCircle是非阻塞的,因为有时候需要控制多个舵机同时旋转
        // 延时估算所需时间
        SysTick_DelayMs(FSUSExample_EstimateTimeMs(n_circle, speed));

        // 停顿1s
        SysTick_DelayMs(1000);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_WHEEL_MOVE_NCIRCLE); // 运行例程
}

例程10-轮转模式控制(定时)

fashion_star_uart_servo_examples.c

/* 轮转模式控制(定时) */
void FSUSExample_WheelMoveNTime(void)
{
    uint8_t servo_id = 0;   // 连接在转接板上的串行总线ID号
    uint16_t speed = 20;    // 舵机的旋转方向 20°/s
    uint8_t is_cw = 0;      // 舵机的旋转方向
    uint16_t n_time = 3000; // 延时时间

    while (1)
    {
        // 舵机轮转模式定速控制 顺时针旋转3s
        is_cw = 1;
        FSUS_WheelMoveTime(servo_usart, servo_id, is_cw, speed, n_time);
        // FSUS_WheelMoveTime是非阻塞的,因为有时候需要控制多个舵机同时旋转
        // 所以在后面要手动加延迟
        SysTick_DelayMs(n_time);

        // 停顿1s
        SysTick_DelayMs(1000);

        // 舵机轮转模式定速控制 逆时针旋转3s
        is_cw = 0;
        FSUS_WheelMoveTime(servo_usart, servo_id, is_cw, speed, n_time);
        SysTick_DelayMs(n_time);

        // 停顿1s
        SysTick_DelayMs(1000);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_SET_WHEEL_MOVE_TIME); // 运行例程
}

例程11-用户自定义数据-重置

fashion_star_uart_servo_examples.c

/* 用户自定义数据-重置 */
void FSUSExample_ResetData(void)
{

    // 连接在转接板上的串行总线ID号
    uint8_t servo_id = 0;
    // 状态码
    FSUS_STATUS status_code;

    // 发送重置用户数据指令
    status_code = FSUS_ResetUserData(servo_usart, servo_id);
    printf("=====reset user data======\r\n status code: %d\r\n", status_code);
    if (status_code == FSUS_STATUS_SUCCESS)
    {
        printf("sucess\r\n");
    }
    else
    {
        printf("fail\r\n");
    }

    // 死循环
    while (1)
    {
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_RESET_DATA); // 运行例程
}

例程12-用户自定义数据-读取

fashion_star_uart_servo_examples.c

/* 用户自定义数据-读取 */
void FSUSExample_ReadData(void)
{
    uint8_t servo_id = 0;     // 连接在转接板上的串行总线ID号
    FSUS_STATUS statusCode;   // 状态码
    float angleLimitHigh = 0; // 舵机角度上限

    // 读取用户自定义数据
    // 数据表里面的数据字节长度一般为1个字节/2个字节/4个字节
    // 查阅通信协议可知,舵机角度上限的数据类型是有符号短整型(UShort, 对应STM32里面的int16_t),长度为2个字节
    // 所以这里设置value的数据类型为int16_t
    int16_t value;
    uint8_t dataSize;
    // 传参数的时候, 要将value的指针强行转换为uint8_t
    statusCode = FSUS_ReadData(servo_usart, servo_id, FSUS_PARAM_ANGLE_LIMIT_HIGH, (uint8_t *)&value, &dataSize);
    printf("=====read user data======\r\n status code: %d\r\n", statusCode);
    if (statusCode == FSUS_STATUS_SUCCESS)
    {
        // 用户自定义表里面,角度的单位是0.1度. 需要改写为度
        angleLimitHigh = value / 10.0;
        printf("read sucess, angle limit high: %f\r\n", angleLimitHigh);
    }
    else
    {
        printf("fail\r\n");
    }

    // 死循环
    while (1)
    {
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_READ_DATA); // 运行例程
}

例程13-用户自定义数据-写入

fashion_star_uart_servo_examples.c

/* 用户自定义数据-写入 */
void FSUSExample_WriteData(void)
{
    uint8_t servo_id = 0;    // 连接在转接板上的串行总线ID号
    FSUS_STATUS status_code; // 状态码
    // 限位角度
    float angle_limit_high = 90.0;     // 舵机角度上限 (默认值 135)
    float angle_limit_low = -90.0;     // 舵机角度下限 (默认值-135)
    uint8_t angle_limit_switch = 0x01; // 0x01: 开启限位; 0x00: 关闭限位

    uint16_t value;

    // 写入舵机角度上限
    value = (int16_t)(angle_limit_high * 10); // 舵机角度上限 转换单位为0.1度
    status_code = FSUS_WriteData(servo_usart, servo_id, FSUS_PARAM_ANGLE_LIMIT_HIGH, (uint8_t *)&value, 2);
    printf("write angle limit high = %f, status code: %d\r\n", angle_limit_high, status_code);

    // 写入舵机角度下限制
    value = (int16_t)(angle_limit_low * 10); // 舵机角度下限 转换单位为0.1度
    status_code = FSUS_WriteData(servo_usart, servo_id, FSUS_PARAM_ANGLE_LIMIT_LOW, (uint8_t *)&value, 2);
    printf("write angle limit low = %f, status code: %d\r\n", angle_limit_low, status_code);

    // 打开舵机角度限位开关, 配置生效
    status_code = FSUS_WriteData(servo_usart, servo_id, FSUS_PARAM_ANGLE_LIMIT_LOW, &angle_limit_switch, 1);
    printf("enable angle limit mode, status code: %d\r\n", status_code);

    while (1)
    {
        // 控制舵机角度
        FSUS_SetServoAngle(servo_usart, servo_id, 90.0, 2000, 0, 1);
        FSUS_SetServoAngle(servo_usart, servo_id, -90.0, 2000, 0, 1);
    }
}

main.c

#include "fashion_star_uart_servo_examples.h"


int main(void)
{ 
    // 系统资源初始化 
    SysTick_Init();                     // 系统时钟初始化
    LED_Init();                             // LED初始化
    Usart_Init();                           // 串口初始化

    // 根据例程ID运行测试例程
    // 详情见fashion_star_uart_servo_examples.h里面的定义
    FSUSExample_Run(FSUS_EXAMPLE_WRITE_DATA); // 运行例程
}
回到页面顶部