gongcheng111 发表于 2012-7-28 09:41:17

STM32 42步进电机程序,电机不转

本帖最后由 gongcheng111 于 2012-7-29 08:49 编辑

我的程序如下
#include "stm32f10x_it.h"
#include "stm32f10x_conf.h"
#include "stm32f10x.h"
#include <stdio.h>
#include "gpio.h"
#include "rcc.h"
#include"qudong.h"

void Init(void);          //初始化
void Forward(void);
void Backward(void);
void Left(void);
void Right(void);
void Stop(void);

/********1MS 延时程序*********/
volatile u16 Timer1;
void SysTickDelay(u16 dly_ms)
{
        Timer1=dly_ms;
        while(Timer1);
}

int i=10000;//暂定为10000个脉冲
int main(void)
{
   Init();
          
   while(1)
   {
          Forward();//前进,电机转50圏                       
   }
}

/*电机驱动程序*/
/*前进程序*/
void Forward(void)
{
    while(i--)
{
   GPIO_Write(GPIOA,0x55);
   SysTickDelay(50);
   GPIO_Write(GPIOA,0x66);
SysTickDelay (50);
   GPIO_Write(GPIOA,0xaa);
SysTickDelay (50);
   GPIO_Write(GPIOA,0x99);
SysTickDelay (50);
   }
}
/*后退程序*/
void Backward(void)
{
   while(i--)
{
   GPIO_Write(GPIOA,0x99);
   SysTickDelay(50);
   GPIO_Write(GPIOA,0xaa);
   SysTickDelay(50);
   GPIO_Write(GPIOA,0x66);
SysTickDelay (50);
   GPIO_Write(GPIOA,0x55);
SysTickDelay (50);
   }
}

/*左转程序*/

void Left(void)
{
       while(i--)
{
   GPIO_Write(GPIOA,0x59);
SysTickDelay (50);
   GPIO_Write(GPIOA,0x6a);
SysTickDelay (50);
   GPIO_Write(GPIOA,0xa6);
SysTickDelay (50);
   GPIO_Write(GPIOA,0x95);
   SysTickDelay(50);
   }
}

/*右转程序*/

void Right(void)
{
    while(i--)
{
   GPIO_Write(GPIOA,0x95);
   SysTickDelay(50);
   GPIO_Write(GPIOA,0xa6);
SysTickDelay (50);
   GPIO_Write(GPIOA,0x6a);
   SysTickDelay(50);
   GPIO_Write(GPIOA,0x59);
SysTickDelay (50);
   }
}

/*小车停止*/
void Stop(void)
{
GPIO_Write(GPIOA,0x00);
}

/*STM32与步进电机的接口设置*/
void GPIO_Configuration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
        GPIO_Init(GPIOA,&GPIO_InitStructure);
}

我用的驱动板是L298.一号电机的A,A-,B,B-分别接L298的IN1,IN2,IN3,IN4,与A0,A1,A2,A3相连;二号电机的A,A-,B,B-分别接另一个L298的IN1,IN2,IN3,IN4,与A4,A5,A6,A7相连.但通电后步进电机一点反应都没有,小弟是新手,都不太懂。请大家多多指教!
用示波器测了下AO引脚,发现只会有高电平输出!没有低电平。这就是无法驱动步进电机的原因吧!是不是端口设置的问题?还是延时程序的问题?在主函数里面写入
GPIO_SetBits(GPIOA,GPIO_Pin_0);
SysTickDelay(50);
GPIO_ResetBits(GPIOA,GPIO_Pin_0);
SysTickDelay(50);       
看看是缶有方波输出,结果还是输出高电平。如果只写GPIO_ResetBits(GPIOA,GPIO_Pin_0);则会输出低电平。小弟实在整不明白,请大家多多指教!!!

gongcheng111 发表于 2012-7-28 12:17:24

怎么没人了,请大家来帮帮我啊

gongcheng111 发表于 2012-7-28 16:32:20

请大家帮帮忙啊,谢谢啊

ITOP 发表于 2012-7-28 16:41:05

需要使用PWM模式,调试出一个合适的频率,对于初学者建议先不用加减速!

.titrwh 发表于 2012-7-28 16:42:32

gongcheng111 发表于 2012-7-28 16:32 static/image/common/back.gif
请大家帮帮忙啊,谢谢啊

这个不一定是软件问题,最起码上电路图让大家知道你是用什么电路驱动的,用哪些端口,你这样只给个程序,谁也帮不了你。                     

gongcheng111 发表于 2012-7-28 20:12:52

ITOP 发表于 2012-7-28 16:41 static/image/common/back.gif
需要使用PWM模式,调试出一个合适的频率,对于初学者建议先不用加减速!

您好,可以给一个例程参考吗?我第一次接触,什么都不太清楚,不知道怎么用

gongcheng111 发表于 2012-7-29 08:50:09

.titrwh 发表于 2012-7-28 16:42 static/image/common/back.gif
这个不一定是软件问题,最起码上电路图让大家知道你是用什么电路驱动的,用哪些端口,你这样只给个程序, ...

嗯。我用示波器看了看,发现没法输出方波,还麻烦您再看看,是不是我的端口设置错误了?

gongcheng111 发表于 2012-7-29 08:51:10

把程序下载里面,电机不转,但用手转明显的感到阻力。

gongcheng111 发表于 2012-7-29 11:35:20

大侠们快来帮帮忙啊!我实在不明白了

geiter001 发表于 2012-8-5 23:12:55

解决了没有?我的看法:1,如果怀疑延时的问题,则用简单的延时,如:void delay(int t) { u8 i; u8 j; for(i=0;i<t;i++)for(...)}. 一试便知。2,硬件问题,检测电路,查看L298 BLOCK DIAGRAM,查看分析IN1,IN2,IN3,IN4 引脚的波形等。3,软件仿真,直接用Keil 中的逻辑分析。呵呵,等待LZ的结果哦!

gongcheng111 发表于 2012-8-13 19:12:23

geiter001 发表于 2012-8-5 23:12 static/image/common/back.gif
解决了没有?我的看法:1,如果怀疑延时的问题,则用简单的延时,如:void delay(int t) { u8 i; u8 j; for(i ...

似乎就是延时的问题。用系统定时器就是不好使,而用FOR循环则可以,真是想不明白,难道是库函数版本不同?

Lavion 发表于 2012-8-13 19:49:14

编译器优化问题,一般优化等级太高,或者自己关键变量未加 volatile 声明
自己查看对应的汇编就知道了

xyfaneast 发表于 2013-3-26 19:26:26

延时要弄好,要不就不会转

darksnipersblue 发表于 2013-9-7 22:44:19

.titrwh 发表于 2012-7-28 16:42 static/image/common/back.gif
这个不一定是软件问题,最起码上电路图让大家知道你是用什么电路驱动的,用哪些端口,你这样只给个程序, ...

求教您一个问题 我现在使用42步进电机 SWT-201驱动器 8细分 以前控制步进电机没有使用过细分驱动 现在不是很明白 我让一个端口产生PWM   然后做一个定时 然后把这个端口PWM占空比置0我单次让他旋转相应的度数都没问题 但是如果让他正转一个度数 再反转的时候 感觉转不到相应度数 求教
页: [1]
查看完整版本: STM32 42步进电机程序,电机不转