GD32F303 步进电机驱动

目录

一、硬件原理图接口

二、软件实现


一、硬件原理图接口

二、软件实现

/* motor.c */
#include "motor.h" 



//电机引脚和端口
#define MOTOR_PORT		GPIOE
#define MOTOR_PIN_A		GPIO_PIN_9
#define MOTOR_PIN_B		GPIO_PIN_8
#define MOTOR_PIN_C		GPIO_PIN_7


#define MOTOR_PORT_D		GPIOB
#define MOTOR_PIN_D		  GPIO_PIN_2




typedef struct
{
    volatile int   goCount;	    /*设置电位器在本次调节中需要转动步数*/										  															 
    volatile u8   RunOneStepInterval;	//每走一步的间隔时间														  
}S_FLOWCHECK;



S_FLOWCHECK FlowCheck=
{
    .goCount = 0,
    .RunOneStepInterval = 40,
};
 

//旋转控制逻辑A-AB-B-BC-C-CD-D-DA    //二相四线的控制方式
const uint8_t MotorCtrPara[] = {0x01, 0x03, 0x02, 0x06, 0x04, 0x0c, 0x08, 0x09};



static void MOTOR_STOP()
{
	gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_A);
	gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_B);
	gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_C);
	
	gpio_bit_reset(MOTOR_PORT_D, MOTOR_PIN_D);
}


void Motor_Init(void)
{
    rcu_periph_clock_enable(RCU_GPIOE);
	rcu_periph_clock_enable(RCU_GPIOB);

    gpio_init(MOTOR_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, 
    MOTOR_PIN_A|MOTOR_PIN_B|MOTOR_PIN_C);
	
    gpio_init(MOTOR_PORT_D, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, MOTOR_PIN_D);
	
    MOTOR_STOP();  //输出全部拉低
}


static void set_motor_rotation(uint8_t gpio_valve)
{
	gpio_valve &= 0x0f;
	
	switch(gpio_valve)
	{
		case 0x01:
		  gpio_bit_set(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_reset(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
		
		case 0x03:
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_reset(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
				
		case 0x02:
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_reset(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
						
		case 0x06:
		    gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_C);
		    gpio_bit_reset(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
								
		case 0x04:
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_B);
		    gpio_bit_set(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_reset(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
										
		case 0x0c:
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_set(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
												
		case 0x08:
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_set(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
														
		case 0x09:
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_B);
			gpio_bit_reset(MOTOR_PORT, MOTOR_PIN_C);
			gpio_bit_set(MOTOR_PORT, MOTOR_PIN_A);
			gpio_bit_set(MOTOR_PORT_D, MOTOR_PIN_D);
			break;
																
		default:
			break;
	}
}


/******************************************************************
* @brief 步进电机控制,需要在1ms定时器中断中一直调用
*******************************************************************/
void Motor_TickInc(void)   //1ms进入一次
{
    static signed char positive_tick=0; //正向转
	static signed char negative_tick=7; //反向转
	uint8_t mOdr = 0x00;
	
	
	if(FlowCheck.goCount == 0)
	{
		MOTOR_STOP();
		return;
	}
	if(FlowCheck.RunOneStepInterval > 0)   //40ms没到直接返回
	{
		FlowCheck.RunOneStepInterval--;
		return;				
	}						
			
	//已经到达40ms						 
	if(FlowCheck.goCount > 0)  //正转
	{	  
		 mOdr|=MotorCtrPara[positive_tick];
			
		 positive_tick++;										
		 if(positive_tick > 7)      //磁极转完一圈
		 {
			 positive_tick =0;
			 FlowCheck.goCount--;	
			 FlowCheck.RunOneStepInterval = 40;	//8个磁极全部走完,40ms间隔重新赋值			 
		 }							 						
	}		
	else 	//反转
    {		
        mOdr|=MotorCtrPara[negative_tick];
		
		negative_tick--;							
		if(negative_tick < 0)      //磁极转完一圈
		{
			negative_tick = 7;	
			FlowCheck.goCount++;	
			FlowCheck.RunOneStepInterval = 40;				 
		}					  						 
	}				 							 			 
	set_motor_rotation(mOdr);
}
### 回答1: 在gd32f303上驱动w5500,需要首先了解w5500的接口和通信协议。w5500是一款高性能的以太网控制器,支持全双工Ethernet、TCP/IP、UDP/IP以及其他网络协议,具有低功耗和丰富的特性。下面是如何在gd32f303上驱动w5500的一般步骤: 1. 硬件连接:将w5500与gd32f303通过SPI接口相连,同时注意连接到正确的引脚上,例如,将w5500的SCK连接到gd32f303的SPI的SCK引脚,将w5500的MISO连接到gd32f303的SPI的MISO引脚。 2. 初始化SPI:在gd32f303上初始化SPI接口,设置正确的SPI模式、数据位数、时钟速率等参数。 3. 初始化w5500:使用SPI接口向w5500发送初始化命令,设置w5500的工作模式、IP地址、端口等参数。 4. 进行网络通信:通过SPI接口向w5500发送数据帧,包括数据发送和接收。可以使用w5500提供的TCP/IP或UDP/IP协议栈,在gd32f303上实现网络通信功能。 5. 处理数据:在gd32f303上接收w5500传输过来的数据帧,并进行相应的数据处理,例如解析TCP/IP协议的数据包。 6. 关闭连接:在网络通信结束后,关闭w5500连接,释放资源。 需要注意的是,在整个驱动过程中,需要根据w5500的数据手册和gd32f303的技术文档,编写相应的驱动程序和控制代码,实现对w5500的控制和通信。此外,还需要了解GD32F303的SPI和中断控制等相关功能,以便正确地与w5500进行通信和数据处理。 ### 回答2: 为了驱动gd32f303与w5500通讯,我们需要通过SPI(串行外设接口)来实现数据的传输。 首先,需要配置SPI的工作模式、数据位长度、主从模式等参数,使其能够与w5500进行通信。然后,我们需要提供一些必要的函数,如SPI初始化函数、SPI发送数据函数和SPI接收数据函数。 在初始化阶段,我们需要通过SPI初始化函数配置SPI的各种参数,如通信速度、数据位长度、主从模式等。然后,我们还需要初始化W5500的各个寄存器,以便能够正确地与W5500进行通信。 在数据传输过程中,我们首先需要调用SPI发送函数发送命令,以便W5500能够正确地解析我们的指令。然后,我们需要将待发送的数据逐个字节地发送给W5500。在发送完所有数据后,我们还需要调用SPI接收函数接收W5500返回的数据。 最后,我们需要根据W5500的工作原理和数据手册提供的相关API,通过编写相应的函数来实现特定的功能,如初始化W5500、配置网络参数、读取和写入数据等。在实现这些功能的过程中,我们还需要配合使用SPI发送和接收函数,以实现与W5500的正常通信。 总结一下,为了驱动gd32f303与w5500通讯,我们需要配置SPI的各种参数,编写相应的函数实现数据的发送和接收,并根据w5500的工作原理和数据手册提供的API,编写特定功能的函数。通过这些步骤,我们就能够成功地驱动w5500与gd32f303进行通信。 ### 回答3: gd32f303是一款由GigaDevice公司推出的32位微控制器,而w5500则是一款由WIZnet公司推出的高性能以太网控制器。要在gd32f303上驱动w5500,需要进行以下步骤: 1. 连接硬件:将gd32f303的SPI接口与w5500的SPI接口连接,连接时需要注意SDI(MOSI)、SDO(MISO)、SCLK、nSS(片选信号)的对应关系。 2. 配置寄存器:在gd32f303上配置SPI的工作模式、数据位宽、时钟极性和相位等参数,以与w5500进行正确的通信。还需将nSS引脚设置为输出模式,用于控制w5500的片选信号。 3. 初始化w5500:通过SPI接口向w5500写入初始化配置信息,例如IP地址、子网掩码、网关IP等。还需配置w5500的工作模式,可以是TCP服务器、TCP客户端、UDP等。 4. 数据传输:利用SPI接口,gd32f303向w5500发送数据或从w5500接收数据。发送数据时,需将数据写入w5500的发送缓冲区;接收数据时,需从w5500的接收缓冲区读取数据。 5. 中断处理:gd32f303可以通过外部中断引脚监听w5500的中断信号,例如收到新的数据包、发送完成等。在中断处理函数中,可以进行相关的数据处理或状态更新操作。 6. 错误处理:在驱动w5500过程中,可能会出现一些错误,例如通信超时、数据包丢失等。需要对这些错误进行处理,例如重新发送数据包或重新连接网络。 7. 系统集成:将w5500的驱动程序与gd32f303的主程序集成,在主程序中完成其它相关的功能,例如处理应用层协议、实现网络通信等。 通过以上步骤,可以实现gd32f303对w5500的驱动,从而能够进行以太网通信。当然,在实际应用中,还需要根据具体需求进行修改和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值