OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 16546|回复: 5

步进电机疑问

[复制链接]

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
发表于 2013-8-5 12:16:21 | 显示全部楼层 |阅读模式

下图是我步进电机的时序图

1:第1步 0111  第2步 0011 第3步1011 第4步1001 第5步1101 第6步1100 第7步1110 第8步0110 
    因为我用2003来驱动 因为他是反相的所以
    第1步 1000  第2步 11 00  第3步0100 第4步0110 第5步0010第6步0011 第7步0001 第8步1001  这样理解对吗???
2:
GPIOB->ODR=0xff1f; 这样的赋值方式没有错吧!!使GPIOB得5 6 7位置0
3:如果第一个步骤中实现反转 那么正转是什么顺序啊?
    
第1步1001 第2步0001 第3步0011  第4步0010 第5步0110  第6步0100  第7步 11 00    第8步 1000 ????

驱动步进电机.rar

261.28 KB, 下载次数: 101

实验13 TFTLCD显示实验.rar

100.35 KB, 下载次数: 68

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2013-8-5 21:51:15 | 显示全部楼层
我只能帮你看看第二个问题。
GPIOB->ODR=0xff1f,这种方式可以,但是你会把其他控制位也清掉。如果PB口没挂其他东西,倒是无所谓,如果还接了其他东东,那就会影响他们的时序了。
至于步进电机的正反转控制,我也不清楚了,你实际测试下吧。
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复 支持 反对

使用道具 举报

36

主题

100

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
265
金钱
265
注册时间
2013-8-3
在线时间
0 小时
发表于 2013-8-8 08:02:42 | 显示全部楼层
不知楼主有没有弄好了,我想用PWM来控制步进电机,可是要产生相位不相同的,我就不会了,怎么看
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2013-8-8 13:55:44 | 显示全部楼层
我的程序只能反转 正转不了 没试过PWM控制 和你说的相位不好把握吧。。。你想控制速度完全不用PWM也可以啊 用IC控制
回复 支持 反对

使用道具 举报

5

主题

11

帖子

0

精华

初级会员

Rank: 2

积分
101
金钱
101
注册时间
2013-8-1
在线时间
16 小时
发表于 2013-8-8 14:59:18 | 显示全部楼层
#include <stm32f10x_lib.h>
#include<delay.h>
#include "dianji.h"
#include "lcd.h"
#include "huitu.h"
//#include "sys.h"
//#include "usart.h"
unsigned char  FFW[8]={0x08,0x0c,0x04,0x06,0x02,0x03,0x01,0x09};
unsigned char  REV[8]={0x09,0x01,0x03,0x02,0x06,0x04,0x0c,0x08};
unsigned char  FFW1[8]={0x80,0xc0,0x40,0x60,0x20,0x30,0x10,0x90};
unsigned char  REV2[8]={0x90,0x10,0x30,0x20,0x60,0x40,0xc0,0x80};
//换用数组效果待定
//unsigned char  FFW[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
//unsigned char  REV[8]={0x09,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};
//unsigned char  FFW1[8]={0x10,0x30,0x20,0x60,0x40,0xc0,0x80,0x90};
//unsigned char  REV2[8]={0x09,0x80,0xc0,0x40,0x60,0x20,0x30,0x10};
//

//初始化PA8和PD2为输出口.并使能这两个口的时钟    
//电机IO初始化
void BUJIN_Init(void)
{
RCC->APB2ENR|=1<<2; //使能PORTA时钟    
GPIOA->CRL&=0X00000000; 
GPIOA->CRL|=0X33333333;//PA8 推挽输出    
}
//**********************步进电机反转****************************** 
   extern u8 paishu;
   extern int  bushu;
void Motor_Right_Step(int n)//电机1 PA0~3
  {   
     unsigned char i;
     unsigned int  j;
   for (j=0; j<n; j++)
    {   
     for (i=0; i<8; i++)
       {
GPIOA->ODR&= 0XFFF0;
        GPIOA->ODR |= FFW;
      delay_ms(8) ;
paishu++;  
if(paishu>8)
{
paishu=0;
}
        }
bushu++;
LCD_ShowString(60,12,"bushu:");
LCD_ShowNum(108,12,bushu,5,16);
LCD_ShowString(60,28,"paishu:");
LCD_ShowNum(116,28,paishu,1,16);
   }
 }
//*********************步进电机正转******************************** 
void Motor_Left_Step(int n)  //电机1  A0~3

 {
  unsigned char i;
  unsigned int  j;
  for (j=0; j<n; j++)
      {
       for (i=0; i<8; i++)
       {
GPIOA->ODR&= 0XFFF0;
       GPIOA->ODR |= REV;

    delay_ms(8) ;
paishu++;
   if(paishu>8)
   {
    paishu=0;
   }

       }
bushu++;
LCD_ShowString(60,12,"bushu:");
LCD_ShowNum(108,12,bushu,5,16);
LCD_ShowString(60,28,"paishu:");
LCD_ShowNum(116,28,paishu,1,16);

     }
 }


void Motor2_Right_Step(int n)//电机2反转PA4~7
  { 
     unsigned char i;
     unsigned int  j;
   for (j=0; j<n; j++)
    {
     for (i=0; i<8; i++)
       { GPIOA->ODR&= 0XFF0F;
        GPIOA->ODR |= FFW1;
    delay_ms(8) ;
paishu++;  
if(paishu>8)
{
paishu=0;
}
        }
bushu++;
LCD_ShowString(60,12,"bushu:");
LCD_ShowNum(108,12,bushu,5,16);
LCD_ShowString(60,28,"paishu:");
LCD_ShowNum(116,28,paishu,1,16);
   }
 }
//*********************步进电机正转******************************** 
void Motor2_Left_Step(int n)  //电机2PA4~7

 {
  unsigned char i;
  unsigned int  j;
  for (j=0; j<n; j++)
      {
       for (i=0; i<8; i++)
       {
GPIOA->ODR&= 0XFF0F;
       GPIOA->ODR |=  REV2;
    delay_ms(8) ;
paishu++;
   if(paishu>8)
   {
    paishu=0;
   }

       }
bushu++;
LCD_ShowString(60,12,"bushu:");
LCD_ShowNum(108,12,bushu,5,16);
LCD_ShowString(60,28,"paishu:");
LCD_ShowNum(116,28,paishu,1,16);

     }
 }
这是我做帆板控制中写的,可以实现正反转。我用的是28BYI48减速步进电机,不知是否有用
 

 



生活就是要流泪。
回复 支持 反对

使用道具 举报

59

主题

189

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
451
金钱
451
注册时间
2012-4-11
在线时间
1 小时
 楼主| 发表于 2013-8-10 10:11:56 | 显示全部楼层
回复【5楼】军师李修成:
---------------------------------谢谢您的回答
u32 table6[]={0xffef,0xffdf,0xffbf,0xff7f};  这是我的反转 (电机真转了)那么
u32 table9[]={0xff7f,0xffbf,0xffdf,0xffef}; 这个应该是我的正转了吧????
我看了你的程序是数组反过来啊。。。为什么不正转哪????
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-7-15 13:25

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表