【STM32】可变焦、聚焦摄像头驱动电路与驱动程序——两相四线步进电机驱动
文章目录
- 总体介绍
- 1.步进电机简介
- 1)什么是步进电机
- 2)为何需要驱动电路
- 3)步进电机的几个概念
- 2.变焦摄像头参数与结构介绍
- 1)本款变焦摄像头结构
- 2)其节拍表
- 3)其对应线序表
- 4)镜头实物图
- 3.基础硬件测试驱动
- 1)整体原理图
- 2)PCB电路
- 3)3D_PCB
- 4.STM32控制驱动程序设计
- 1)端口定义与函数声明
- 2)步进电机驱动函数
- 3)按键简单调用转动步进电机【正反转】
- 5.效果展示
- 1)调试图连接图
注: 本文仅用于学习交流分享,[若有不妥之处,请指正,感谢]
关键词:【两相四线步进电机】【可变焦、聚焦摄像头】
最后面有 程序 与 测试原理图PCB 分享
用到的工具有:
- Keil 5 编译器
- Altium Designer
实现的小功能有:
①可驱动ZOOM步进电机实现 变焦
②可驱动FOCUS步进电机实现 聚焦
总体介绍
1.步进电机简介
2.基础硬件驱动设计
3.单片机控制程序设计
4.效果展示
1.步进电机简介
1)什么是步进电机
- 步进电机是将电脉冲信号转变为角位移或线位移的开环控制电机。
- 脉冲数越多,电机转动的角度越大。
脉冲的频率越高,电机转速越快,但不能超过最高频率,否则电机的力矩迅速减小,电机不转。
2)为何需要驱动电路
- 单片机的IO口是数字口,本身的驱动能力非常小(一般为10-25mA左右),所以需要电机驱动芯片来驱动电机。驱动芯片的作用就是把单片机的小电流的控制信号转成逻辑上相同的大电流的驱动源。这就是所谓的弱电控制强电。
3)步进电机的几个概念
- 电机转动一圈的脉冲数=(步进电机)一圈的脉冲数 =细分数x每转脉冲数x减速比
①细分数:步进电机的细分技术实质上是一种电子阻尼技术,其主要目的是减弱或消除步进电机的低频振动,提高电机的运转精度只是细分技术的一个附带功能。比如对于步进角为1.8°的两相混合式步进电机,如果细分驱动器的细分数设置为4,那么电机的运转分辨率为每个脉冲0.45°,电机的精度能否达到或接近0.45°,还取决于细分驱动器的细分电流控制精度等其它因素。不同厂家的细分驱动器精度可能差别很大;细分数越大精度越难控制。
②步距角:也就是每转脉冲数。
③减数比:即减速装置的传动比,是传动比的一种,是指减速机构中瞬时输入速度与输出速度的比值,用符号“i”表示减速比的意思:比如减速比1/64,:如果步进电机输出1N.m的转矩的话,通过减速箱转换后的输出力矩64N.m,当然转速降低为原转速的1/64
2.变焦摄像头参数与结构介绍
1)本款变焦摄像头结构
该款实验的变焦摄像头为“创威视讯”的 电动变焦镜头 变焦范围为:2.8-12mm
其镜头有两个 两相四线步进电机 :
一个为 FOCUS MOTOR:为控制聚焦
一个为 ZOOM MOTOR:为控制变焦- 变焦镜头内部结构
- 两相步进电机内部结构
- 变焦镜头内部结构
2)其节拍表
3)其对应线序表
4)镜头实物图
图1 镜头 | 图2 镜头 | 图3 镜头 |
3.基础硬件测试驱动
电路硬件:
[MCU] STM32F103RCT6系统板[Mini stm32]
[稳压电源]【AMS1117-3.3】5.0V稳压3.3V
[驱动电路] L293D驱动电路
1)整体原理图
2)PCB电路
3)3D_PCB
4.STM32控制驱动程序设计
1)端口定义与函数声明
motor.h:
#ifndef __MOTOR_H
#define __MOTOR_H
#include "sys.h" typedef enum {FALSE = 0, TRUE = !FALSE} bool;#define ZOOM_MOTOR 0 //定义变焦步进电机ID
#define FOCUS_MOTOR 1/*定义 变焦摄像头 引脚信息*/
#define ZOOM_STEP_PORT GPIOB //步进电机的控制端口为A端口
#define ZOOM_A1 GPIO_Pin_8 //PA8对应步进电机的A相 ZOOM A+
#define ZOOM_A0 GPIO_Pin_9 //PA9对应步进电机的B相 ZOOM A-
#define ZOOM_B1 GPIO_Pin_10 //PA10对应步进电机的C相 ZOOM B+
#define ZOOM_B0 GPIO_Pin_11 //PA11对应步进电机的D相 ZOOM B-/*定义 聚焦摄像头 引脚信息*/
#define FOCUS_STEP_PORT GPIOB //步进电机的控制端口为A端口
#define FOCUS_A1 GPIO_Pin_12 // FOCUS A+
#define FOCUS_A0 GPIO_Pin_13 // FOCUS A-
#define FOCUS_B1 GPIO_Pin_14 // FOCUS B+
#define FOCUS_B0 GPIO_Pin_15 // FOCUS B-void STEP_Init(void); //步进电机引脚初始化void SetMotor(unsigned char Motor_ID,unsigned char InputData); //根据传送的数据Inputdata设置脉冲引脚输出void MotorNCircle(unsigned char Motor_ID,int n,bool position); //n为步进电机转动的圈数,position为正转或者反转void MotorNAngle(unsigned char Motor_ID,int n,bool position); //n为步进电机转动的角度为n*120,position为正转或者反转
#endif
2)步进电机驱动函数
#include "motor.h"
#include "delay.h"//unsigned char F_Rotation[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09} ; //单双8拍反转表 五线四相步进电机表
//unsigned char B_Rotation[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08} ; //单双8拍正转表unsigned char F_Rotation[4]={0x09,0x0A,0x06,0x05} ; //4拍正转表 Forward
unsigned char R_Rotation[4]={0x05,0x06,0x0A,0x09} ; //4拍反转表 Reverse/******************************************************************************
* Name: STEP_Init
*
* Desc: 初始化两个两相四线步进电机引脚
* Param: 无
* Return: 无
* Note: 本函数为 变焦、聚焦控制的步进电机引脚初始化
* Author: Dwfish
* -------------------------------------
* Log: 2018/12/27, Create this function by Dwfish******************************************************************************/
void STEP_Init()
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能PA,PD端口时钟GPIO_InitStructure.GPIO_Pin = ZOOM_A1|ZOOM_A0|ZOOM_B1|\ZOOM_B0|FOCUS_A1|FOCUS_A0|FOCUS_B1|FOCUS_B0; //初始化两个两相四线步进电机引脚GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHzGPIO_Init(GPIOB, &GPIO_InitStructure); //根据设定参数初始化GPIOBGPIO_ResetBits(GPIOB,GPIO_Pin_8); //输出低GPIO_ResetBits(GPIOB,GPIO_Pin_9); GPIO_ResetBits(GPIOB,GPIO_Pin_10); GPIO_ResetBits(GPIOB,GPIO_Pin_11);GPIO_ResetBits(GPIOB,GPIO_Pin_12); GPIO_ResetBits(GPIOB,GPIO_Pin_13); GPIO_ResetBits(GPIOB,GPIO_Pin_14); GPIO_ResetBits(GPIOB,GPIO_Pin_15);
}/******************************************************************************
* Name: SetMotor
*
* Desc: 使步进电机转动
* Param: 电机编号:Motor_ID[0为变焦、1为聚焦] 传入:InputData选择相位使能
* Return: 无
* Note: 根据自己定义的节拍表输出相应脉冲
* Author: Dwfish
* -------------------------------------
* Log: 2018/12/27, Create this function by Dwfish******************************************************************************/
void SetMotor(unsigned char Motor_ID,unsigned char InputData) //根据传送的数据Inputdata设置PB12-PB15引脚输出
{if(InputData & 0x08){switch(Motor_ID){case ZOOM_MOTOR : GPIO_SetBits(ZOOM_STEP_PORT, ZOOM_A1 ); break;case FOCUS_MOTOR : GPIO_SetBits(FOCUS_STEP_PORT, FOCUS_A1 );break;} }else {switch(Motor_ID){case ZOOM_MOTOR : GPIO_ResetBits(ZOOM_STEP_PORT, ZOOM_A1 ); break;case FOCUS_MOTOR : GPIO_ResetBits(FOCUS_STEP_PORT, FOCUS_A1 );break;} }if(InputData & 0x04){switch(Motor_ID){case ZOOM_MOTOR : GPIO_SetBits(ZOOM_STEP_PORT, ZOOM_A0 ); break;case FOCUS_MOTOR : GPIO_SetBits(FOCUS_STEP_PORT, FOCUS_A0 );break;} }else{switch(Motor_ID){case ZOOM_MOTOR : GPIO_ResetBits(ZOOM_STEP_PORT, ZOOM_A0 ); break;case FOCUS_MOTOR : GPIO_ResetBits(FOCUS_STEP_PORT, FOCUS_A0 );break;} }if(InputData & 0x02){switch(Motor_ID){case ZOOM_MOTOR : GPIO_SetBits(ZOOM_STEP_PORT, ZOOM_B1 ); break;case FOCUS_MOTOR : GPIO_SetBits(FOCUS_STEP_PORT, FOCUS_B1 );break;} }else{switch(Motor_ID){case ZOOM_MOTOR : GPIO_ResetBits(ZOOM_STEP_PORT, ZOOM_B1 ); break;case FOCUS_MOTOR : GPIO_ResetBits(FOCUS_STEP_PORT, FOCUS_B1 );break;} }if(InputData & 0x01){switch(Motor_ID){case ZOOM_MOTOR : GPIO_SetBits(ZOOM_STEP_PORT, ZOOM_B0 ); break;case FOCUS_MOTOR : GPIO_SetBits(FOCUS_STEP_PORT, FOCUS_B0 );break;} }else{switch(Motor_ID){case ZOOM_MOTOR : GPIO_ResetBits(ZOOM_STEP_PORT, ZOOM_B0 ); break;case FOCUS_MOTOR : GPIO_ResetBits(FOCUS_STEP_PORT, FOCUS_B0 );break;} }
}/******************************************************************************
* Name: MotorNCircle
*
* Desc: 电机转动 N 圈
* Param: 电机编号:Motor_ID 转动n圈 正反:position【0正1反】
* Return: 无
* Note: 无
* Author: Dwfish
* -------------------------------------
* Log: 2018/12/27, Create this function by Dwfish******************************************************************************/
void MotorNCircle(unsigned char Motor_ID,int n,bool position)
{int i=0;int j=0;int k=0;for(j=0;j<n;j++){for(i=0;i<64*4;i++){for(k=0;k<4;k++){if(TRUE == position)SetMotor(Motor_ID,R_Rotation[k]); elseSetMotor(Motor_ID,F_Rotation[k]); delay_us(1000); }}}
}/******************************************************************************
* Name: MotorNAngle
*
* Desc: 电机转动 N °
* Param: 电机编号:Motor_ID 转动n° 正反:position【0正1反】
* Return: 无
* Note: 第二个for循环中i所对应的i<1中"1"参数,需要根据自己实际步进电机调整
* Author: Dwfish
* -------------------------------------
* Log: 2018/12/27, Create this function by Dwfish******************************************************************************/void MotorNAngle(unsigned char Motor_ID,int n,bool position) //n为步进电机转动的角度为n*120,position为正转或者反转
{int i=0;int j=0;int k=0;for(j=0;j<n;j++){for(i=0;i<1;i++) {for(k=0;k<4;k++) {if(TRUE == position)SetMotor(Motor_ID,R_Rotation[k]); elseSetMotor(Motor_ID,F_Rotation[k]); delay_us(1000); }}}
}
3)按键简单调用转动步进电机【正反转】
#include "include.h"
#include "my_font.h"
#include "motor.h"u8 key_value = 0;
u32 count = 0;int main(void)
{ NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);// 设置中断优先级分组2Perpheral_Init(); //外部初始化POINT_COLOR=RED;//设置字体为红色LCD_ShowString(20,30,200,24,24, "Count: ");POINT_COLOR=BLUE;TIM_Cmd(TIM1, ENABLE); //使能TIMx外设TIM_Cmd(TIM3, ENABLE); //使能TIMx外设STEP_Init();while (1){ key_value = KEY_Scan(1);if(key_value == 1){count++;LCD_ShowxNum(150,30,count,6,24,0);MotorNAngle(ZOOM_MOTOR,1,FALSE);//正转}else if(key_value == 2){count++;LCD_ShowxNum(90,30,count,3,24,0);MotorNAngle(ZOOM_MOTOR,1,TRUE);}else if(key_value == 3){count++;LCD_ShowxNum(90,100,count,3,24,0);MotorNAngle(FOCUS_MOTOR,1,FALSE); }}
}
5.效果展示
DESIGN
1)调试图连接图
图1 变焦前 | 图2 变焦后 |
变焦 前 拍摄:
变焦 后 拍摄:
附【Download】:
程序+测试硬件(原理图+PCB):
两相四线步进电机程序+原理图PCB(变焦摄像头)
Dwfish 淹死的鱼 2018.12.29
【STM32】可变焦、聚焦摄像头驱动电路与驱动程序——两相四线步进电机驱动相关推荐
- 两相四线步进电机的驱动方法/驱动芯片用法
目录 一.基本概念说明: 1.电机原理: 2.步进电机概念名词: 3.驱动芯片 4.调试总结: 概述 说明:本文主要说明一下使用驱动芯片驱动两相四线步进电机. 关联关键词:如何驱动步进电机/步进电机驱 ...
- STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数
STM32控制步进电机:基于HAL库定时器中断的闭环步进电机驱动+精准控制脉冲数 一.步进电机闭环驱动器 二.CubeMx配置 1.Clock Configuration 2.脉冲端 定时器配置 3. ...
- 【电机应用控制】——步进电机控制原理(四相五线/两相四线/细分驱动)驱动器梯形/S形加减速算法直线/圆弧插补
目录 一.步进电机简介 二.步进电机控制原理 1.四相五线 2.两相四线 3.细分驱动 三.步进电机驱动器 四.梯形加减速算法 五.S形加减速算法 六.直线插补 七.圆弧插补 八.步进电机闭环系统(位 ...
- 步进电机28BYJ-48的驱动(arduino,STM32平台),最全的驱动详细原理,驱动电路分析,驱动代码解释
步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细原理,驱动电路分析,驱动代码解释 目录 步进电机28BYJ-48的驱动(arduino平台,STM32),最全的驱动详细 ...
- Windows摄像头驱动研究(一)
Windows 驱动基础系列,转载请标明出处:http://blog.csdn.net/ikerpeng/article/details/38865317 摄像头驱动的主要目的是通过通过硬件捕捉视频信 ...
- 触发器及其应用实验报告总结_带你了解IGBT驱动电路的应用
IGBT驱动电路应用实例 IGBT的驱动电路必须具备两个功能:一是实现控制电路与被驱动IGBT栅极的电隔离:二是提供合适的栅极驱动脉冲.IGBT的驱动电路很多,分立元件搭成的驱动电路,简单.廉价:专用 ...
- 三电平igbt死区时间计算_一种T型三电平IGBT互补死区驱动电路的制作方法
本发明涉及光伏三电平逆变器技术领域,具体涉及一种T型三电平IGBT互补死区驱动电路. 背景技术: 目前,国家能源局等三部委推出光伏"领跑者"计划,旨在促进先进技术产品应用和产业升级 ...
- 镜头上的四线电机怎么驱动_MS3988/N双路步进电机驱动MS4982内置16细分单路步进电机驱动MS41908M摄像机用镜头聚焦、变倍、自动...
马达驱动直流马达 型号描述通道数供电电压输出电流封装 MS3122 两个独立全桥 2CH 1.8V - 12V 1A TSSOP16 MS3111D 单个独立全桥 1CH 1.8V - 6.0V 0. ...
- 镜头上的四线电机怎么驱动_2相四线,四相五线,四相六线步进电机接线及驱动方法...
按照常理来说,步进电机接线要根据线的颜色来区分接线.但是不同公司生产的步进电机,线的颜色不一样.特别是国外的步进电机.那么,步进电机接线应该用万用表打表. 步进电机内部构造如图: 通过上图可知,A,~ ...
- 趁舍友上个厕所的时间,掌握步进电机驱动方式和电路
步进电机的驱动方式 驱动方式 (1)MCU+开关管(元器件多,成本便宜,控制精度低,震动大,难以调试) (2)专用步进电机驱动芯片(电路结构简单.成本高.控制精度高.震动小.容易调试) 上面讲了基本两 ...
最新文章
- Ruby之Enumerator类
- centos5.6 (64bit)编译安装vsftpd-2.3.4的配置(两种用户登录)[连载之电子商务系统架构]...
- MySQL优化篇:IN VS EXISTS
- LeetCode 530二叉搜索树的最小绝对值差-简单
- Xuggler教程:转码和媒体修改
- 正能量之项目经理的自我修养
- 断点续传和下载原理分析
- Rockchip USB转485
- java unicode32_【JAVA SE基础篇】32.String类入门
- 去除dataframe中的空行_Word中这些一键操作实在太强了!折腾半天的工作,一秒就能搞定!...
- CIKM'21「eBay」推荐系统--利用超图对商品的多模态信息建模
- 黑苹果E3-1290 v2(ivy bridge架构)安装成功案例分享
- fms5序列号_火枫 FMS-105分体式炉头测评
- 做图工具pyecharts
- 排序算法二:二分(折半)插入排序
- EV:ePWM+eCAP
- 南邮80c51汇编语言编程实验,实验三 查表 多分支(80C51单片机汇编语言编程)
- 2.7 zio入门——更多的Effect构造函数
- 物联网应用系统三层结构的设计_基于物联网技术的智能油烟在线监测系统的设计与应用...
- 机器学习中的特异性和敏感性
热门文章
- 01互联网三高架构的演进之道
- 3dmax外挂神器更新了|3dmax外挂在过去几年里,食住玩都更新记录了3dmax外挂的什么功能?
- 利用ENVI深度学习进行遥感变化监测
- 算法设计与分析_《算法设计与分析》(2017年8月版)修订
- java oa开发_oa开发方案
- 如何通过搜索计算机共享打印机驱动程序,怎么解决连接共享打印机时“找不到驱动程序”...
- lock 指令前缀与mutex锁
- 网页录音之麦克风权限问题
- linux kill全部进程,linux进程管理及kill命令详解
- 给大家推荐几本最优秀的编程书