0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

零知派——STM32驱动摇杆+PCA9685实现4路360°舵机线性速度控制与自动演示

零知实验室 来源:PCB56242069 作者:PCB56242069 2026-05-25 13:48 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

​ ✔零知派(零知开源)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比STM32系列开发板、物联网控制板。取消了Bootloader程序烧录,让开发重心从 “配置环境” 转移到 “创意实现”,极大降低了技术门槛。零知开源编程软件,内置上千个覆盖多场景的示例代码,支持项目源码一键下载,项目文章在线浏览。零知派(零知开源)平台通过软硬件协同创新,让你的创意快速转化为实物,来动手试试吧!

✔访问零知实验室,获取更多实战项目和教程资源吧!

www.lingzhilab.com

目录

一、系统接线部分

1.1 硬件清单

1.2 接线方案表

1.3 接线示意图

1.4 具体接线图

二、安装与使用教程

三、代码讲解部分

3.1 Joystick自动校准与归一化

3.2 PCA9685驱动与演示模式

3.3按键长按/短按检测

3.4Display准星极坐标绘制

3.5主循环调度

四、项目结果演示

4.1 操作流程

4.2 视频演示

五、技术原理讲解

5.1PCA9685工作原理

5.2摇杆模块原理

六、常见问题解答(FAQ)

Q1:摇杆校准完成后,中点附近舵机还是微微转动,怎么调?

Q2:能接超过4路舵机吗?

项目概述

本项目以零知派标准板(主控STM32F103RBT6)为核心,通过HW-504双轴摇杆模块配合PCA9685 16路PWM驱动芯片,实现对4路360°连续旋转舵机的精准线性速度控制。摇杆X轴归一化后线性映射舵机脉宽,长按SW键进入/退出自动演示模式,无操作超过10秒自动进入演示模式

项目难点及解决方案

问题描述:ADC中点偏移导致的四象限不对称

解决方案:上电100次采样自动校准中点,并在归一化时对每个方向单独计算最大偏移量

// Joystick.cpp - _normalize()核心逻辑
float maxDx = (dx >= 0)
  ? (float)(JOY_ADC_MAX - _centerX)   // 向右:4095 - 校准中点
  : (float)(_centerX - JOY_ADC_MIN);  // 向左:校准中点 - 0

一、系统接线部分

1.1 硬件清单

序号 模块/器件 型号/规格 数量 备注
1 零知派标准板 STM32F103RBT6 1 主控,类Arduino UNO引脚布局
2 PWM舵机驱动模块 PCA9685 16路 1 I2C地址0x40(默认)
3 双轴摇杆模块 HW-504 1 带SW按键,5V供电
4 彩色显示屏 ST7789 240×240 SPI 1 1.3寸,已适配Adafruit库
5 360°连续旋转舵机 MG996R/SG90连续版 1~4 4路360°舵机
6 舵机电源 5~6V/3A以上 1 舵机独立供电,禁用板载5V给多路舵机
7 杜邦线 公对母/公对公 若干

1.2 接线方案表

下方的引脚分配严格按照代码 config.h 中的定义,以本项目实际使用的零知派标准板引脚为准。接线时务必核对以下对应关系!

模块 模块引脚 零知派引脚 说明
HW-504摇杆 VCC 5V 摇杆电源
GND GND
VRX A0 X轴,config.h: JOY_X A0
VRY A1 Y轴,config.h: JOY_Y A1
SW D8 按键,config.h: JOY_SW 8
PCA9685 VCC 3.3V 芯片逻辑电源
GND GND
SCL A5 SoftWire时钟
SDA A4 SoftWire数据
V+ 舵机独立电源5~6V 舵机动力电源(不接板载5V)
舵机CH0 接舵机0 SERVO_CH_MAP[0]=0
舵机CH4 接舵机1 SERVO_CH_MAP[1]=4
舵机CH8 接舵机2 SERVO_CH_MAP[2]=8
舵机CH12 接舵机3 SERVO_CH_MAP[3]=12

ST7789显示屏直插零知派标准板,无需单独接线

1.3 接线示意图

wKgZO2oT3z2AOhgkABLkhavSTwE324.png

PCA9685的V+舵机电源引脚必须接独立电源,不能接零知派板的5V引脚——避免多路舵机产生1~2A启动电流

1.4 具体接线图

所有模块的GND和零知派GND需要共地连接

wKgZPGoT31mAFxuCABCN3-q-M1k018.png

上电顺序:先上外接电源,再给零知派标准板上电,避免PCA9685启动异常

舵机线色:红色-V+,黑色/棕色-GND,橙色/白色-信号线

二、安装与使用教程

2.1 开源平台-输入"PCA9685"并搜索-下载代码自动打开

wKgZO2oT4AiAG0U8AAcqI-esYd4923.png

2.2 连接-验证-上传

wKgZO2oT4A2AJ_f0AAvg8G6xUTU123.png

2.3 调试-串口监视器

wKgZPGoT4BSASr-sAAtlEvDRTZw461.png

三、代码讲解部分

项目代码结构:ServoJoy_STM32主程序、config全局配置、Joystick摇杆模块、Servo360舵机控制、Display显示模块

3.1 Joystick自动校准与归一化

各方向独立分母后,每个方向都精确到1.0,四象限完全对称,准星才能铺满整个圆形区域

void Joystick::_calibrate() {
  long sumX = 0, sumY = 0;
  for (int i = 0; i < JOY_CALIB_SAMPLES; i++) {  // 100次采样
    sumX += analogRead(JOY_X);
    sumY += analogRead(JOY_Y);
    delay(5);                      // 每次间隔5ms,避免ADC连续采样噪声叠加
  }
  _centerX = (int)(sumX / JOY_CALIB_SAMPLES);   // 均值作为中点
  _centerY = (int)(sumY / JOY_CALIB_SAMPLES);
  _d.centerX = _centerX;  // 写入JoyData,供Display.cpp准星绘制使用
  _d.centerY = _centerY;
}

void Joystick::_normalize(float dx, float dy, float &ratioX, float &ratioY) const {
  // dx >0表示向右偏,向右最大偏移 = 4095 - 校准中点(约1095)
  // dx< 0表示向左偏,向左最大偏移 = 校准中点 - 0(约3000)
  float maxDx = (dx >= 0)
    ? (float)(JOY_ADC_MAX - _centerX)
    : (float)(_centerX - JOY_ADC_MIN);
  float maxDy = (dy >= 0)
    ? (float)(JOY_ADC_MAX - _centerY)
    : (float)(_centerY - JOY_ADC_MIN);
  if (maxDx < 1.0f) maxDx = 1.0f;   // 防止除零
  if (maxDy < 1.0f) maxDy = 1.0f;
  ratioX = dx / maxDx;   // 结果范围 -1.0 ~ +1.0,四方向完全对称
  ratioY = dy / maxDy;
}

uint16_t Joystick::toServoUs() const {
  if (_d.inDeadZone) return SERVO_STOP_US;  // 死区内停转
  float r = _d.ratioX;    // 取X轴归一化分量 (-1..+1)
  if (r >= 0) {
    // 正方向(向右):线性从1500us到2500us(CCW方向,越右越快)
    return (uint16_t)(SERVO_STOP_US + r * (SERVO_CCW_MAX_US - SERVO_STOP_US));
  } else {
    // 负方向(向左):线性从1500us到500us(CW方向,越左越快)
    // r为负值,所以结果是1500 - |r| * 1000
    return (uint16_t)(SERVO_STOP_US + r * (SERVO_STOP_US - SERVO_CW_MAX_US));
  }
}

脉宽映射对照表:

ratioX 脉宽(μs) 舵机状态
0(死区内) 1590(根据实际调整) 停转
+0.3 1800 CCW慢速
+1.0 2500 CCW最快
-0.3 1200 CW慢速
-1.0 500 CW最快

3.2 PCA9685驱动与演示模式

完全非阻塞,updateDemo()每次loop只做一个时间判断,通过applyState()只在步骤切换时发送一次I2C写入

// 演示步骤序列
const Servo360Ctrl::DemoStep Servo360Ctrl::_demoSequence[] = {
  { 2000, { S_CW_SLOW,  S_STOP,     S_STOP,     S_STOP } }, // 步骤0: CH0慢速正转2s
  { 2000, { S_CW_FAST,  S_STOP,     S_STOP,     S_STOP } }, // 步骤1: CH0快速正转2s
  { 1500, { S_STOP,     S_STOP,     S_STOP,     S_STOP } }, // 步骤2: 全停1.5s
  { 2000, { S_CCW_SLOW, S_STOP,     S_STOP,     S_STOP } }, // 步骤3: CH0慢速反转2s
  { 2000, { S_CCW_FAST, S_STOP,     S_STOP,     S_STOP } }, // 步骤4: CH0快速反转2s
  { 1500, { S_STOP,     S_STOP,     S_STOP,     S_STOP } }, // 步骤5: 全停1.5s
  { 2000, { S_STOP,     S_CW_SLOW,  S_CCW_SLOW, S_STOP } }, // 步骤6: 双通道协同
  { 2000, { S_STOP,     S_CCW_FAST, S_CW_FAST,  S_STOP } }, // 步骤7: 双通道快速对转
  { 1500, { S_STOP,     S_STOP,     S_STOP,     S_STOP } }  // 步骤8: 全停循环
};

// 非阻塞状态机更新
void Servo360Ctrl::updateDemo(uint32_t nowMs) {
  if (!_demoMode) return;
  // 检查当前步骤是否已超时
  if (nowMs - _demoLastStepTime >= _demoSequence[_demoStepIndex].durationMs) {
    _demoStepIndex++;
    if (_demoStepIndex >= DEMO_STEPS) {
      _demoStepIndex = 0;  // 循环
    }
    _applyDemoStep(_demoStepIndex);
    _demoLastStepTime = nowMs;
  }
}

// 演示模式隔离
void Servo360Ctrl::runJoy(uint16_t usPolar) {
  if (_demoMode) return;  // 演示模式屏蔽摇杆

  servo[ctrlTarget].state = S_JOY;
  servo[ctrlTarget].stateStr = "JOY    ";
  setUs(ctrlTarget, usPolar);

  // 非选中通道强制停止(保证不误转)
  for (uint8_t i = 0; i < SERVO_CH_COUNT; i++) {
…  Serial.print("[SWITCH] - > S"); Serial.print(ctrlTarget);
  Serial.print(" (PCA CH"); Serial.print(SERVO_CH_MAP[ctrlTarget]);
  Serial.println(")");
}

每个DemoStep包含:持续时间(ms)+ 4路舵机的目标状态,结构体清晰嵌套

3.3按键长按/短按检测

g_buttonLongPressFlag的作用是防止长按触发后、松手时再次触发短按逻辑

void checkButtonLongPress(JoyData &joy) {
  static bool lastPress = false;

  if (joy.btnPress && !lastPress) {
    // ① 刚按下:记录时间,清除长按标志
    g_lastButtonPressTime = millis();
    g_buttonLongPressFlag = false;
  }
  else if (joy.btnPress && !g_buttonLongPressFlag) {
    // ② 持续按下且未触发过长按:检查是否超过阈值
    if (millis() - g_lastButtonPressTime >= LONG_PRESS_MS) {  // 默认1000ms
      g_buttonLongPressFlag = true;   // 置位,防止重复触发
      // 切换演示模式
      ServoCtrl.isDemoMode() ? ServoCtrl.stopDemoMode() : ServoCtrl.startDemoMode();
    }
  }
  else if (!joy.btnPress && lastPress && !g_buttonLongPressFlag) {
    // ③ 已释放 且 未触发过长按 = 短按
    if (!ServoCtrl.isDemoMode()) ServoCtrl.switchTarget();
  }

  lastPress = joy.btnPress;
}

状态机时序:

按下→─────────────────────── 1000ms ──────────────────────→ 继续按

①记录时间 ②长按触发,切换演示模式

按下→释放(<1000ms)

①记录时间 ③短按触发,切换通道

3.4Display准星极坐标绘制

joy.r和joy.ratioX/Y直接来自归一化计算结果、与舵机映射完全一致,准星和实际控制完全同步

void Display::_drawCrossHair(const JoyData& joy) {
  // 1. 擦除上次红点(用背景色圆形覆盖)
  _tft.fillCircle(_lastDotX, _lastDotY, DOT_R + 1, C_PANEL);
  // 2. 重绘被擦除的准星线段(局部刷新方式,避免全屏刷新的闪烁)
  _tft.drawCircle(CX, CY_CROSS, CR, C_CROSS);
  _tft.drawCircle(CX, CY_CROSS, CR / 3, C_CROSS);
  _tft.drawFastHLine(CX - CR, CY_CROSS, CR * 2, C_CROSS);
  _tft.drawFastVLine(CX, CY_CROSS - CR, CR * 2, C_CROSS);

  int dotX = CX, dotY = CY_CROSS;   // 默认在圆心(死区状态)
  if (!joy.inDeadZone) {
    float maxPix = (float)(CR - DOT_R - 1);  // 红点中心最大偏移像素
    float pixelR = joy.r * maxPix;            // joy.r是归一化极径(0~1)
    float angleRad = atan2f(joy.ratioY, joy.ratioX);  // 用归一化分量算角度
    dotX = CX + (int)(pixelR * cosf(angleRad));
    dotY = CY_CROSS + (int)(pixelR * sinf(angleRad));
    // 安全夹紧(极坐标计算误差保护)
    float ddx = (float)(dotX - CX), ddy = (float)(dotY - CY_CROSS);
    float dd = sqrtf(ddx*ddx + ddy*ddy);
    if (dd > maxPix) {
      dotX = CX + (int)(ddx / dd * maxPix);
      dotY = CY_CROSS + (int)(ddy / dd * maxPix);
    }
  }
  _lastDotX = dotX; _lastDotY = dotY;
  // 死区内灰色,死区外红色
  _tft.fillCircle(_lastDotX, _lastDotY, DOT_R,
                  joy.inDeadZone ? C_LABEL : C_DOT);
}

局部刷新策略

不调用fillScreen(),只在红点移动时:①擦旧点→②补准星线→③画新点,每帧仅写入极少量像素,彻底消除屏幕闪烁。

3.5主循环调度

主循环每秒约读20-30次摇杆(非阻塞延时10ms),100ms刷新一次显示屏。演示模式和摇杆控制互斥运行,状态机清晰

void loop() {
  uint32_t now = millis();

  Joy.update();                      // ① 读取摇杆(约0.5ms)
  JoyData joy = Joy.getData();

  checkButtonLongPress(joy);         // ② 按键长/短按检测

  // ③ 无操作自动演示(摇杆在死区 且 超过10秒未操作)
  if (!joy.inDeadZone || joy.btnPress) g_lastActiveTime = now;
  if (!ServoCtrl.isDemoMode()
      && (now - g_lastActiveTime > DEMO_AUTO_START_SEC * 1000UL)
      && (now > 5000)) {             // 防止上电5s内误触发
    ServoCtrl.startDemoMode();
  }

  // ④ 舵机控制(手动/演示二选一)
  if (!ServoCtrl.isDemoMode()) {
    ServoCtrl.runJoy(Joy.toServoUs());  // 线性速度映射
  } else {
    ServoCtrl.updateDemo(now);          // 演示状态机
  }

  // ⑤ 显示刷新(100ms周期,不阻塞舵机控制)
  if (now - g_lastDisp >= DISPLAY_INTERVAL_MS) {
    g_lastDisp = now;
    Disp.update(ServoCtrl.servo, ServoCtrl.ctrlTarget, joy, ServoCtrl.isDemoMode());
  }

  serialCommand();   // ⑥ 串口命令响应
  delay(10);         // ⑦ 主循环10ms节拍
}

系统流程图

wKgZPGoT4IaAdnD5AAypohVo01E810.png

PCA9685 核心API

// 1. 实例化(传入SoftWire全局实例Wire,地址B000000=0x40,速度100kHz)
PCA9685 _pwm(B000000, Wire, 100000);

// 2. 初始化序列(缺一不可)
_pwm.resetDevices();      // 发送软件复位(广播地址0x00,0x06命令)
_pwm.init(
  PCA9685_OutputDriverMode_TotemPole,    // 推挽输出(舵机信号线需要推挽)
  PCA9685_OutputEnabledMode_Normal,      // OE低电平使能输出
  PCA9685_OutputDisabledMode_Low,        // OE高时输出拉低(安全状态)
  PCA9685_ChannelUpdateMode_AfterStop,   // STOP信号后更新(标准I2C时序)
  PCA9685_PhaseBalancer_None             // 不做相位平衡(舵机不需要)
);
_pwm.setPWMFreqServo();   // 设置50Hz(舵机标准频率,内部自动计算预分频值)

// 3. 写入PWM(核心控制接口)
_pwm.setChannelPWM(physCh, tick);
// physCh: 物理通道号(本项目用0/4/8/12,间隔4个引脚接舵机)
// tick: 0~4095,对应ON时刻到OFF时刻的计数值(固定ON=0)

脉宽到tick的换算

uint16_t _usToPWM(uint16_t us) {
    // 50Hz周期 = 20ms = 20000μs,分辨率4096步
    // tick = us / 20000 * 4096
    return (uint16_t)((uint32_t)us * 4096 / 20000);
}

脉宽μs tick值 说明
500 102 CW最快
1350 276 CW慢速
1590 307 停转
1650 337 CCW慢速
2500 512 CCW最快

四、项目结果演示

4.1 操作流程

上电校准阶段

保持摇杆在中心位置不动,系统自动采集100次ADC值计算中点,串口打印校准结果,显示屏进入主界面

wKgZO2oT4UuAE-xxAApHMYKy78s081.png

手动控制模式

wKgZPGoT4VCASccaAB5MGFl_ZnI818.png

操作 效果 显示屏变化
摇杆向右推 选中通道CCW方向旋转,越快越远 色条向右延伸,准星红点向右移动
摇杆向左推 选中通道CW方向旋转,越快越远 色条向左延伸,准星红点向左移动
摇杆归中 立即停转 色条回中,准星居中灰色
短按SW 切换选中通道(S0→S1→S2→S3→S0) 标题栏通道标签切换颜色和编号
长按SW(>1s) 进入演示模式 左上角从"MANUAL"切换为绿色"DEMO"

演示模式

系统自动按序展示:CH0慢速正转→快速正转→全停→慢速反转→快速反转→全停→双通道协同对转→双通道快速对转→全停,循环进行

期间摇杆和短按均无效,长按SW退出回手动模式。无手动操作10秒后自动进入演示模式

4.2 视频演示

STM32驱动PCA9685控制4路360°舵机 摇杆线性速度控制+演示模式全功能演示

视频展示基于零知派标准板(STM32F103RBT6)的ServoJoy多路舵机控制系统完整功能演示。上电自动摇杆校准过程、手动模式下摇杆控制舵机线性速度、短按切换4路舵机控制目标、长按进入自动演示模式(9步循环展示正反转快慢速及多通道协同)、ST7789彩屏实时显示状态与准星追踪、无操作10秒自动演示模式触发

五、技术原理讲解

5.1PCA9685工作原理

PCA9685是一款16通道12位分辨率PWM扩展芯片,专门为驱动多路舵机或多路LED

wKgZO2oT4bKAZLrvAADW1rDVCco417.png

① 内部振荡器与PWM计数器

PCA9685内置一个25MHz振荡器,通过MODE1寄存器的SLEEP位控制休眠。PWM频率由PRESCALE寄存器设定

wKgZPGoT4buAfRYNAAAqTvGkAPk273.png

每个通道有4个字节寄存器(LED_ON_L/H,LED_OFF_L/H)

描述该通道PWM信号在4096步时钟内的ON和OFF时刻。本项目固定ON=0,只改变OFF值(即tick),舵机脉宽 = tick/4096 × 20ms

prescale = round(25,000,000 / (4096 × 50)) - 1 = 121

② I2C总线通信

I2C通信帧结构

wKgZO2oT4hqAB-weAABuVCa90Ps037.png

PCA9685的通道寄存器地址 = 0x06 + 通道号 × 4

本项目写入时自动递增,AUTO INCREMENT模式,MODE1的AI位=1

地址扩展

wKgZPGoT4i-ASmdyAAAxUDM9V6c551.png

默认I2C地址为0x40,硬件引脚A0~A5用于配置地址偏移,因此一条I2C总线上最多可挂载62块PCA9685模块,每个模块提供16个PWM输出通道,一个STM32即可控制992路舵机

位7 位6 位5 位4 位3 位2 位1 位0
1 A5 A4 A3 A2 A1 A0 R/W
固定值 “ 1 ” 可定义 可定义 可定义 可定义 可定义 可定义 读/写控制

舵机控制频率与PWM编码

wKgZPGoT4j2AYuNvAABgTozkLxw394.png

舵机控制需要50Hz固定频率PWM信号(周期=20000μs),在周期内高电平时间(脉宽)决定舵机的角度/速度

ratioX∈[-1, +1] → 脉宽∈[500,2500] → 舵机转速从最大CW渐变到停止再到最大CCW,连续无级

5.2摇杆模块原理

HW-504摇杆模块由两个独立10kΩ电位器(X/Y轴)+一个按键开关(Z轴)构成,使用STM32的ADC采集各轴电压变化判断位置

wKgZO2oT4k-Afk87AACJwo1QAlg634.png

X轴原理:摇杆从最左到最右移动时,X轴电位器的滑动端输出0V→5V连续电压。STM32的12位ADC将电压0-5V量化为0-4095数值。Y轴同理

六、常见问题解答(FAQ)

Q1:摇杆校准完成后,中点附近舵机还是微微转动,怎么调?

A:适当增大JOY_DEAD死区值(config.h),从150增加到200~250试试。如果舵机本身1500μs停转不准确,调整SERVO_STOP_US定义值(±10~30μs微调)

Q2:能接超过4路舵机吗?

A:可以。修改config.h中的SERVO_CH_COUNT和SERVO_CH_MAP数组,PCA9685最多支持16路,增加通道后Display.cpp的行高ROW_H需相应减小(240px高度÷路数)

项目资源整合

PCA9685数据手册: PCA9685.pdf

PCA9685 库: NachtRaveVL/PCA9685

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2313

    文章

    11210

    浏览量

    375265
  • PCA9685
    +关注

    关注

    5

    文章

    8

    浏览量

    16687
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    驱动PCA9685控制360舵机摇杆线性速度控制+演示模式

    行业资讯
    PCB56242069
    发布于 :2026年05月25日 14:27:20

    ——STM32驱动摇杆+PCA9685实现4360°舵机线性速度控制自动演示

    摇杆模块配合PCA9685 16PWM驱动芯片,实现4
    发表于 05-25 14:24

    ——TCS3200颜色识别传感器模块

     ✔开源)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比S
    的头像 发表于 05-13 16:26 616次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>派</b>——TCS3200颜色识别传感器模块

    【ESP32教程】Web网页控制彩色LED

    ​​ ✔开源)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比
    的头像 发表于 05-11 20:53 230次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>派</b>【ESP32教程】Web网页<b class='flag-5'>控制</b>彩色LED

    ——STM32驱动INA219电流功率监测计实现高精度电源管理

    目基于STM32F103RBT6微控制器和INA219电流功率监测计,实现了一个高精度的电
    发表于 04-18 16:14

    ——STM32驱动INA219电流功率监测计实现高精度电源管理

    本文介绍了一种基于STM32F103RBT6微控制器和INA219电流功率监测计的高精度电源监控系统。该系统通过软件I2C(SoftW
    的头像 发表于 04-18 15:07 2490次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b><b class='flag-5'>派</b>——<b class='flag-5'>STM32</b><b class='flag-5'>驱动</b>INA219电流功率监测计<b class='flag-5'>实现</b>高精度电源管理

    在昉·星光开发板上通舵机控制板实现机器人舵机控制

    舵机,来实现不同部位的动作,如果都连接到开发板,可能会引脚不够,所以在控制舵机的时候,一般都会使用舵机
    发表于 03-09 06:23

    在 VisionFive 2 上实现机器人伺服控制

    数量的伺服电机来实现不同件的动作。如果它们都连接到开发板,则可能引脚不足。因此,在控制伺服时,一般采用伺服控制板。 在本演示中,我们使用
    发表于 03-05 07:09

    IDE——基于标准板驱动PAJ7620U2手势控制L9110风扇模块和SG90舵机系统

    舵机的精确角度定位,实现了无接触式智能交互体验项目难点及解决方案 问题描述:标准板的analogWrite()函数导致系统卡死解决方案:放弃analogWrite()函数,手动配置
    发表于 01-06 11:56

    IDE——基于ESP32与DRV8833的稳定电机测速系统实现教程

    ​ ✔开源(IDE)是一个专为电子初学者/电子兴趣爱好者设计的开源软硬件平台,在硬件上提供超高性价比STM32系列开发板、物联网
    发表于 12-15 16:41

    舵机怎么控制正反,舵机怎么使用?

    一、舵机怎么控制正反? 舵机的 “正反” 本质是 旋转方向的控制 ,但其方向逻辑与直流电机不同(并非通过电源正负极切换),而是通过 目标角度与当前角度的偏差 由内部电路
    的头像 发表于 08-19 10:52 3362次阅读

    开源——STM32F407VET6驱动SHT41温湿度传感器完整教程

    摘要:本项目基于STM32F407VET6增强板驱动SHT41高精度温湿度传感器,实现±0.2℃温度精度和±1.8%RH湿度精度的数据采
    的头像 发表于 07-09 18:53 2087次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b>开源——<b class='flag-5'>STM32</b>F407VET6<b class='flag-5'>驱动</b>SHT41温湿度传感器完整教程

    开源——基于STM32F407VET6增强板的四独立计时器

    本帖最后由 PCB56242069 于 2025-7-1 11:24 编辑 项目概述本教程将指导你如何使用STM32F407VET6增强板实现一个功能强大的四
    发表于 07-01 10:31

    开源——基于STM32F407VET6增强板的四独立计时器

    本教程介绍基于STM32F407VET6增强板的四独立计时器实现方案。项目采用TFT显示屏、蜂鸣器和按钮构建交互系统,支持各计时器独立
    的头像 发表于 07-01 10:13 1690次阅读
    <b class='flag-5'>零</b><b class='flag-5'>知</b>开源——基于<b class='flag-5'>STM32</b>F407VET6<b class='flag-5'>零</b><b class='flag-5'>知</b>增强板的四<b class='flag-5'>路</b>独立计时器

    开源——STM32F4驱动MAX31865实现PT100高精度测温

    使用Callendar-Van Dusen方程计算。 ​ 4.演示视频 https://live.csdn.net/v/478784?spm=1001.2014.3001.5501
    发表于 05-26 18:52