步进电机

来源:互联网 发布:云端软件 虚拟化 编辑:程序博客网 时间:2024/04/28 20:36

步进电机内部是几对线圈,要步进电机转动,满足两个条件

1. 给线圈的两头供电

2.按线圈排布,按顺序供电,就可以转动,可以转动。

原理,一通电,线圈有磁场,两磁场叠加,就转动。

标准序列:

1001  
0001  
0011  
0010  
0110  
0100  
1100  
1000

按这个序列,结合硬件,对应每个引脚。

正转,按正读序列。

反转,则反向读序列。

不转,则给线圈对应的引脚,都不供电。

步进电机内部图如下:

步进电机实物图:

这五根线,其中一根是电源线,剩下的四根线是电机驱动io。



在做项目的过程中,驱动步进电机,结果步进电机转动时候带动齿轮转动,声音特别大,因为我在转动的过程过中,在每拍之间,断了电几十us,会导致停止转动一会,所以会咔咔响。

时序图:


代码:

#define MOTO_GPIO_PORT  (GPIOC)#define MOTO_GPIO_PINS  (GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7)#define KEY_GPIO_PORT  (GPIOD)#define KEY_GPIO_PINS  (GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4)void Delay (uint16_t nCount);uint8_t MOTO_PHASE8[8] ={0x90,0x10,0x30,0x20,0x60,0x40,0xc0,0x80};//正转 电机导通相序 D-C-B-Aunsigned int  moto_last_step=0;unsigned int  key_last_get=0;void  moto_turnto(int degree);void main(void){  uint8_t key_data=0;  /* Initialize I/Os in Output Mode */  GPIO_Init(MOTO_GPIO_PORT, (GPIO_Pin_TypeDef)MOTO_GPIO_PINS, GPIO_MODE_OUT_PP_LOW_FAST);GPIO_Init(KEY_GPIO_PORT, (GPIO_Pin_TypeDef)KEY_GPIO_PINS, GPIO_MODE_IN_PU_NO_IT);  while (1)  {    key_data=(GPIO_ReadInputData(KEY_GPIO_PORT)&0x1e)>>1;key_data=(~key_data)&0x0f;    if (key_data==0x0) continue;if (key_last_get&0x8 && key_data&0x1){moto_turnto(-100);}  else if (key_last_get&0x1 && key_data&0x08){moto_turnto(100);}    else if (key_data>key_last_get)//(key_data&GPIO_PIN_4) && !(key_data&GPIO_PIN_5) ){   moto_turnto(-100);  }else if (key_data<key_last_get)//(key_data&GPIO_PIN_5) && !(key_data&GPIO_PIN_4) ){   moto_turnto(100);  } key_last_get=key_data;  }}void  moto_turnto(int degree){int i=0;//int j=;  if (degree>0){while (i<degree){/* Toggles LEDs *///GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);GPIO_Write(MOTO_GPIO_PORT, MOTO_PHASE8[moto_last_step%8]);Delay(0x1FF);i=i+1;moto_last_step=moto_last_step+1;}}else{degree=0-degree;while (i<degree){/* Toggles LEDs *///GPIO_WriteReverse(LED_GPIO_PORT, (GPIO_Pin_TypeDef)LED_GPIO_PINS);GPIO_Write(MOTO_GPIO_PORT, MOTO_PHASE8[moto_last_step%8]);Delay(0x1FF);i=i+1;moto_last_step=moto_last_step-1;//if (j==-1) }}}void Delay(uint16_t nCount){  while (nCount != 0)  {    nCount--;  }}#ifdef USE_FULL_ASSERTvoid assert_failed(uint8_t* file, uint32_t line){   while (1)  {  }}#endif