其实用STM32驱动步进电机和51单片机驱动步进电机是一样的,只是简单的改变一下输出的引脚而已。
对于步进电机的原理我也不是很明白,我就简单的说一下步进电机简单的分为单极性步进电机和双极性步进电机。
单极性步进电机驱动方式:
单四拍: A-B-C-D;
双四拍:AB-BC-CD-DA;
单双八拍:A-AB-B-BC-C-CD-D-DA
对于单双八拍的方式:每次转动角度为3.75°,对于双四拍每次转动的角度为7.5°
双极性步进电机驱动方式:
单四拍:A/-B-A-B/
双四拍:A/B-AB-AB/-A/B/
单双八拍:A/-A/B-B-AB-A-AB/-B/-A/B/
我使用的单极性步进电机,驱动方式为单双八拍,驱动芯片是ULN2003,代码如下:
#include "stm32f10x.h"
#include "sys.h"
#include "delay.h"
unsigned int K, rate;
unsigned char FFW[8]={0xf1,0xf3,0xf2,0xf6,0xf4,0xfc,0xf8,0xf9}; //正转
unsigned char FFZ[8]={0xf9,0xf8,0xfc,0xf4,0xf6,0xf2,0xf3,0xf1}; //反转
/*对于下面这一组数组是因为有的在单片机输出之后加了一个74LS14反相器,最后才输入驱动电路的*/
//unsigned char FFW[8]={0xfe,0xfc,0xfd,0xf9,0xfb,0xf3,0xf7,0xf6}; //正转
//unsigned char FFZ[8]={0xf6,0xf7,0xf3,0xfb,0xf9,0xfd,0xfc,0xfe}; //反转
/*延迟函数,用于调速*/
void delay()
{
unsigned int t;
t=rate;
while(t--)
{
delay_us(1000);
}
}
/*STM32I/O引脚初始化*/
void init_stepmotor_GPIO(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12;
GPIO_Init(GPIOB,&GPIO_InitStructure);
}
/**********************************************************************
* *
* 电机正转
* *
***********************************************************************/
void motor_cw(uint32_t circle)//circle??? delay????
{
uint32_t i,j;
for(i=0;i<=circle;i++)
{
for (j=0; j<8; j++) //这一个for循环完成,电机转动30°
{
GPIO_Write(GPIOB, (FFW[j]&0x1f)<<12);
delay_ms(1); //延迟1ms,用的STM32提供的库函数
}
delay_ms(1);
}
}
/**********************************************************************
* *
* 电机反转
* *
***********************************************************************/
void motor_ccw(uint32_t circle)
{
uint32_t i,j;
for(i=0;i<=circle;i++)
{
for (j=0; j<8; j++) //电机转动30°
{
GPIO_Write(GPIOB, (FFZ[j]&0x1f)<<12);
delay_ms(10); //?÷??×???
}
delay_ms(10);
}
}
/**********************************************************
* *
* 电机利用延迟函数,变速转动
***********************************************************/
void motor_ffw()
{
unsigned char i;
for (i=0; i<8; i++) //?????30?
{
GPIO_Write(GPIOB, (FFZ[i]&0x1f)<<12); //???
delay(); //????
}
}
main()
{
unsigned char x;
rate=0x2a;
x=0x40;
init_stepmotor_GPIO();
delay_init();
while(1)
{
motor_cw(100);
motor_ccw(100);
/*下面这段代码是电机变速转动的调用代码*/
// do
// {
// motor_ffw(); //??
// rate--;
// }while(rate!=0x03);
// do
// {
// motor_ffw(); //??
// x--;
// }while(x!=0x01);
//
// do
// {
// motor_ffw(); //??
// rate++;
// }while(rate!=0x2a);
}
}
阅读(3454) | 评论(0) | 转发(0) |