其实用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);
}
}
设计资源 培训 开发板 精华推荐
- OM5577: 面向PN7120即插即用NFC控制器的开发套件
- STK551U362CGEVB,基于STK551U362C-E 10A运动电机控制的评估板
- DC2150A-C,用于 28V、5A MIL-STD-1275D 浪涌抑制器的演示板 [采用 LTC4366HTS8-2 和 LT4363HS-2]
- LT8494IUF 450kHz、5V 输出 SEPIC 转换器的典型应用电路
- LTC1450L 并行输入、12 位轨至轨微功率 DAC 的典型应用
- [已成功] 基于nfc的PCB名片
- 使用 LTC3637HMSE 4V 至 76V 输入至 15V 输出钳位、1A 高效浪涌抑制器的典型应用
- AM2G-2412DH30Z ±12V 2 瓦 DC/DC 转换器的典型应用
- 人体感应 触碰跳回桌面
- LTC3615HFE-1 单路低纹波 6A 输出同步降压型 DC/DC 转换器的典型应用
- 答题赢好礼:ADI MEMS工业监测助力机器大健康发展
- 【双节献礼】LM3S9B96开发套件等你来拿!!!
- 瑞萨电子RL78/G14 demo板低价开团 19.9元包邮
- 爱“拼”才会赢 英飞凌栅极驱动IC拼图闯关 活动开始啦!
- 可靠QTouch技术集成邻键抑制(AKS)功能,适用任何触摸应用领域
- 【ST板卡来了(下)】 品读STM32实战经验,汲取FAE经验闯关去抽奖
- 是德科技——从容应对医疗电子设备设计和测试的挑战! 答题有好礼
- 下载赢礼 | 雅特生 PMBus 接口非隔离数字 DC-DC 转换器
- 观看TI IOT解决方案研讨会 答题即可赢取更多精美好礼!
- 答题有礼|一起学习 Mentor PCB 手册