其实用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);
}
}
上一篇:STM32按键实验--连续闪烁的问题
下一篇:STM32通过IIC读写EEPROM(24C02)
推荐阅读最新更新时间:2026-03-25 11:42
- 用于 7VIN 至 16VIN、1.5V 和 1.2V 输出的 LTM4628EV DC/DC 模块稳压器的典型应用电路
- 使用 Analog Devices 的 LTC3728LIGN 的参考设计
- DER-406 - 适用于 A19 灯的 5.76 W 高 PF 非隔离降压-升压型 TRIAC 调光 LED 驱动器
- ADR5045B 5V 输出精密微功率并联模式电压基准的典型应用
- LT3970EDDB-3.42 2.5V 降压转换器的典型应用
- MC78M08BDTG 8V 电流调节器的典型应用
- LT1021DCN8-5 精密电压基准的典型应用
- DER-282 - 100W, 扁平(11 mm), LLC DC-DC转换器
- REF193 低压差开尔文连接电压基准的典型应用电路
- LT3088EM 线性稳压器用于添加软启动的典型应用

stm32驱动屏IC rm68042
电机驱动教程
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号