STM32103驱动28BYJ48步进电机
2016-06-23 11:14
197 查看
电路接法
步进电机需要的驱动电流很大,因此直接使用单片机往往管脚电流不够,加上一般3.3V的单片机也无法驱动5V的步进电机,因此需要电路转换。
常用的ULN2003芯片驱动步进电机。ULN2003就是起到了电流放大作用,也使得驱动电压变成了5V。除了用ULN2003也可以自己用三极管搭建电路,原理与ULN2003内部结构类似。
了解相序
也就是步进电机要运转时,如何给脉冲,让电机连续运动。
ps:如果给错脉冲可能左转几下又转回来。下图就是小编电机的相序。
软件的实现 使用STM32F103控制电机
下面是正转翻转的编码 根据技术要求。如图用的单双八拍。
unsigned char F_Rotation[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09} ; //FAN
unsigned char B_Rotation[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08} ; //ZHENG
此函数两个参数,第一个参数是圈数。第二个参数是方向也就是选择正转和翻转
void motorNCircle(int n,bool position)
{
int i=0;
int j=0;
int k=0;
for(j=0;j<n;j++)
{
for(i=0;i<64*8;i++)
{
for(k=0;k<8;k++)
{
if(TRUE == position)
SetMotor(F_Rotation[k]);
else
SetMotor(B_Rotation[k]);
Delay(20000);
}
}
}
}
下面就是SetMotor函数,根据传的数据不同,控制的4个IO pin输出不同。
void SetMotor(unsigned char InputData)
{
if(InputData & 0x08)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_6 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
}
if(InputData & 0x04)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_7 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
}
if(InputData & 0x02)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_8 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_8);
}
if(InputData & 0x01)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_9 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
}
如何计算
以28BYJ-48为例,根据技术资料,步距的角度为5.625-64 而且带有减速齿轮是1:64 因此转64乘64个脉冲才是1圈。 因此一个脉冲转过5.625除64=0.08789度。
所以有了下面的循环。
for(j=0;j<n;j++)
{
for(i=0;i<64*8;i++) //64*8
{
for(k=0;k<8;k++) //4相单双8拍
{
if(TRUE == position)
SetMotor(F_Rotation[k]);
else
SetMotor(B_Rotation[k]);
Delay(20000); //注意这个延时自己去调节。
}
}
步进电机需要的驱动电流很大,因此直接使用单片机往往管脚电流不够,加上一般3.3V的单片机也无法驱动5V的步进电机,因此需要电路转换。
常用的ULN2003芯片驱动步进电机。ULN2003就是起到了电流放大作用,也使得驱动电压变成了5V。除了用ULN2003也可以自己用三极管搭建电路,原理与ULN2003内部结构类似。
了解相序
也就是步进电机要运转时,如何给脉冲,让电机连续运动。
ps:如果给错脉冲可能左转几下又转回来。下图就是小编电机的相序。
软件的实现 使用STM32F103控制电机
下面是正转翻转的编码 根据技术要求。如图用的单双八拍。
unsigned char F_Rotation[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09} ; //FAN
unsigned char B_Rotation[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08} ; //ZHENG
此函数两个参数,第一个参数是圈数。第二个参数是方向也就是选择正转和翻转
void motorNCircle(int n,bool position)
{
int i=0;
int j=0;
int k=0;
for(j=0;j<n;j++)
{
for(i=0;i<64*8;i++)
{
for(k=0;k<8;k++)
{
if(TRUE == position)
SetMotor(F_Rotation[k]);
else
SetMotor(B_Rotation[k]);
Delay(20000);
}
}
}
}
下面就是SetMotor函数,根据传的数据不同,控制的4个IO pin输出不同。
void SetMotor(unsigned char InputData)
{
if(InputData & 0x08)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_6 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_6);
}
if(InputData & 0x04)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_7 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_7);
}
if(InputData & 0x02)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_8 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_8);
}
if(InputData & 0x01)
{
GPIO_ResetBits(GPIOC, GPIO_Pin_9 );
}
else
{
GPIO_SetBits(GPIOC, GPIO_Pin_9);
}
}
如何计算
以28BYJ-48为例,根据技术资料,步距的角度为5.625-64 而且带有减速齿轮是1:64 因此转64乘64个脉冲才是1圈。 因此一个脉冲转过5.625除64=0.08789度。
所以有了下面的循环。
for(j=0;j<n;j++)
{
for(i=0;i<64*8;i++) //64*8
{
for(k=0;k<8;k++) //4相单双8拍
{
if(TRUE == position)
SetMotor(F_Rotation[k]);
else
SetMotor(B_Rotation[k]);
Delay(20000); //注意这个延时自己去调节。
}
}
相关文章推荐
- 57步进电机了解与实践笔记
- 步进电机原理简介
- 步进电机正反转
- 51单片机控制电动机正反转和调速
- 步进电机的加减速控制
- 利用树莓派控制步进电机——Python语言
- 利用树莓派控制步进电机——C语言
- 51--步进电机驱动代码
- 步进电机细分驱动
- Verilog HDL语言的四相八拍步进电机驱动
- STM32+ULN2003驱动步进电机
- 【STM32 .Net MF开发板学习-11】步进电机控制(非PWM模式) 推荐
- 适用的28BYJ-48步进电机掌握程序
- 28BYJ-48步进电机掌握程序根底
- 28BYJ-48步进电机迁移转变精度与深化剖析
- 让28BYJ-48步进电机转起来
- 28BYJ-48步进电机道理
- 电机的分类
- 步进电机相关问题
- 步进电机驱动方式(细分)概述