当前位置: 首页 > 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;是不是日志打越…...

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …...

shell脚本--常见案例

1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件&#xff1a; 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

《Playwright:微软的自动化测试工具详解》

Playwright 简介:声明内容来自网络&#xff0c;将内容拼接整理出来的文档 Playwright 是微软开发的自动化测试工具&#xff0c;支持 Chrome、Firefox、Safari 等主流浏览器&#xff0c;提供多语言 API&#xff08;Python、JavaScript、Java、.NET&#xff09;。它的特点包括&a…...

聊聊 Pulsar:Producer 源码解析

一、前言 Apache Pulsar 是一个企业级的开源分布式消息传递平台&#xff0c;以其高性能、可扩展性和存储计算分离架构在消息队列和流处理领域独树一帜。在 Pulsar 的核心架构中&#xff0c;Producer&#xff08;生产者&#xff09; 是连接客户端应用与消息队列的第一步。生产者…...

什么是EULA和DPA

文章目录 EULA&#xff08;End User License Agreement&#xff09;DPA&#xff08;Data Protection Agreement&#xff09;一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA&#xff08;End User License Agreement&#xff09; 定义&#xff1a; EULA即…...

Spring数据访问模块设计

前面我们已经完成了IoC和web模块的设计&#xff0c;聪明的码友立马就知道了&#xff0c;该到数据访问模块了&#xff0c;要不就这俩玩个6啊&#xff0c;查库势在必行&#xff0c;至此&#xff0c;它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据&#xff08;数据库、No…...

【Go语言基础【12】】指针:声明、取地址、解引用

文章目录 零、概述&#xff1a;指针 vs. 引用&#xff08;类比其他语言&#xff09;一、指针基础概念二、指针声明与初始化三、指针操作符1. &&#xff1a;取地址&#xff08;拿到内存地址&#xff09;2. *&#xff1a;解引用&#xff08;拿到值&#xff09; 四、空指针&am…...

MySQL JOIN 表过多的优化思路

当 MySQL 查询涉及大量表 JOIN 时&#xff0c;性能会显著下降。以下是优化思路和简易实现方法&#xff1a; 一、核心优化思路 减少 JOIN 数量 数据冗余&#xff1a;添加必要的冗余字段&#xff08;如订单表直接存储用户名&#xff09;合并表&#xff1a;将频繁关联的小表合并成…...

快刀集(1): 一刀斩断视频片头广告

一刀流&#xff1a;用一个简单脚本&#xff0c;秒杀视频片头广告&#xff0c;还你清爽观影体验。 1. 引子 作为一个爱生活、爱学习、爱收藏高清资源的老码农&#xff0c;平时写代码之余看看电影、补补片&#xff0c;是再正常不过的事。 电影嘛&#xff0c;要沉浸&#xff0c;…...

比较数据迁移后MySQL数据库和OceanBase数据仓库中的表

设计一个MySQL数据库和OceanBase数据仓库的表数据比较的详细程序流程,两张表是相同的结构,都有整型主键id字段,需要每次从数据库分批取得2000条数据,用于比较,比较操作的同时可以再取2000条数据,等上一次比较完成之后,开始比较,直到比较完所有的数据。比较操作需要比较…...