本文档介绍如何在CSK6大模型开发套件上驱动MG90S 360°数字舵机。
通过本指南,您将学习如何配置PWM输出、编写舵机控制代码,并实现舵机的精确控制。
本教程为进阶教程,部分代码以及设置本篇不再赘述,请您在学习本例教程前进行增加外设指引的例程学习。
| 舵机线 | 开发板接口 | 说明 |
|---|---|---|
| 红线 | 5V | 电源正极 |
| 棕线 | GND | 电源负极 |
| 橙线 | PA01 | PWM信号线 |
注意:舵机功率较大时,请使用独立电源供电,避免开发板电源不足。
在csk6_duomotai_devkit.overlay文件中添加PWM配置:
&gptchannel1 {
compatible = "listenai,csk-pwm";
status = "okay";
channel_mode = <1>; /* 0: timer; 1:pwm */
clock-prescaler = <128>;
pinctrl-0 = <&pinctrl_pwm1_default>;
pinctrl-names = "default";
};
在csk6_duomotai_devkit_pinctrl.dtsi中定义引脚:
pinctrl_pwm1_default: pwm1_default {
pinctrls = <GPT_PWM_1_GPIOA_01>; // PA01对应PWM通道1
};
在main.c中添加以下代码:
/* MG90S 360°数字舵机控制参数 */
#define SERVO_FREQUENCY 250 // 数字舵机常用频率250Hz
#define SERVO_PERIOD_NS (1000000000 / SERVO_FREQUENCY) // 4ms周期 (250Hz)
// MG90S 360°舵机控制参数
#define SERVO_STOP_PULSE_NS 1500000 // 1.5ms (停止)
#define SERVO_CW_MAX_PULSE_NS 1300000 // 1.3ms (逆时针全速)
#define SERVO_CCW_MAX_PULSE_NS 1700000 // 1.7ms (顺时针全速)
// 获取PWM设备树规格
const struct pwm_dt_spec spec = PWM_DT_SPEC_GET(DT_NODELABEL(inter_pwm));
// 设置舵机速度和方向
void set_servo_speed(int8_t speed) {
// 限制速度范围 (-100 到 +100)
if (speed > 100) speed = 100;
if (speed < -100) speed = -100;
uint32_t pulse_ns;
if (speed == 0) {
// 停止状态
pulse_ns = SERVO_STOP_PULSE_NS;
} else if (speed > 0) {
// 顺时针旋转 (速度0-100)
pulse_ns = SERVO_STOP_PULSE_NS -
(speed * (SERVO_STOP_PULSE_NS - SERVO_CW_MAX_PULSE_NS) / 100);
} else {
// 逆时针旋转 (速度-100-0)
pulse_ns = SERVO_STOP_PULSE_NS +
(-speed * (SERVO_CCW_MAX_PULSE_NS - SERVO_STOP_PULSE_NS) / 100);
}
// 应用PWM配置
if (pwm_set_dt(&spec, SERVO_PERIOD_NS, pulse_ns) == 0) {
printk("舵机速度: %d%%, 脉宽: %.2fms\n",
speed, (float)pulse_ns / 1000000.0);
} else {
printk("舵机控制失败!\n");
}
}
| 参数 | 默认值 | 说明 |
|---|---|---|
SERVO_FREQUENCY |
250Hz | 舵机控制频率 |
SERVO_STOP_PULSE_NS |
1500000ns (1.5ms) | 停止状态脉宽 |
SERVO_CW_MAX_PULSE_NS |
1300000ns (1.3ms) | 逆时针全速脉宽 |
SERVO_CCW_MAX_PULSE_NS |
1700000ns (1.7ms) | 顺时针全速脉宽 |
// MG90S 360°舵机运动序列
void mg90s_servo_sequence(void) {
// 确保舵机初始化完成
k_sleep(K_MSEC(100));
printk("开始MG90S 360°舵机运动序列...\n");
// 1. 顺时针旋转90°
printk("顺时针旋转90°...\n");
set_servo_speed(100); // 逆时针全速 (脉宽1.3ms)
k_sleep(K_MSEC(1000)); // 旋转1秒
// 2. 逆时针旋转180°
printk("逆时针旋转180°...\n");
set_servo_speed(-100); // 顺时针全速 (脉宽1.7ms)
k_sleep(K_MSEC(2000)); // 旋转2秒 (180°是90°的2倍时间)
// 3. 精确停止
printk("精确停止舵机...\n");
set_servo_speed(0); // 停止 (脉宽1.5ms)
// 持续发送停止信号
while (1) {
k_sleep(K_MSEC(100)); // 每100ms检查一次
set_servo_speed(0); // 确保持续发送停止信号
}
}
int main(void) {
// ... 其他初始化代码 ...
// PWM初始化与舵机控制
if (!device_is_ready(spec.dev)) {
printk("PWM设备未就绪: %s\n", spec.dev->name);
} else {
printk("PWM设备: %s (通道: %d)\n", spec.dev->name, spec.channel);
printk("MG90S 360°舵机配置: %dHz, 脉宽范围: %.1fms-%.1fms\n",
SERVO_FREQUENCY,
(float)SERVO_CW_MAX_PULSE_NS / 1000000.0,
(float)SERVO_CCW_MAX_PULSE_NS / 1000000.0);
// 执行舵机控制序列
mg90s_servo_sequence();
}
k_sleep(K_FOREVER);
return 0;
}
在项目配置文件prj.conf中添加以下配置:
//启用PWM支持
CONFIG_PWM=y
CONFIG_PWM_CSK6=y
=//日志配置
CONFIG_LOG=y
CONFIG_LOG_DEFAULT_LEVEL=3
在 SDK 根目(duomotai_ap)下可通过执行以下指令进行对该示例工程的编译:
lisa zep build -b csk6_duomotai_devkit apps\LLM_pic -p
编译完成后,编译产物二进制文件位于 build\zephyr\zephyr.bin
使用 Type-C 数据线连接开发套件的DAP_USB接口,选中以下其中一种方式对固件进行烧录:
cskburn desktop是一款聆思推出的桌面烧录工具,在下载并安装 cskburn desktop 烧录工具后,双击
图标运行软件:
1.点击串口下拉框,选择连接开发套件后识别到的串口编号;
2.将编译输出的.bin文件拖拽进烧录区域;
3.点击开始烧录,等待烧录完成。

// 修改前
set_servo_speed(100); // 顺时针
// 修改后
set_servo_speed(-100); // 顺时针
// 顺时针旋转90°
set_servo_speed(100);
k_sleep(K_MSEC(1200)); // 增加时间
set_servo_speed(80); // 80%速度
完整主函数代码(main.c)
main.c
提供打包的文件夹
LLM_pic.zip
提供直接烧录的bin文件
zephyr.bin