第一次拿到STM32C8T6和DM542驱动器时,我也是一头雾水。这套组合其实非常适合新手入门,成本低但功能强大。先说说硬件选择,STM32C8T6作为主控芯片,价格亲民且性能足够,而DM542驱动器则是市面上最常见的步进电机驱动器之一,支持2相步进电机,最大电流可达4.2A。
电源选择是个容易踩坑的地方。我最初用24V电池供电,发现电机转动不稳定,后来改用220V转24V的开关电源就稳定多了。建议选择功率在100W以上的电源,确保有足够的电流余量。驱动器上有6个关键接口,采用共阴极接法最方便:
特别注意单片机与驱动器必须共地!我第一次调试时忘了共地,电机完全没反应,排查了半天才发现问题。可以用万用表测量STM32的GND和驱动器的GND是否导通。
要让电机转起来,PWM脉冲是关键。STM32的定时器功能很强大,我们使用TIM3来生成PWM。配置过程看似复杂,其实分几步走:
首先是GPIO初始化,PB0需要配置为复用推挽输出:
c复制GPIO_InitStrue.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStrue.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStrue.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStrue);
然后是定时器基础配置,这里arr=999,psc=71,对应72MHz/(999+1)/(71+1)=1kHz频率:
c复制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);
PWM模式选择PWM2,输出极性低电平有效:
c复制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);
最后设置占空比,400对应40%占空比:
c复制TIM_SetCompare3(TIM3, 400);
方向控制比想象中简单,只需要一个GPIO引脚就能搞定。PB1配置为普通推挽输出:
c复制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);
正反转函数非常简单:
c复制void Motor_X_ZHENG() // 正转
{
GPIO_ResetBits(GPIOB, GPIO_Pin_1);
}
void Motor_X_FAN() // 反转
{
GPIO_SetBits(GPIOB, GPIO_Pin_1);
}
实际测试发现,方向切换时最好加个短暂延时,我一般加10ms左右,避免电平变化与PWM脉冲边沿重合导致误动作。
把各个模块组合起来后,主函数结构很清晰:
c复制int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
delay_init();
TIM3_PWM_Init(999, 71);
Motor_X();
while(1)
{
Motor_X_ZHENG(); // 或Motor_X_FAN()
delay_ms(1000);
TIM_SetCompare3(TIM3, 400); // 调整这个值改变转速
}
}
调试时常见问题:
建议先用示波器观察PB0的PWM波形,确认频率和占空比正确后再接驱动器。如果没示波器,可以用LED串联电阻接PB0,肉眼观察亮度变化。