当前位置: 首页 > news >正文

全志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平台&#xff0c;作为FHD投影的低成本入门方案&#xff0c;其公板上也配齐了许多投影使用的模组&#xff0c;本文即介绍投影仪调焦所用的步进电机&#xff0c;此模组的驱动原理、配制方法、调试方法。因为条件限制&#xff0c;本文采用的是H618香橙派Z3平台&…...

excel数据导入到数据库的方法

背景&#xff1a;最近在做和HW对接的某项目&#xff0c;需要将第三方接口提供的数据进行展示&#xff1b;在对方提供了详细的excel后&#xff0c;觉得也挺简单的就是将excel数据导入到数据库中。 方案一&#xff1a; 普通的初学者肯定会想&#xff0c;那我读取excel数据&…...

Runaway Queries 管理:提升 TiDB 稳定性的智能引擎

在数字化系统扮演重要角色的今天&#xff0c;数据库稳定性成为企业关注的核心问题。对于重要计算机系统而言&#xff0c;突发的性能下降可能对业务造成不可估量的损失。为了稳定数据库性能&#xff0c;用户可以从管理流程入手规范变更的测试&#xff0c;或者利用产品手段减少预…...

K8S部署Java项目(Gitlab CI/CD自动化部署终极版)

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…...

对Redis锁延期的一些讨论与思考

上一篇文章提到使用针对不同的业务场景如何合理使用Redis分布式锁&#xff0c;并引入了一个新的问题 若定义锁的过期时间是10s&#xff0c;此时A线程获取了锁然后执行业务代码&#xff0c;但是业务代码消耗时间花费了15s。这就会导致A线程还没有执行完业务代码&#xff0c;A线程…...

【高德地图】Android高德地图初始化定位并显示小蓝点

&#x1f4d6;第3章 初始化定位并显示小蓝点 ✅第1步&#xff1a;配置AndroidManifest.xml✅第2步&#xff1a;设置定位蓝点✅第3步&#xff1a;初始化定位✅完整代码 ✅第1步&#xff1a;配置AndroidManifest.xml 在application标签下声明Service组件 <service android:n…...

继电器测试中需要注意的安全事项有哪些?

继电器广泛应用于电气控制系统中的开关元件&#xff0c;其主要功能是在输入信号的控制下实现输出电路的断开或闭合。在继电器测试过程中&#xff0c;为了确保测试的准确性和安全性&#xff0c;需要遵循一定的安全事项。以下是在进行继电器测试时需要注意的安全事项&#xff1a;…...

Java向ES库中插入数据报错:I/O reactor status: STOPPED

Java向ES库中插入数据报错&#xff1a;java.lang.IllegalStateException: Request cannot be executed; I/O reactor status: STO 一、问题问题原因 二、解决思路 一、问题 在使用Java向ES库中插入数据时&#xff0c;第一次成功插入&#xff0c;第二次出现以下错误&#xff1a…...

vue3实现页面跳转

有需求是在vue项目中实现点击按钮完成页面跳转。这里不适用a标签&#xff0c;而是用vue自带的vue-router。 首先看一下项目结构 src │ App.vue │ main.js │ ├─router │ index.js │ └─views index.vue content.vue 可以看到&…...

【Linux运维系列】vim操作

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

Centos服务器部署前后端项目

目录 准备工作1. 准备传输软件2. 连接服务器 部署Mysql1.下载Mysql(Linux版本)2. 解压3. 修改配置4. 启动服务另一种方法Docker 部署后端1. 在项目根目录中创建Dockerfile文件写入2. 启动 部署前端1. 在项目根目录中创建Dockerfile文件写入2. 启动 准备工作 1. 准备传输软件 …...

【初始RabbitMQ】延迟队列的实现

延迟队列概念 延迟队列中的元素是希望在指定时间到了之后或之前取出和处理消息&#xff0c;并且队列内部是有序的。简单来说&#xff0c;延时队列就是用来存放需要在指定时间被处理的元素的队列 延迟队列使用场景 延迟队列经常使用的场景有以下几点&#xff1a; 订单在十分…...

spark为什么比mapreduce快?

spark为什么比mapreduce快&#xff1f; 首先澄清几个误区&#xff1a; 1&#xff1a;两者都是基于内存计算的&#xff0c;任何计算框架都肯定是基于内存的&#xff0c;所以网上说的spark是基于内存计算所以快&#xff0c;显然是错误的 2;DAG计算模型减少的是磁盘I/O次数&…...

Unity通过XXpermission插件获取MANAGE_EXTERNAL_STORAGE权限

最近公司准备用Unity做一个安卓端的文件管理器功能&#xff0c;文件管理器已经做完了。刚开始的时候想要申请一下所有文件权限&#xff0c;发现在Unity里面申请所有文件权限(android.permission.MANAGE_EXTERNAL_STORAGE)相对来说比较麻烦。所以准备写一下文章记录一下如何申请…...

「连载」边缘计算(二十一)02-26:边缘部分源码(源码分析篇)

&#xff08;接上篇&#xff09; DeviceTwin struct组成剖析 该部分对DeviceTwin struct的组成进行剖析。接着devicetwin struct调用链剖析的实例化DeviceTwin struct&#xff08;dt : DeviceTwin{}&#xff09;往下剖析&#xff0c;进入DeviceTwin struct的定义&#xff0c;…...

Unity(第四部)新手组件

暴力解释就是官方给你的功能&#xff1b;作用的对象上面如&#xff1a; 创建一个球体&#xff0c;给这个球体加上重力 所有物体都是一个空物体&#xff0c;加上一些组件才形成了所需要的GameObject。 这是一个空物体&#xff0c;在Scene场景中没有任何外在表现&#xff0c;因为…...

【JS】【Vue3】【React】获取鼠标位置的方法:JavaScript、Vue 3和React示例

目录 使用JavaScript原生方法在Vue 3中获取鼠标位置在React中获取鼠标位置 随着Web应用程序的复杂性不断增加&#xff0c;获取用户交互信息变得越来越重要。其中&#xff0c;获取鼠标位置是一项常见的任务&#xff0c;可以用于实现各种交互效果&#xff0c;如拖拽、悬停提示等。…...

[Docker 教学] 常用的Docker 命令

Docker是一种流行的容器化技术。使用Docker可以将数据科学应用程序连同代码和所需的依赖关系打包成一个名为镜像的便携式工件。因此&#xff0c;Docker可以简化开发环境的复制&#xff0c;并使本地开发变得轻松。 以下是一些必备的Docker命令列表&#xff0c;这些命令将在你下一…...

小程序应用、页面、组件生命周期

引言 微信小程序生命周期是指在小程序运行过程中&#xff0c;不同阶段触发的一系列事件和函数。这一概念对于理解小程序的整体架构和开发流程非常重要。本文将介绍小程序生命周期的概念以及在不同阶段触发的关键事件&#xff0c;帮助开发者更好地理解和利用小程序的生命周期。 …...

Springboot中如何记录好日志

Springboot中如何记录日志 日志体系整体介绍 日志一直在系统中占据这十分重要的地位&#xff0c;他是我们在系统发生故障时用来排查问题的利器&#xff0c;也是我们做操作审计的重要依据。那么如何记录好日志呢&#xff1f;选择什么框架来记录日志&#xff0c;是不是日志打越…...

从“必备”到“装X”:我的VSCode插件分层管理法,效率提升不止亿点点

从“必备”到“装X”&#xff1a;我的VSCode插件分层管理法&#xff0c;效率提升不止亿点点 作为一名长期与VSCode为伴的开发者&#xff0c;我深知插件管理的重要性。起初&#xff0c;我也像大多数人一样&#xff0c;看到推荐就安装&#xff0c;结果导致编辑器启动缓慢、内存占…...

【国家药监局NMPA最新指南解读】:Docker在IVD软件SaaS化中的强制配置项(2024Q3生效,错过即停运)

第一章&#xff1a;Docker在IVD软件SaaS化中的监管定位与合规边界在体外诊断&#xff08;IVD&#xff09;软件向SaaS模式演进过程中&#xff0c;Docker容器并非中立的技术载体&#xff0c;而是直接参与医疗器械质量管理体系&#xff08;QMS&#xff09;和监管合规链条的关键组件…...

别再死记硬背编译原理了!用Java手搓一个DFA字符串识别器(附完整源码)

用Java实现DFA字符串识别器&#xff1a;从理论到实战的编译原理实践 编译原理作为计算机科学的核心课程之一&#xff0c;常常让学习者感到抽象难懂。特别是有限自动机&#xff08;DFA&#xff09;这类概念&#xff0c;如果仅停留在理论层面&#xff0c;很难真正掌握其精髓。本文…...

BuilderBench:智能体物理交互学习的革新基准测试

1. 智能体交互学习的新挑战与BuilderBench的诞生在当今AI领域&#xff0c;我们正面临一个根本性矛盾&#xff1a;大语言模型在文本生成和模式识别方面表现出色&#xff0c;但它们的学习方式本质上仍是对人类已有知识的模仿和精炼。这种"鹦鹉学舌"式的学习在面对需要创…...

烽火HG5143D光猫折腾实录:用Fiddler抓包+U盘拷贝,手把手教你拿到超级密码

烽火HG5143D光猫深度探索&#xff1a;从抓包分析到权限获取的完整实践 家里刚升级了电信宽带&#xff0c;配套的烽火HG5143D光猫却成了网络自由的第一道障碍。这款设备默认采用网关模式&#xff0c;让很多高级网络功能无法施展。经过几天的摸索&#xff0c;我发现了一套相对可靠…...

Minecraft服务器终极RPG体验:mcMMO完整配置与使用指南

Minecraft服务器终极RPG体验&#xff1a;mcMMO完整配置与使用指南 【免费下载链接】mcMMO The RPG Lovers Mod! 项目地址: https://gitcode.com/gh_mirrors/mc/mcMMO mcMMO是《我的世界》服务器中最受欢迎的角色扮演插件之一&#xff0c;为你的服务器添加了深度的技能系…...

蓝桥杯单片机省赛避坑指南:用STC-ISP搞定74HC573数码管驱动,告别闪烁鬼影

蓝桥杯单片机竞赛实战&#xff1a;74HC573数码管驱动优化与调试技巧 在蓝桥杯单片机竞赛中&#xff0c;数码管显示模块的稳定性往往成为决定成败的关键细节。许多参赛选手在移植传统51单片机代码时&#xff0c;会遇到数码管闪烁、残影甚至完全无法显示的棘手问题。本文将深入分…...

79万条中文医疗对话数据集:构建智能医疗AI的技术基石

79万条中文医疗对话数据集&#xff1a;构建智能医疗AI的技术基石 【免费下载链接】Chinese-medical-dialogue-data Chinese medical dialogue data 中文医疗对话数据集 项目地址: https://gitcode.com/gh_mirrors/ch/Chinese-medical-dialogue-data 在医疗人工智能快速发…...

TMSpeech:如何在Windows上实现完全离线的实时语音转文字

TMSpeech&#xff1a;如何在Windows上实现完全离线的实时语音转文字 【免费下载链接】TMSpeech 腾讯会议摸鱼工具 项目地址: https://gitcode.com/gh_mirrors/tm/TMSpeech 你是否曾因会议记录手忙脚乱&#xff0c;或者在线课程笔记跟不上老师的语速&#xff1f;传统的语…...

从‘看不懂’到‘真香’:用Pandas和Django实战案例,重新理解Python lambda

从‘看不懂’到‘真香’&#xff1a;用Pandas和Django实战案例&#xff0c;重新理解Python lambda 第一次接触Python的lambda表达式时&#xff0c;很多人都会皱起眉头——这种没有名字的函数&#xff0c;看起来像是为了炫技而存在的语法糖。直到我在处理一个紧急的Pandas数据清…...