一、舵机控制原理
舵机(英文叫Servo):它由直流电机、减速齿轮组、传感器和控制电路组成的一套自动控制系统。通过发送信号,指定输出轴旋转角度。舵机一般而言都有最大旋转角度(比如180度)例如:1.5毫秒的脉冲,电机将转向90度的位置(通常称为中立位置,对于180°舵机来说,就是90°位置)。
如果脉冲宽度小于1.5毫秒,那么电机轴向朝向0度方向。如果脉冲宽度大于1.5毫秒,轴向就朝向180度方向。以180度舵机为例,对应的控制关系是这样的:
0.5ms————-0度;
1.0ms————45度;
1.5ms————90度;
2.0ms———–135度;
2.5ms———–180度;
二、新建RT_Thread项目
三、配置PWM驱动
四、关于PWM外设
查阅相关资料,舵机控制推荐的脉冲周期为50Hz,RTT提供的底层驱动最低频率为100Hz,经过实际验证100Hz频率控制舵机不影响使用。
五、功能实现代码
/*
程序清单:这是一个 PWM 设备使用例程
例程导出了 sg 命令到控制终端
命令调用格式:sg
程序功能:通过 PWM 设备控制舵机的旋转角度。
/
#include <rtthread.h>
#include <rtdevice.h>
#include <string.h>
#define SG_PIN_NUM rt_pin_get("PE.4") / LED PIN脚编号,查看驱动文件drv_gpio.c确定 /
#define PWM_DEV_NAME "lpwm0" / PWM设备名称 /
#define PWM_DEV_CHANNEL 0 / PWM通道 */
struct rt_device_pwm pwm_dev; / PWM设备句柄 /
/将输入字符串转换为数值型/
uint32_t Ascii2Hex(char ch, uint8_t length)
{
uint8_t i;
uint32_t value=0;
if(*ch < '0' || *ch > '9')
return 0;
for(i=0; i< length; i++)
{
value*=10;
value+= (*ch >= '0' && *ch <= '9') ? (*ch - '0') : 0;
ch++;
}
return value;
}
static int sg(int argc, char *argv[])
{
rt_uint32_t period, pulse,t;
period = 10000000; /* 周期为10ms,单位为纳秒ns */
pulse = 0; /* PWM脉冲宽度值,单位为纳秒ns */
/* 设置LED引脚脚模式为输出 */
rt_pin_mode(SG_PIN_NUM, PIN_MODE_OUTPUT);
/* 拉高LED引脚 */
rt_pin_write(SG_PIN_NUM, PIN_HIGH);
/* 查找设备 */
pwm_dev = (struct rt_device_pwm *)rt_device_find(PWM_DEV_NAME);
if (pwm_dev == RT_NULL)
{
rt_kprintf("steering gear control run failed! can't find %s device!\n", PWM_DEV_NAME);
return RT_ERROR;
}
/* 设置PWM周期和脉冲宽度默认值 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
/* 使能设备 */
rt_pwm_enable(pwm_dev, PWM_DEV_CHANNEL);
if(argc <2)
{
/* 由0度到180度,然后由180度到0度,循环运行5个周期 */
t = 5;
while (--t)
{
rt_thread_mdelay(1000);
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, period-500000);
rt_thread_mdelay(1000);
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, period-2500000);
}
}
else
{
/*将msh输入的字符转换为数值*/
pulse = Ascii2Hex(argv[1],strlen(argv[1]));
/* 计算舵机目标位置所需要的高电平脉冲宽度 */
t = 2000000/180*pulse;
pulse = period-500000-t; //pwm设定的占空比为低电平宽度,舵机控制使用高电平宽度控制旋转角度
/* 设置PWM周期和脉冲宽度 */
rt_pwm_set(pwm_dev, PWM_DEV_CHANNEL, period, pulse);
}
}
/* 导出到 msh 命令列表中 */
MSH_CMD_EXPORT(sg, sg sample [sg_angle:0~180]);
六、效果演示
七、使用体会
这本人第一次使用RISC-V的MCU,在此之前也经常在各种公众号上看到关于RISC-V的相关信息,工作中也一直是在使用M3、M4内核的MCU,说真的刚拿到板子是有些心虚的,后来沉下心来看了一下RTT的入门操作指南发现这东西并没有我们想象的那么复杂,再加上RTT的生态支持,可以说不需要知道什么是RISC-V就可以快速使用该MCU。
我在使用PWM外设时,也碰到了一些问题,一开始是想将PWM周期设为50Hz的,但是调试后发现频率最低只有100Hz,查阅Register说明但是都没有详细的说明,也希望后期官方能开放更加详细的资料。
总的来说AB32VG1是一个很不错我产品,作为集成蓝牙的一款SOC MCU,以后在一些智能家居,物联应用将会是一个不错的选择。
原作者:止于终老