目录
简介
在做项目的时候,需要一种电机是能够实现带动托盘上升功能,要求力足,精度高。
经过选择锁定了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);
}
}