|
前些日子买了两个拆机镜头,顺便研究了一下上面是两个步进电机,两相四线步进。本着能正常调焦用的原则随便画了个小板,两路步进电机驱动可分别控制每一路正反转,实际使用效果还可以,这里看到有需要的坛友也用到所以拿出来共享一下。
/* 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
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|