用STM32C8T6驱动DM542来控制步进电机正反转

        今天到了一个模组,老师喊把步进电机先转起来,之前也没用过步进电机,只用过L298N驱动过直流电机控制它的正反转。

1.硬件部分

这是我的c8t6

这是dm542驱动

这是购买的模组,实际上就是一个步进电机

  要让步进电机转起来,首先接线很重要,我用的是24V电池驱动的,有些问题,建议大家用220转24电源进行供电

驱动分为六个接口,我采用的是共阴极接法,PUL是用来接收脉冲的,DIR是用来控制电机转动的方向,ENA是使能,可以选择不接。

PUL+(接PWM脉冲,这里是我的TIM3,PB0口)

PUL-(接地)

DIR+(拉高低电平就可以了,我用的是PB1)

DIR-(接地)

ENA+

ENA-

注意,单片机还要和驱动共地才行,不然是没有反应的。

 2.代码部分

这是电机IO口的使能部分,使能PB0 PB1,PB0是PWM脉冲输出口,通过调整PB1来使电机正反转

void Motor_X(void)
 {
  GPIO_InitTypeDef GPIO_InitStructure;  
  RCC_APB2PeriphClockCmd( RCC_APB2Periph_GPIOB, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; 
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; 
  GPIO_Init(GPIOB, &GPIO_InitStructure);
 }

 
void Motor_X_ZHENG(void)           //zuo正转
{
 GPIO_ResetBits(GPIOB,GPIO_Pin_1);
}


void Motor_X_FAN(void)           //zuo正转
{
 GPIO_SetBits(GPIOB,GPIO_Pin_1);
}

接下来是对定时器3的初始化使能IO口,使能PB0就可以了,从而输出PWM脉冲,用哪个口使能哪个口

void TIM3_PWM_Init(u16 arr,u16 psc)///pwm
{
	GPIO_InitTypeDef GPIO_InitStrue;
	TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
	TIM_OCInitTypeDef TIM_OCInitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);

	GPIO_InitStrue.GPIO_Mode=GPIO_Mode_AF_PP;
	GPIO_InitStrue.GPIO_Pin=GPIO_Pin_0;//PB0->CH3  PB1->CH4 TIM3 
	GPIO_InitStrue.GPIO_Speed=GPIO_Speed_50MHz;
	GPIO_Init(GPIOB,&GPIO_InitStrue);
	
	TIM_TimeBaseStructure.TIM_Period = arr; 
	TIM_TimeBaseStructure.TIM_Prescaler =psc; 
	TIM_TimeBaseStructure.TIM_ClockDivision = 0; 
	TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 
	TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); 
	
	TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
	TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low ; 
	TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
	TIM_OC3Init(TIM3,&TIM_OCInitStructure);
	TIM_OC4Init(TIM3,&TIM_OCInitStructure);
	
	TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_OC4PreloadConfig(TIM3, TIM_OCPreload_Enable);
	TIM_Cmd(TIM3,ENABLE);
}

然后是主函数部分,直接调用就可以了

 int main(void)
{	 	
		NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置中断优先级分组为组2:2位抢占优先级,2位响应优先
		delay_init();//延时函数初始化	
//	uart_init(115200);//串口1 ,连接蓝牙传输数据
//	PCA9685_Init(50,72);
//	OLED_Init();//oled显示屏初始化
//  OLED_ColorTurn(0); //0正常显示,1 反色显示
//  OLED_DisplayTurn(0); //屏幕旋转180度调整
		TIM3_PWM_Init(999,71);//定时器3初始化
		Motor_X();
	 while(1)
	 {		    
//		 	sprintf((char *)string,"Z:%d",zuo);//显示接收到的数据,模式1,车辆行动
//		  OLED_ShowString(10,5,string,8,1);
//		  OLED_Refresh();//oled刷新
				delay_ms(10);//去抖动
//			Motor_X_ZHENG();
		 		Motor_X_FAN();
				TIM_SetCompare3(TIM3,400);


	 }
	}		

整个工程的链接在此处,需要的自行提取:

链接:https://pan.baidu.com/s/1rqAzxiLg9Kh3zopuWmpXYA 
提取码:xgdr

### STM32C8T6 控制 42 步进电机与 TB6600 驱动原理图及代码示例 #### 使用STM32C8T6控制42步进电机的硬件连接 对于采用STM32C8T6作为主控芯片来驱动42步进电机的情况,通常会通过TB6600驱动器实现电流放大功能。具体来说: - **电源部分**:确保整个电路由稳定的12V直流电源供电[^1]。 - **信号线连接**: - 将STM32C8T6的PWM输出端口分别接到TB6600对应的脉冲输入(PUL+)和方向控制(DIR+)引脚上; - 同时需注意接地(GND)处理,使所有设备共地。 - **反馈机制**(如果适用):利用编码器或其他传感器监测位置变化并返回给MCU用于闭环控制系统设计;不过此案例中并未提及使用此类组件。 ```mermaid graph LR; A[STM32C8T6] --> B[TB6600]; B --> C["42 Stepper Motor"]; D[VCC=12V] -.-> A & B; E[GND]-.-> A & B & C; F[PWM Signal] -->|PUL+| B; G[Direction Control] --> |DIR+| B; ``` #### 软件编程实例 下面给出一段简单的Arduino风格伪代码片段展示如何配置定时器生成PWM波形以及设置GPIO状态完成基本的方向切换操作。实际应用时应参照官方库函数文档调整为适合CubeMX框架下的HAL API调用方式编写程序。 ```c #include "stm32f1xx_hal.h" // 定义使用的IO口编号, 这里假设是PA0 和 PA1 分别对应 DIR 和 PULSE #define STEP_DIR_PIN GPIO_PIN_0 #define STEP_PULSE_PIN GPIO_PIN_1 #define STEP_PORT GPIOA void setup() { // 初始化TIM2定时器产生PWM输出频率设为1kHz周期不变占空比可变 __HAL_RCC_TIM2_CLK_ENABLE(); TIM_HandleTypeDef htim2; htim2.Instance = TIM2; htim2.Init.Prescaler = 71; // APB1预分频系数(72MHz/Prescaler)-1得到计数频率 htim2.Init.CounterMode = TIM_COUNTERMODE_UP; htim2.Init.Period = 999; // 自由运行模式下自动重装载寄存器值决定PWM周期长度 HAL_TIM_PWM_Init(&htim2); // 设置通道极性和死区时间等参数 TIM_OC_InitTypeDef sConfigOC; sConfigOC.OCMode = TIM_OCMODE_PWM1; sConfigOC.Pulse = 500; // 初始占空比50% sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH; HAL_TIM_PWM_ConfigChannel(&htim2,&sConfigOC,TIM_CHANNEL_1); // 开启指定通道PWM输出 HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_1); // 方向控制引脚初始化为推挽输出模式 GPIO_InitTypeDef GPIO_InitStruct = {0}; __HAL_RCC_GPIOA_CLK_ENABLE(); GPIO_InitStruct.Pin = STEP_DIR_PIN | STEP_PULSE_PIN ; GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP; GPIO_InitStruct.Pull = GPIO_NOPULL; GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; HAL_GPIO_Init(STEP_PORT, &GPIO_InitStruct); } void loop() { static uint8_t dir_flag = 0; if (dir_flag == 0){ HAL_GPIO_WritePin(STEP_PORT ,STEP_DIR_PIN ,RESET ); // 设定转动方向为转 dir_flag++; }else{ HAL_GPIO_WritePin(STEP_PORT ,STEP_DIR_PIN ,SET ); // 反之则反转 dir_flag--; } delay_ms(1000); // 每隔一秒改变一次转向 } ``` 上述代码仅作为一个基础模板供参考,在真实项目开发过程中还需要考虑更多细节比如错误保护措施、速度调节算法等等。
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dandelion701

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值