数码之家

 找回密码
 立即注册
搜索
查看: 1542|回复: 12

拆机镜头步进电机驱动方法

[复制链接]
发表于 2024-1-27 08:38:01 | 显示全部楼层 |阅读模式

爱科技、爱创意、爱折腾、爱极致,我们都是技术控

您需要 登录 才可以下载或查看,没有账号?立即注册

x
前些日子买了两个拆机镜头,顺便研究了一下上面是两个步进电机,两相四线步进。本着能正常调焦用的原则随便画了个小板,两路步进电机驱动可分别控制每一路正反转,实际使用效果还可以,这里看到有需要的坛友也用到所以拿出来共享一下。

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "delay.h"
#include "led.h"

typedef unsigned char     u8;
typedef unsigned int      u16;
typedef unsigned long int u32;

ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef    NVIC_InitStructure;
u32 T=15;

#define AA1_F GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2) //模式设置
#define AA1_B GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_6) //模式设置
#define BA2_F GPIO_ReadInputDataBit(GPIOD,GPIO_Pin_4) //模式设置
#define BA2_B GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_4) //模式设置
#define AA1_H  GPIO_SetBits(GPIOD,GPIO_Pin_3)
#define AA1_L  GPIO_ResetBits(GPIOD,GPIO_Pin_3)
#define AB1_H  GPIO_SetBits(GPIOD,GPIO_Pin_2)
#define AB1_L  GPIO_ResetBits(GPIOD,GPIO_Pin_2)

#define AA2_H  GPIO_SetBits(GPIOD,GPIO_Pin_1)
#define AA2_L  GPIO_ResetBits(GPIOD,GPIO_Pin_1)
#define AB2_H  GPIO_SetBits(GPIOC,GPIO_Pin_7)
#define AB2_L  GPIO_ResetBits(GPIOC,GPIO_Pin_7)

#define BA1_H  GPIO_SetBits(GPIOC,GPIO_Pin_6)
#define BA1_L  GPIO_ResetBits(GPIOC,GPIO_Pin_6)
#define BB1_H  GPIO_SetBits(GPIOC,GPIO_Pin_5)
#define BB1_L  GPIO_ResetBits(GPIOC,GPIO_Pin_5)

#define BA2_H  GPIO_SetBits(GPIOC,GPIO_Pin_4)
#define BA2_L  GPIO_ResetBits(GPIOC,GPIO_Pin_4)
#define BB2_H  GPIO_SetBits(GPIOC,GPIO_Pin_3)
#define BB2_L  GPIO_ResetBits(GPIOC,GPIO_Pin_3)
void delayus(uint32_t i)
{
  i*=5;//1US
  while(i--);
}



void delayms(uint32_t i)
{
  delayus(740*i);                        //740
}

static void ledGpioInit(void)
{
        GPIO_InitTypeDef m_gpio;
        
        RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);//使能GPIOA口的时钟
        
        m_gpio.GPIO_Mode = GPIO_Mode_OUT;
        m_gpio.GPIO_OType = GPIO_OType_PP;
        m_gpio.GPIO_Pin = GPIO_Pin_3;
        m_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
        m_gpio.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_Init(GPIOA, &m_gpio);//PA3--LED
}
void A1_djzhengzhuan(void)
{
        AA1_H;AB1_L;AA2_L;AB2_L;//1000
        delay_ms(T);
        AA1_H;AB1_L;AA2_H;AB2_L;//1010
        delay_ms(T);
        AA1_L;AB1_L;AA2_H;AB2_L;//0010
        delay_ms(T);
        AA1_L;AB1_H;AA2_H;AB2_L;//0110
        delay_ms(T);
        AA1_L;AB1_H;AA2_L;AB2_L;//0100
        delay_ms(T);
        AA1_L;AB1_H;AA2_L;AB2_H;//0101
        delay_ms(T);
        AA1_L;AB1_L;AA2_L;AB2_H;//0001
        delay_ms(T);
        AA1_H;AB1_L;AA2_L;AB2_H;//1001
        delay_ms(T);

}
void A1_djfanzhuan(void)
{
        AA1_H;AB1_L;AA2_L;AB2_L;//1000///1000
        delay_ms(T);
        AA1_H;AB1_L;AA2_L;AB2_H;//1010///1001
        delay_ms(T);
        AA1_L;AB1_L;AA2_L;AB2_H;//0010///0001
        delay_ms(T);
        AA1_L;AB1_H;AA2_L;AB2_H;//0110///0101
        delay_ms(T);
        AA1_L;AB1_H;AA2_L;AB2_L;//0100///0100
        delay_ms(T);
        AA1_L;AB1_H;AA2_H;AB2_L;//0101///0110
        delay_ms(T);
        AA1_L;AB1_L;AA2_H;AB2_L;//0001///0010
        delay_ms(T);
        AA1_H;AB1_L;AA2_H;AB2_L;//1001///1010
        delay_ms(T);

}
void A2_djzhengzhuan(void)
{
        BA1_H;BB1_L;BA2_L;BB2_L;//1000
        delay_ms(T);
        BA1_H;BB1_L;BA2_H;BB2_L;//1010
        delay_ms(T);
        BA1_L;BB1_L;BA2_H;BB2_L;//0010
        delay_ms(T);
        BA1_L;BB1_H;BA2_H;BB2_L;//0110
        delay_ms(T);
        BA1_L;BB1_H;BA2_L;BB2_L;//0100
        delay_ms(T);
        BA1_L;BB1_H;BA2_L;BB2_H;//0101
        delay_ms(T);
        BA1_L;BB1_L;BA2_L;BB2_H;//0001
        delay_ms(T);
        BA1_H;BB1_L;BA2_L;BB2_H;//1001
        delay_ms(T);

}
void A2_djfanzhuan(void)
{
        BA1_H;BB1_L;BA2_L;BB2_L;//1000///1000
        delay_ms(T);
        BA1_H;BB1_L;BA2_L;BB2_H;//1010///1001
        delay_ms(T);
        BA1_L;BB1_L;BA2_L;BB2_H;//0010///0001
        delay_ms(T);
        BA1_L;BB1_H;BA2_L;BB2_H;//0110///0101
        delay_ms(T);
        BA1_L;BB1_H;BA2_L;BB2_L;//0100///0100
        delay_ms(T);
        BA1_L;BB1_H;BA2_H;BB2_L;//0101///0110
        delay_ms(T);
        BA1_L;BB1_L;BA2_H;BB2_L;//0001///0010
        delay_ms(T);
        BA1_H;BB1_L;BA2_H;BB2_L;//1001///1010
        delay_ms(T);

}
void stop_dj(void)
{
        AA1_L;AB1_L;AA2_L;AB2_L;//1000///1000
        BA1_L;BB1_L;BA2_L;BB2_L;//1000
        delay_ms(10);
}



void PIO_Init(void)
{
        GPIO_InitTypeDef m_gpio;

        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOB, ENABLE );  //使能GPIOB口的时钟
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOC, ENABLE );  //使能GPIOC口的时钟
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOD, ENABLE );  //使能GPIOD口的时钟
        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOA, ENABLE );  //使能GPIOB口的时钟
         RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);
        
        m_gpio.GPIO_Mode = GPIO_Mode_OUT;
        m_gpio.GPIO_OType = GPIO_OType_PP;
        m_gpio.GPIO_Pin = GPIO_Pin_3|GPIO_Pin_1|GPIO_Pin_2;
        m_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
        m_gpio.GPIO_Speed = GPIO_Speed_Level_2;
        //m_gpio.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_3;  //初始化的引脚为  2,4,5
        m_gpio.GPIO_Schmit = GPIO_Schmit_Enable; //施密特输入输出开启
        GPIO_Init(GPIOD, &m_gpio);        //PD1-3
        
        m_gpio.GPIO_Mode = GPIO_Mode_OUT;
        m_gpio.GPIO_OType = GPIO_OType_PP;
        m_gpio.GPIO_Pin = GPIO_Pin_7|GPIO_Pin_6|GPIO_Pin_5|GPIO_Pin_4|GPIO_Pin_3;
        m_gpio.GPIO_PuPd = GPIO_PuPd_NOPULL;
        m_gpio.GPIO_Speed = GPIO_Speed_Level_2;
        //m_gpio.GPIO_Pin = GPIO_Pin_2|GPIO_Pin_1|GPIO_Pin_3;  //初始化的引脚为  2,4,5
        m_gpio.GPIO_Schmit = GPIO_Schmit_Enable; //施密特输入输出开启
        GPIO_Init(GPIOC, &m_gpio);        //PC7-3
        
        
        
               
        m_gpio.GPIO_Mode = GPIO_Mode_IN;//INPUT
        //m_gpio.GPIO_OType = GPIO_OType_PP;
        m_gpio.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_6;//初始化的引脚为  4,6
        m_gpio.GPIO_PuPd = GPIO_PuPd_UP;
        m_gpio.GPIO_Speed = GPIO_Speed_Level_2;
        m_gpio.GPIO_Schmit = GPIO_Schmit_Enable; //施密特输入输出开启
        GPIO_Init(GPIOD, &m_gpio);        //PD4 PD6
        
        m_gpio.GPIO_Mode = GPIO_Mode_IN;//INPUT
        //m_gpio.GPIO_OType = GPIO_OType_PP;
        m_gpio.GPIO_Pin = GPIO_Pin_2;//初始化的引脚为  2
        m_gpio.GPIO_PuPd = GPIO_PuPd_UP ;
        m_gpio.GPIO_Speed = GPIO_Speed_Level_2;
        m_gpio.GPIO_Schmit = GPIO_Schmit_Enable; //施密特输入输出开启
        GPIO_Init(GPIOA, &m_gpio);        //PA2
        
        m_gpio.GPIO_Mode = GPIO_Mode_IN;//INPUT
        //m_gpio.GPIO_OType = GPIO_OType_PP;
        m_gpio.GPIO_Pin = GPIO_Pin_4;//初始化的引脚为  2
        m_gpio.GPIO_PuPd = GPIO_PuPd_UP;
        m_gpio.GPIO_Speed = GPIO_Speed_Level_2;
        m_gpio.GPIO_Schmit = GPIO_Schmit_Enable; //施密特输入输出开启
        GPIO_Init(GPIOB, &m_gpio);        //PB4
        //GPIO_PinAFConfig(GPIOC,GPIO_PinSource4,GPIO_AF_7);
        
}






int main(void)
{
        
    delay_init();
        PIO_Init();
    ledGpioInit();
     TIM2_Init();
        
        delay_ms(50);
        
    while (1)
    {
                if(AA1_F==0)
                {        
                        delay_ms(50);
                                if(AA1_F==0)
                                {
                                        A1_djzhengzhuan();
                                
                                        }
               
                }
                if(AA1_B==0)
                {        
                        delay_ms(50);
                                if(AA1_B==0)
                                {
                                        A1_djfanzhuan();
                                
                                        }
               
                }
                /*******************************/
                        if(BA2_F==0)
                {        
                        delay_ms(50);
                                if(BA2_F==0)
                                {
                                        A2_djzhengzhuan();
                                
                                        }
               
                }
                if(BA2_B==0)
                {        
                        delay_ms(50);
                                if(BA2_B==0)
                                {
                                        A2_djfanzhuan();
                                
                                        }
               
                }
        
        else{stop_dj();}
        
        
        
        
        
        
        }               
               
               
               
}





资料:PCB文件,单片机工程文件


资料放网盘链接:链接:https://pan.baidu.com/s/1d6fsyGVH-Oaz4AeTV_73Jg
提取码:1234

原理图

原理图

PCB

PCB

步进电机结构

步进电机结构

驱动芯片

驱动芯片

驱动芯片

驱动芯片
360截图20240125161812078.jpg
360截图20240125161858471.jpg

打赏

参与人数 1家元 +120 收起 理由
家睦 + 120

查看全部打赏

发表于 2024-1-27 11:21:19 | 显示全部楼层
厉害了,手动聚焦吧?
回复 支持 反对

使用道具 举报

发表于 2024-1-27 14:52:10 | 显示全部楼层
镜头链接分享一下啊
回复 支持 反对

使用道具 举报

发表于 2024-1-27 18:52:23 | 显示全部楼层
我也有一个这镜头,用来干啥好呢? 我的好像是两个直流电机
回复 支持 反对

使用道具 举报

发表于 2024-1-28 08:26:46 | 显示全部楼层
先保存,说不定哪天就能用上。谢谢
回复 支持 反对

使用道具 举报

发表于 2024-1-29 11:18:59 | 显示全部楼层
好资料,收下备用!
回复 支持 反对

使用道具 举报

发表于 2024-1-30 19:15:51 | 显示全部楼层
如果是步进电机,可以搜索下写字机的驱动模块,很便宜。
回复 支持 反对

使用道具 举报

发表于 2024-2-1 08:46:48 来自手机浏览器 | 显示全部楼层
牛收藏备用
回复 支持 反对

使用道具 举报

发表于 2024-2-2 19:34:11 | 显示全部楼层
也买了2个这样的镜头,准备做个电子显微镜,正好需要这个资料。
回复 支持 反对

使用道具 举报

发表于 2024-2-4 08:49:21 | 显示全部楼层
类似的镜头,快门电机有两组线圈,一组给电压直接能打开,另一组供电有声音但没动作,啥作用?两组都用上能用电压控制光圈么?
买了现成的8825模块和H桥模块,
自动调焦准备研究下,
回复 支持 反对

使用道具 举报

发表于 2024-2-16 10:31:27 | 显示全部楼层
有意思,mark一下
回复 支持 反对

使用道具 举报

发表于 2024-2-17 16:50:40 | 显示全部楼层
牛人资料,收下备用!
回复 支持 反对

使用道具 举报

发表于 2024-2-17 17:10:27 | 显示全部楼层
高手在民间啊,小黄鱼上的高倍率旧数码相机要涨价了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

APP|手机版|小黑屋|关于我们|联系我们|法律条款|技术知识分享平台

闽公网安备35020502000485号

闽ICP备2021002735号-2

GMT+8, 2024-4-27 15:15 , Processed in 0.140400 second(s), 15 queries , Redis On.

Powered by Discuz!

© 2006-2023 smzj.net

快速回复 返回顶部 返回列表