ITPub博客

首页 > 嵌入式/内核开发 > 嵌入式/内核开发 > 《正点原子BEE BLOCK模块资料》舵机模块使用说明

《正点原子BEE BLOCK模块资料》舵机模块使用说明

原创 嵌入式/内核开发 作者:正点原子 时间:2025-04-30 11:01:33 0 删除 编辑

舵机模块使用说明


        1,硬件连接

       这里以正点原子M48Z-M3最小系统板STM32F103版为例,给大家介绍一下模块和板卡的连接方法。其它板卡与模块的硬件连接方法,请大家在“舵机模块\程序源码\相应板卡例程文件夹\readme.txt”路径下查看。

       舵机模块可通过杜邦线与正点原子M48Z-M3最小系统板STM32F103版进行连接,具体的连接关系,如下表所示:


表1.1舵机模块与M48Z-M3最小系统板STM32F103版连接关系


        2,实验功能


       2.1 舵机模块测试实验


       2.1.1 功能说明

       在本实验中,串口会打印实验提示信息。需要查看这部分实验信息的用户,可用杜邦线将最小系统板STM32F103的PA9引脚和GND连接至外部的USB转串口设备,这样就可以通过XCOM上位机查看串口打印的信息了。

       舵机控制方法:当按下KEY0反转加速,按下WKUP正转加速。

开发板的LED0闪烁,提示程序运行。


       2.1.2 源码解读

       打开本实验的工程文件夹,能够在./Drivers/BSP目录下看到STEERING_ENGINE文件夹和TIM文件夹,其中STEERING_ENGINE文件夹中就包含了舵机模块的驱动文件,TIM文件夹中就包含了定时器的驱动文件如下图所示:


图2.1.2.1舵机模块驱动代码


图2.1.2.2 定时器驱动代码


       2.1.2.1舵机模块驱动

       下面简要介绍steering_engine.c中几个重要的API 函数。


       1. 函数angle_to_tim_val ()

       该函数用于将所需要旋转的角度值转换成定时器的比较值,具体的代码,如下所示:

/**
 * @brief       舵机角度转定时器比较值
 * @param       angle:角度
 * @retval      定时器装比较值
 */
uint16_t angle_to_tim_val(float angle)
{
    uint16_t ret;
    if((angle < 0)||(angle > 180))
    {
        ret = 0;
    }
    else
{
    /* 0° -- 500,45° -- 1000,90° -- 1500,135° -- 2000,180° -- 2500 */
        ret = 1500 + (int)((float)((angle - 90) * 100 / 9));     
        if((ret < 500)||(ret > 2500))
        {
            ret = 0;
        }
    }
    return ret;
}

       舵机的旋转角度和脉宽成线性关系,比较值决定脉宽时间,所以我们这里把要转动的角度转成比较值控制脉宽时间,从而达到控制舵机旋转角度。


       2. 函数servo_angle_set ()

       该函数用于停止电机转动,具体代码,如下所示:

/**
 * @brief       舵机角度设定
 * @param       id:舵机编号对应舵机的接口:1~3
 * @param       angle:角度 
 * @retval      0:成功
 */
uint8_t servo_angle_set(uint8_t id,float angle)
{
    uint16_t val;
val = angle_to_tim_val(angle);    /* 得到角度转换的比较值 */
if(val != 0)
{
/* 设置比较值 */
__HAL_TIM_SetCompare(&g_atimx_pwm_chy_handle,TIM_CHANNEL_1,val);    
}
    return 0;
}

       调用到角度转比较值函数,然后我们将返回的数值,设置到定时器的比较值,即可完成脉宽时间的设置,控制舵机旋转对应角度。


       2.1.2.2 定时器驱动

       在图2.1.2.2中,gtim.c 和 gtim.h 为 定时器驱动文件,包含了定时器通道的初始化,并初始化定时器PWM输出功能。关于定时器PWM输出的驱动介绍,请查看正点原子各个开发板对应的开发指南中通用定时器章节。


       2.1.2.3 实验测试代码

       实验的测试代码在demo.c文件中,该文件在工程根目录下的 User文件夹。测试代码的入口函数为 demo_run(),具体的代码,如下所示:

/**
 * @brief       例程演示入口函数
 * @param       无
 * @retval      无
 */
void demo_run(void)
{
    uint8_t key = 0, t = 0;
    float angle = 0;
    key_init();                 /* 初始化按键 */
    gtim_timx_pwm_chy_init(20000 - 1, 72 - 1);  
    
    printf("舵机控制实验\r\n");
    printf("KEY0 舵机旋转角度-45°\r\n");
printf("WK_UP 舵机旋转角度+45°\r\n");  
  
    while (1)
    {
        key = key_scan(0);      
        if(key == KEY0_PRES)     /* 减速 */
        {
            angle -= 45;
            if (angle < 0)
            {
                angle = 0;
            }
            servo_angle_set(angle);       /* 设置角度值 */
            printf("Servo : %.1f\r\n",angle);        
}
        else if(key == WKUP_PRES)       /* 加速 */
        {
            angle += 45;
            if (angle > 180)
            {
                angle = 180;
            }
            servo_angle_set(angle);       /* 设置角度值 */
            printf("Servo : %.1f\r\n",angle);
        }
        
        delay_ms(10);
        t++;
        if(t % 20 == 0)
        {
            t = 0;
            LED0_TOGGLE();
        }
    }
}

       从上面代码可以看出,整个测试代码的逻辑相对简单。首先,初始化定时器后,在while循环中调用按键扫描函数,通过键值控制舵机旋转角度。WKUP增加舵机旋转角度,最大到180°;KEY0减小舵机旋转角度,最小到0°。最后,LED0闪烁表示程序正常运行。


       2.1.3 实验现象

       将舵机模块按照第一节“硬件连接”中介绍的连接方式与开发板连接,并将实验代码编译烧录至开发板中。本实验使用串口输出调试信息,因此需将开发板的 PA9连接至 DAP 虚拟串口(或 USB 转 TTL 模块)的 RX引脚。完成连接后,可通过串口调试助手XCOM查看实验信息输出,如下图所示:


图2.1.3.1 串口调试助手显示内容


       注:其它现象请看2.1.1功能说明。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70040860/viewspace-3082995/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2024-08-30

  • 博文量
    588
  • 访问量
    765201