全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法
一、篇头
- 全志H713平台,作为FHD投影的低成本入门方案,其公板上也配齐了许多投影使用的模组,本文即介绍投影仪调焦所用的步进电机,此模组的驱动原理、配制方法、调试方法。
- 因为条件限制,本文采用的是H618香橙派Z3平台,驱动从H713上移植过来(遵循GPL协议)。

步进电机驱动视频-WeChat_20240225222000
二、准备工作
2.1 步进电机

2.2 驱动板

2.3 主控平台
2.3.1 H618开发板(本文采用)
- 香橙派Z3 1G DDR

2.3.2 H713
- 缺开发板,方法和代码
2.4 连线示意图
准备好适当的若干杜板线,将板子连接好。
- GPIO PC9 --> 驱动板 IN 4
- GPIO PC8 --> 驱动板 IN 3
- GPIO PC6 --> 驱动板 IN 2
- GPIO PC5 --> 驱动板 IN 1
- 最后链接5V、GND

三、驱动原理
3.1 驱动板原理图

3.2 驱动电机的方法
(1)1相励磁法: 4相4拍
每一瞬间只有一个线圈相通,其它休息。
优点:简单,耗电低,精确性良好。
缺点:力矩小,振动大,每次励磁信号走的角度都是标称角度。 1相励磁法 A->B->C->D按GPIO的说法:
GPIO-A(IN 1) 拉高,其余拉低 -> GPIO-B(IN 2),其余拉低 -> GPIO-C(IN 3),其余拉低 -> GPIO-D(IN 4),其余拉低
(2)2相励磁法: 4相4拍
每一瞬间有两个线圈导通。
优点:力矩大,震动小。
缺点:每励磁信号走的角度都是标称角度。
2相励磁法 AB->BC->CD->DA按GPIO的说法:
GPIO-A/B(IN 1/2) 拉高,其余拉低 -> GPIO-B/C(IN 2/3),其余拉低 -> GPIO-C/D(IN 3/4),其余拉低 -> GPIO-D/A(IN 4/1),其余拉低
(3)1-2相励磁法: 4相8拍
1相和2相交替导通。
优点)精度较高,运转平滑,每送一个励磁信号转动1/2标称角度,称为半步驱动。
1-2相励磁法 A-->AB-->B->BC->C-->CD->D-->DA按GPIO的说法:
GPIO-A(IN 1) 拉高,其余拉低 -> GPIO-A/B(IN 1/2) 拉高,其余拉低 -> GPIO-B(IN 2),其余拉低 -> 依次类推,轮流让引脚上电、断电
3.3 用二进制表示(1-2相励磁法)
3.3.1 逆时针
u8 phase_CW[8] ={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
二进制: 1000,1100,0100,0110,0010,0011,0001,1001
ABCD视角:A000,AB00,0B00,0BC0,00C0,00CD,000D,A00D
3.3.2 顺时针
u8 phase_CCW[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
二进制: 1001,0001,0011,0010,0110,0100,1100,1000
ABCD视角:A00D,0000D,00CD,00C0,0BC0,0B00,AB00,A000
3.3.3 图示
-
当GPIO-A拉高时,LED-A亮;拉低时,LED-A灭;其余LED与此相同,H-亮灯, L-灭灯。

-
上图是ULN2003步进电机驱动模块,可以看到上面的标号分别是A,B,C,D,因此代码我们可以按这个顺序来理解。
-
比如:AB是1100,BC是0110,CD是0011等
四、驱动实现
全志H713平台已内置此驱动。样例代码网上已有很多,此处仅取部分片段,并通过DTS的配置来详解各个参数的意义。
4.1 DTS配置
- board.dts 增加如下配置,同时将其余用到PC 5,6,8,9的地方做disabled处理,避免冲突
motor_24byj48: motor_24byj48 {compatible = "motor-control";motor-phase-num = <4>;motor-phase0-gpio = <&pio PC 5 GPIO_ACTIVE_HIGH>; //对应 IN 1,高电平有效motor-phase1-gpio = <&pio PC 6 GPIO_ACTIVE_HIGH>; //对应 IN 2motor-phase2-gpio = <&pio PC 8 GPIO_ACTIVE_HIGH>; //对应 IN 3motor-phase3-gpio = <&pio PC 9 GPIO_ACTIVE_HIGH>; //对应 IN 4motor-step-num = <8>;/* table index : b'(phase3 phase2 phase1 phase0) */motor-cw-table = /bits/ 8 <0x09 0x01 0x03 0x02 0x06 0x04 0x0c 0x08>;motor-ccw-table = /bits/ 8 <0x08 0x0c 0x04 0x06 0x02 0x03 0x01 0x09>;motor-phase-udelay = <5>;motor-step-mdelay = <2>;status = "okay";};
4.2 驱动实现
- 全志H713平台已内置此驱动。
static void motor_set_phase(struct device *dev, int *gpios, int num, int phases, int delay)
{int i;int value;for (i = 0; i < num; i++) {value = (phases >> i) & 0x01;dev_dbg(dev, "set gpio %d value %d\n", gpios[i], value);gpio_set_value(gpios[i], value);udelay(delay);// dts:motor-phase-udelay}
}static void motor_set_stop(struct device *dev, int *gpios, int num)
{int i;for (i = 0; i < num; i++)gpio_set_value(gpios[i], 0);//拉低即停止
}static int motor_run_mstep(struct motor_control *motor, struct motor_workdata *data)
{int i, j;char *phase_table = NULL;switch (data->dir) {case MOTOR_DIR_CW:phase_table = motor->cw_table;//采用正转相位参数表,共8个break;case MOTOR_DIR_CCW:phase_table = motor->ccw_table;//采用反转相位参数表,共8个break;default:dev_err(motor->dev, "motor run step dir_%d error\n", data->dir);return -EINVAL;}//驱动stepsfor (i = 0; i < data->cycle; i++) {for (j = 0; j < motor->step_num; j++) {dev_dbg(motor->dev, "cycle_%d set motor phase 0x%x\n", i, phase_table[j]);motor_set_phase(motor->dev, motor->phase_gpios, \motor->phase_num, phase_table[j], motor->phase_udelay);mdelay(motor->step_mdelay);}}//驱动完成,停止motor_set_stop(motor->dev, motor->phase_gpios, motor->phase_num);return 0;
}
五、测试方法
- 全志H713平台已内置此驱动。
5.1 查看驱动加载情况
- motor_24byj48: probe success
console:/ # dmesg | grep motor
[ 0.326672] motor linux driver init ok (Version 1.0.1)
[ 0.326804] motor limiter linux driver init ok (Version 1.0.1)
[ 0.655092] motor-control motor_24byj48: motor-phase-num=4
[ 0.661990] motor-control motor_24byj48: motor-step-num=8
[ 0.668789] motor-control motor_24byj48: motor-phase-udelay=5
[ 0.675967] motor-control motor_24byj48: motor-step-mdelay=2
[ 0.683157] motor-control motor_24byj48: motor-phase-num 4
[ 0.683161] motor-control motor_24byj48: motor-step-num 8
[ 0.683169] motor-control motor_24byj48: motor-cw-table < 0x09 0x01 0x03 0x02 0x06 0x04 0x0c 0x08 >
[ 0.683176] motor-control motor_24byj48: motor-ccw-table < 0x08 0x0c 0x04 0x06 0x02 0x03 0x01 0x09 >
[ 0.683533] motor-control motor_24byj48: probe success
console:/ #
5.2 测试命令
5.2.1 正走100步
console:/sys/devices/platform/motor_24byj48 # echo 1,100 > motor_ctrl
5.2.2 逆走100步
console:/sys/devices/platform/motor_24byj48 # echo 2,100 > motor_ctrl


六、篇尾
本人从事android智能电视、投影(DLP、LCD)相关开发已有十余年,熟悉从board bringup开始,到app的全栈开发,从事过MTK、amlogic、全志、RK、高通、海奇等芯片的APP、BSP开发。目前主要工作主要集中在全志、海奇的Soc平台的技术支持工作!圈子很小,无论您是在校生、应届生、或者业内人士,有需要的多多交流,喜欢文章的朋友可以点个收藏、关注~!
相关文章:
全志H713/H618方案:调焦电机(相励磁法步进电机)的驱动原理、适配方法
一、篇头 全志H713平台,作为FHD投影的低成本入门方案,其公板上也配齐了许多投影使用的模组,本文即介绍投影仪调焦所用的步进电机,此模组的驱动原理、配制方法、调试方法。因为条件限制,本文采用的是H618香橙派Z3平台&…...
excel数据导入到数据库的方法
背景:最近在做和HW对接的某项目,需要将第三方接口提供的数据进行展示;在对方提供了详细的excel后,觉得也挺简单的就是将excel数据导入到数据库中。 方案一: 普通的初学者肯定会想,那我读取excel数据&…...
Runaway Queries 管理:提升 TiDB 稳定性的智能引擎
在数字化系统扮演重要角色的今天,数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言,突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能,用户可以从管理流程入手规范变更的测试,或者利用产品手段减少预…...
K8S部署Java项目(Gitlab CI/CD自动化部署终极版)
天行健,君子以自强不息;地势坤,君子以厚德载物。 每个人都有惰性,但不断学习是好好生活的根本,共勉! 文章均为学习整理笔记,分享记录为主,如有错误请指正,共同学习进步。…...
对Redis锁延期的一些讨论与思考
上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁,并引入了一个新的问题 若定义锁的过期时间是10s,此时A线程获取了锁然后执行业务代码,但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码,A线程…...
【高德地图】Android高德地图初始化定位并显示小蓝点
📖第3章 初始化定位并显示小蓝点 ✅第1步:配置AndroidManifest.xml✅第2步:设置定位蓝点✅第3步:初始化定位✅完整代码 ✅第1步:配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…...
继电器测试中需要注意的安全事项有哪些?
继电器广泛应用于电气控制系统中的开关元件,其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中,为了确保测试的准确性和安全性,需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项:…...
Java向ES库中插入数据报错:I/O reactor status: STOPPED
Java向ES库中插入数据报错:java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时,第一次成功插入,第二次出现以下错误:…...
vue3实现页面跳转
有需求是在vue项目中实现点击按钮完成页面跳转。这里不适用a标签,而是用vue自带的vue-router。 首先看一下项目结构 src │ App.vue │ main.js │ ├─router │ index.js │ └─views index.vue content.vue 可以看到&…...
【Linux运维系列】vim操作
💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...
Centos服务器部署前后端项目
目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …...
【初始RabbitMQ】延迟队列的实现
延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息,并且队列内部是有序的。简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点: 订单在十分…...
spark为什么比mapreduce快?
spark为什么比mapreduce快? 首先澄清几个误区: 1:两者都是基于内存计算的,任何计算框架都肯定是基于内存的,所以网上说的spark是基于内存计算所以快,显然是错误的 2;DAG计算模型减少的是磁盘I/O次数&…...
Unity通过XXpermission插件获取MANAGE_EXTERNAL_STORAGE权限
最近公司准备用Unity做一个安卓端的文件管理器功能,文件管理器已经做完了。刚开始的时候想要申请一下所有文件权限,发现在Unity里面申请所有文件权限(android.permission.MANAGE_EXTERNAL_STORAGE)相对来说比较麻烦。所以准备写一下文章记录一下如何申请…...
「连载」边缘计算(二十一)02-26:边缘部分源码(源码分析篇)
(接上篇) DeviceTwin struct组成剖析 该部分对DeviceTwin struct的组成进行剖析。接着devicetwin struct调用链剖析的实例化DeviceTwin struct(dt : DeviceTwin{})往下剖析,进入DeviceTwin struct的定义,…...
Unity(第四部)新手组件
暴力解释就是官方给你的功能;作用的对象上面如: 创建一个球体,给这个球体加上重力 所有物体都是一个空物体,加上一些组件才形成了所需要的GameObject。 这是一个空物体,在Scene场景中没有任何外在表现,因为…...
【JS】【Vue3】【React】获取鼠标位置的方法:JavaScript、Vue 3和React示例
目录 使用JavaScript原生方法在Vue 3中获取鼠标位置在React中获取鼠标位置 随着Web应用程序的复杂性不断增加,获取用户交互信息变得越来越重要。其中,获取鼠标位置是一项常见的任务,可以用于实现各种交互效果,如拖拽、悬停提示等。…...
[Docker 教学] 常用的Docker 命令
Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此,Docker可以简化开发环境的复制,并使本地开发变得轻松。 以下是一些必备的Docker命令列表,这些命令将在你下一…...
小程序应用、页面、组件生命周期
引言 微信小程序生命周期是指在小程序运行过程中,不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件,帮助开发者更好地理解和利用小程序的生命周期。 …...
Springboot中如何记录好日志
Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位,他是我们在系统发生故障时用来排查问题的利器,也是我们做操作审计的重要依据。那么如何记录好日志呢?选择什么框架来记录日志,是不是日志打越…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
Auto-Coder使用GPT-4o完成:在用TabPFN这个模型构建一个预测未来3天涨跌的分类任务
通过akshare库,获取股票数据,并生成TabPFN这个模型 可以识别、处理的格式,写一个完整的预处理示例,并构建一个预测未来 3 天股价涨跌的分类任务 用TabPFN这个模型构建一个预测未来 3 天股价涨跌的分类任务,进行预测并输…...
定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
如何在网页里填写 PDF 表格?
有时候,你可能希望用户能在你的网站上填写 PDF 表单。然而,这件事并不简单,因为 PDF 并不是一种原生的网页格式。虽然浏览器可以显示 PDF 文件,但原生并不支持编辑或填写它们。更糟的是,如果你想收集表单数据ÿ…...
Fabric V2.5 通用溯源系统——增加图片上传与下载功能
fabric-trace项目在发布一年后,部署量已突破1000次,为支持更多场景,现新增支持图片信息上链,本文对图片上传、下载功能代码进行梳理,包含智能合约、后端、前端部分。 一、智能合约修改 为了增加图片信息上链溯源,需要对底层数据结构进行修改,在此对智能合约中的农产品数…...
