求大神帮忙看看为什么电机动不起来呢?
#include "stm32f10x.h"
#include "stm32f10x_gpio.h"
#include "stm32f10x_usart.h"
#include "stm32f10x_rcc.h"
#include "stm32f10x_flash.h"
#include "stm32f10x_systick.h"
#define XCP GPIO_Pin_1 //PA1
#define XDIR GPIO_Pin_6 //PE6
#define XEN GPIO_Pin_7 //PE7
#define XCPH() GPIO_ResetBits(GPIOA,XCP)
#define XCPL() GPIO_SetBits(GPIOA,XCP)
#define XDIRFORWARD() GPIO_ResetBits(GPIOE,XDIR)
#define XDIRBACK() GPIO_SetBits(GPIOE,XDIR)
#define XENENABLE() GPIO_ResetBits(GPIOE,XEN)
#define XENDISABLE() GPIO_SetBits(GPIOE,XEN)
#define ledon() GPIO_ResetBits(GPIOA,GPIO_Pin_7)
#define ledoff() GPIO_SetBits(GPIOA,GPIO_Pin_7)
u16 steps=0;
//u32 max;
void RCC_Configuration(void);
void GPIO_Configuration(void);
void USART1_Configuration(void);
void Lock(void);
void UnLock(void);
//void MOVE(void);
void delay_nms(u16 i);
void SysTick_Configuration(void);
GPIO_InitTypeDef GPIO_InitStructure;
/****主函数*****/
int main(void)
{
RCC_Configuration();
GPIO_Configuration();
USART1_Configuration();
// Lock();
// delay_nus(5);
// UnLock();
// delay_nus(5);
XENENABLE();
XDIRBACK();
while(1)
// if(steps<=60000)
{
// XENENABLE();
ledon();
delay_nms(10);
ledoff();
delay_nms(10);
XCPH();
delay_nms(5);
XCPL();
delay_nms(5);
// steps++;
}
// else
// {XCPH();}
// MOVE();
//// delay();
//while(i<5000)
//{i++;}
// Lock();
// ledon();
}
void Lock(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //输出模式为推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口最大输出速率
GPIO_Init(GPIOE, &GPIO_InitStructure); //完成初始化
// GPIO_SetBits(GPIOE,XCP);
// GPIO_SetBits(GPIOE,YCP);
// GPIO_SetBits(GPIOA,XCP);
GPIO_SetBits(GPIOE,XEN);
}
void UnLock(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; // 复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口最大输出速率
GPIO_Init(GPIOE, &GPIO_InitStructure); //完成初始化
// GPIO_ResetBits(GPIOA,XCP);
GPIO_ResetBits(GPIOE,XEN);
}
void RCC_Configuration() //配置STM32的时钟 & 打开IO口时钟
{
ErrorStatus HSEStartUpStatus; //定义外部高速晶体启动状态枚举变量
RCC_DeInit(); //复位RCC外部设备寄存器到默认值
RCC_HSEConfig(RCC_HSE_ON); //打开外部高速晶振
HSEStartUpStatus=RCC_WaitForHSEStartUp(); //等待外部高速时钟准备好
if(HSEStartUpStatus==SUCCESS) //外部高速时钟已经准备好
{
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //选择FLASH预取指缓存的模,预取指缓存使能
FLASH_SetLatency(FLASH_Latency_2); //设置FLASH存储器延时时钟周期数 FLASH_Latency_2 2延时周期
RCC_HCLKConfig(RCC_SYSCLK_Div1); //配置AHB(HCLK)时钟=SYSCLK
RCC_PCLK2Config(RCC_HCLK_Div1); //配置APB2(PCLK2)时钟=AHB时钟
RCC_PCLK1Config(RCC_HCLK_Div2); //配置APB1(PCLK1)时钟=AHB 1/2时钟
RCC_PLLConfig(RCC_PLLSource_HSE_Div1,RCC_PLLMul_9); //配置PLL时钟=外部高速晶体时钟*9
RCC_PLLCmd(ENABLE); //使能PLL时钟
while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY)==RESET) //等待PLL时钟就绪
{}
RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //配置系统时钟=PLL时钟
while(RCC_GetSYSCLKSource()!=0x08) //检查PLL时钟是否作为系统时钟
{}
}
}
void GPIO_Configuration()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOE,ENABLE); //打开电机控制的所有时钟,PA、PE
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 | GPIO_Pin_7; //所有电机方向与使能端
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz; //IO口最大输出速率
GPIO_Init(GPIOE, &GPIO_InitStructure); //完成初始化
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //所有电机频率,PWM输出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//为了测试电机,测试设置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //所有电机频率,PWM输出
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//为了测试电机,测试设置
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_2MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
// CLRCCR(); //2016.02.23
// GPIO_SetBits(GPIOE,YEN); //关闭所有电机
// GPIO_SetBits(GPIOE,XEN);
}
void USART1_Configuration(void)
{
USART_InitTypeDef USART_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);
/*
* USART1_TX -> PA9 , USART1_RX -> PA10
*/
// GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
GPIO_Init(GPIOA, &GPIO_InitStructure);
USART_InitStructure.USART_BaudRate = 9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_Init(USART1, &USART_InitStructure);
USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
//USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
USART_Cmd(USART1, ENABLE);
}
///*****延时函数*******/
//void delay(u16 i)//延时函数
//{
// u16 j,k;
// for(j=0;j<i;j++)
// for(k=0;k<5;k++);
//
//}
void SysTick_Configuration(void)
{
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8);
SysTick_CounterCmd(SysTick_Counter_Clear);
SysTick_SetReload(9000);
}
void delay_nms(u16 i)
{
SysTick_CounterCmd(SysTick_Counter_Enable);
while(SysTick_GetFlagStatus(SysTick_FLAG_COUNT)==0);
SysTick_CounterCmd(SysTick_Counter_Disable);
SysTick_CounterCmd(SysTick_Counter_Clear);
}
//void MOVE(u8 n)
//{
// steps = 0;
// max = steps;
// GPIO_SetBits(GPIOA,XCP); //PA1口置1,光耦隔离,接口CLK置0,X轴电机控制程序
// GPIO_SetBits(GPIOE,XEN);
// while(steps >=1)
// {
// if(steps < 15000)
// {
// GPIO_SetBits(GPIOE,XDIR);}
// else{GPIO_ResetBits(GPIOE,XDIR);;}
//
// GPIO_ResetBits(GPIOE,XEN);
// GPIO_ResetBits(GPIOE,XDIR);
//
// while(steps <= 30000)
// {
// GPIO_SetBits(GPIOA,XCP); //PA1置1==》CLK置0,脉冲低电平?
// delay(50); //延时
// GPIO_ResetBits(GPIOA,XCP); //脉冲高电平
// delay(50); //延时
// steps++; //步数减1
// }
//
// GPIO_ResetBits(GPIOA,XCP);
// }
//void MOVE(void)
//{
// steps=32000;
// max=steps;
// GPIO_SetBits(GPIOA,XCP); //PA1口置1,光耦隔离,接口CLK置0,X轴电机控制程序
// GPIO_SetBits(GPIOE,XEN); //PE7口置1,光耦隔离,接口ENABLE置0
//
// GPIO_ResetBits(GPIOE,XEN); //stm32使能端置0,THB7128使能端置1,启动电机?
// while(steps>=1) //
// {
// if(steps<3200) //判断步数是否小于3200?
// {GPIO_SetBits(GPIOE,XDIR);} //PE6置1,控制电机方向为正转(CW=0正转)?
// else
// {
// if(steps==3200){delay(60000);}; //判断steps是否等于3200,若等于则启动延时程序
// GPIO_ResetBits(GPIOE,XDIR); //stm32 PE6口置0==》XDIR置1,控制电机反转
// }
// GPIO_SetBits(GPIOA,XCP); //PA1置1==》CLK置0,脉冲低电平?
// delay(50); //延时
// GPIO_ResetBits(GPIOA,XCP); //脉冲高电平
// delay(50); //延时
// steps--; //步数减1
// }
// GPIO_SetBits(GPIOE,XEN); //停止
//}
这个问题已经解决了,之前是stm32的IO口输出模式设置不对,改了之后就可以了。现在我遇到了另外的问题,用stc15单片机控制LV8729V驱动步进电机,做加减速的时候电机进不了加减速的程序,之前的时候是可以加减速,但是现在不知道为什么不行了。好烦啊
加速太快了吧,降低速度试试
一周热门 更多>