(合泰杯)HT32F52352驱动42步进电机(函全部实现代码逻辑)

目录

简介

PWM.c

PWM.h

main.c

视频演示


简介

在做项目的时候,需要一种电机是能够实现带动托盘上升功能,要求力足,精度高。

经过选择锁定了42步进电机,它的优点如下:

精度高: 步进电机能够以精确的步进角度进行运动,提供高精度的位置和速度控制,适用于需要精密定位的应用。

可控性强: 通过调整输入的脉冲信号,可以灵活控制步进电机的转动角度和速度,满足不同应用的需求。

结构简单: 步进电机的控制电路相对简单,只需提供脉冲信号即可控制转动,不需要额外的传感器或反馈系统。

启动扭矩高: 步进电机在启动时具有较高的扭矩,可以应对启动时的负载,适用于一些需要启动力矩的应用。

        我简要说一下要准备什么驱动硬件,首先要有24V电源模块,单个需求电路大于8ma,脉冲宽度大于1us,驱动的话淘宝可以连带买TB6600这个驱动如图1,相对来说比较大,都是驱动简单,当然也可以用a498816图2,来驱动,这个比较小,,适合pcb制作驱动,但是它要买一个驱动板图3,这个可以查。

现在来介绍一下合泰杯芯片驱动程序。

                                        图1

                                        图2

                                        图3

驱动42步进电机需要借单片机3个IO,使能,方向,脉冲,其中脉冲就要配置pwm的输出捕获,现在来对它进行配置

PWM.c

void PWM_Init(void)
{
	{ /* Enable peripheral clock                                                                        
      */
   CKCU_PeripClockConfig_TypeDef CKCUClock = {{ 0 }};
	CKCUClock.Bit.PC               = 1;    //PC端口时钟开启
   CKCUClock.Bit.PB               = 1;
   CKCUClock.Bit.GPTM1            = 1;    //通用定时器GPTM1时钟开启
   CKCUClock.Bit.AFIO             = 1;    //复用功能时钟开启
   CKCU_PeripClockConfig(CKCUClock, ENABLE);
   }
	
	{ /* Configure AFIO mode as TM function                                                            
      */
   AFIO_GPxConfig(GPIO_PC, AFIO_PIN_10, AFIO_MODE_4);    //将GPTM1_CH0映射到PC10
	AFIO_GPxConfig(GPIO_PC, AFIO_PIN_11, AFIO_MODE_4);	//将GPTM1_CH1映射到PC11
		
		AFIO_GPxConfig(GPIO_PB,GPIO_PIN_4 ,AFIO_MODE_1 );   //使能B4
		AFIO_GPxConfig(GPIO_PB,GPIO_PIN_5 ,AFIO_MODE_1);   //使能B6
		AFIO_GPxConfig(GPIO_PB,GPIO_PIN_6 ,AFIO_MODE_1 );   //方向B5
		AFIO_GPxConfig(GPIO_PB,GPIO_PIN_7 ,AFIO_MODE_1 );   //方向B7
		
		GPIO_DirectionConfig(HT_GPIOB,(GPIO_PIN_4)|(GPIO_PIN_5), GPIO_DIR_OUT); //配置GPIO引脚的方向:GPIO_DIR_OUT输出orGPIO_DIR_IN输入
   }
 
	{ /* Time base configuration                                                                            
      */
   TM_TimeBaseInitTypeDef TimeBaseInit;
 
   TimeBaseInit.Prescaler = 72 - 1;    //Timer Clock = CK_AHB/HTCFG_PWM_TM_PRESCALER
   TimeBaseInit.CounterReload = 102 - 1;
	TimeBaseInit.RepetitionCounter = 0;
   TimeBaseInit.CounterMode = TM_CNT_MODE_UP;    //设置为向上计数
   TimeBaseInit.PSCReloadTime = TM_PSC_RLD_IMMEDIATE;    //立即重装载
   TM_TimeBaseInit(HT_GPTM1, &TimeBaseInit);
	TM_CRRPreloadCmd(HT_GPTM1, ENABLE);    //使能CRR寄存器预装载值
 
   /* Clear Update Event Interrupt flag since the "TM_TimeBaseInit()" writes the UEV1G bit */
   TM_ClearFlag(HT_GPTM1, TM_FLAG_UEV);
   }
	
	{ /* Channel n output configuration                                                        
      */
   TM_OutputInitTypeDef OutInit;
		
   OutInit.Channel = TM_CH_0;
   OutInit.OutputMode = TM_OM_PWM1;        //模式设置为PWM1,不同的模式可以查看数据手册
   OutInit.Control = TM_CHCTL_ENABLE;      //GPTM通道使能
   OutInit.ControlN = TM_CHCTL_DISABLE;                  
   OutInit.Polarity = TM_CHP_INVERTED;     //GPTM通道极性为高电平有效 
	TM_OutputModeConfig(HT_GPTM1, TM_CH_0, TM_OM_PWM1);		
	TM_OutputInit(HT_GPTM1,&OutInit);
   //OutInit.Compare = 0;                  //初始角度为0°
    OutInit.Channel = TM_CH_1;
   OutInit.OutputMode = TM_OM_PWM1;        //模式设置为PWM1,不同的模式可以查看数据手册
   OutInit.Control = TM_CHCTL_ENABLE;      //GPTM通道使能
   OutInit.ControlN = TM_CHCTL_DISABLE;                  
   OutInit.Polarity = TM_CHP_INVERTED;     //GPTM通道极性为高电平有效
   
//TM_SetCaptureCompare(HT_GPTM1,TM_CH_0,0);
	
	TM_OutputModeConfig(HT_GPTM1, TM_CH_1, TM_OM_PWM1);
	TM_OutputInit(HT_GPTM1,&OutInit);
 }
	
	
 //TM_IntConfig(HT_GPTM1, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE);  //中断	
	TM_Cmd(HT_GPTM1, ENABLE);    //最后一定要记得使能GPTM
}

配置程序要去看数据手册,配置好相应的功能,开启相应功能,其实和stm32差不多,学过的朋友应该知道。好现在对电机函数进行展示。

//步进电机1启动
void Motor1_ON(void)				//电机1开
{
	
	Motor1_ENA_ON;
	TM_SetCaptureCompare(HT_GPTM1,TM_CH_0,52);
}

//步进1电机关闭
void Motor1_OFF(void)				//电机1关
{
	Motor1_ENA_OFF;
	TM_SetCaptureCompare(HT_GPTM1,TM_CH_0,0);
}

//步进2电机启动
void Motor2_ON(void)				//电机2开
{
	Motor2_ENA_ON;
	TM_SetCaptureCompare(HT_GPTM1,TM_CH_1,52);
}

//步进2电机关闭
void Motor2_OFF(void)				//电机2关
{

	Motor2_ENA_OFF;
	TM_SetCaptureCompare(HT_GPTM1,TM_CH_1,0);
}

//步进1电机抬升
void Motor1_up()
{
	Motor1_ON();
	Step1_DIR_UP;
	
}
//步进1电机下降
void Motor1_down()
{
	Motor1_ON();
	Step1_DIR_DOWN;
	
}
//步进2电机抬升
void Motor2_up()
{
	Motor2_ON();
	Step2_DIR_UP;
	
}
//步进2电机下降
void Motor2_down()
{
	Motor2_ON();
	Step2_DIR_DOWN;
}

我这里用来两个捕获通道,实现对两个电机控制,当然可以更多,但是要看给的数据手册自行配置。一些宏定义我放在.h文件

PWM.h

#ifndef _MOTOR_H
#define _MOTOR_H
 
#include "ht32f5xxxx_01.h"              // Device header


//注释以英文简写为准
#define 	Motor1_ENA_ON 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_4,SET)
#define 	Motor1_ENA_OFF 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_4,RESET)
#define 	Motor2_ENA_ON 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_6,SET)
#define 	Motor2_ENA_OFF 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_6,RESET)

#define 	Step1_DIR_DOWN 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_5,RESET)
#define 	Step1_DIR_UP 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_5,SET)
#define 	Step2_DIR_DOWN 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_7,RESET)
#define 	Step2_DIR_UP 	GPIO_WriteOutBits(HT_GPIOB,GPIO_PIN_7,SET)

void PWM_Init(void);
void Motor1_ON(void);
void Motor1_OFF(void);
void Motor2_ON(void);
void Motor2_OFF(void);
void Motor1_up();
void Motor1_down();
void Motor2_up();
void Motor2_down();
 
#endif

主函数就直接放相应代码进去就可以实现啦

main.c

#include "ht32.h"
#include "ht32_board.h"
#include "led.h"
#include "delay.h"
#include "USART.h"
#include "IIC.h"
#include "SHT30.h"
#include "modbus485.h"
#include "motor.h"
//#include "Timer.h"


int temp1;
u16 humi;

volatile u32 milliseconds = 0;
volatile u32 seconds = 0;
u8 led_flag,light_in;



//
	

int main()
{
	
	//USART1_Configuration();
	PWM_Init();
		//LED_Init();	
		//SHT30_Init();
	
		//BFTM0_Configuration();
		//USART0_Configuration();
		
	//USART_Configuration();
		//Send_Data();
	
	while(1)
	{
		//Motor1_up();
		Motor1_down();
//		Readshuju();
//		delay_ms(1000);
	}
	
}

视频演示

  • 29
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值