今天到了一个模组,老师喊把步进电机先转起来,之前也没用过步进电机,只用过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