博主使用stm32(mini)作为控制器,驱动器选择了以3086A-MFP10S为芯片的模块,电机为42步进电机(连导轨)。
驱动器链接:https://item.taobao.com/item.htm?spm=a21bo.2017.1997525049.9.5af911d9SHxll6&id=13122246267
步进电机/导轨:https://item.taobao.com/item.htm?spm=2013.1.1997525049.6.c0af2676UvcVCG&id=593133358835
滑台参数:
有效行程:150mm、200mm、250mm、300mm 可选。
滑台总长:(有效行程+75mm)42mm40mm (长宽高 不含电机)。
驱动电压:5-12V / 500mA-2A。
电机尺寸:424225mm。
步 距 角:1.8° 。(电机转一圈需要200个脉冲(360/1.8))
不过这家店不能开发票,当时看这家店东西全,我们时间也比较紧就买了这家店。驱动板 16元还是划算的,导轨若是步进电机可以在其他店看看,都差不多。
时序与引脚
具体芯片资料:https://download.csdn.net/download/qq_45539458/13729678
实际的In1In2波形,原理大概就是其中一个脉冲要比另一个慢一拍。In1In2互换一下就能实现正反转。
步进电机具体原理可以参考http://www.elecfans.com/zt/452/
具体实现:
57Hz大概17ms一周期,快一点,有响声。
选择32ms一周期,慢一点,稍微流畅一点。
随便选了两个独立io做为in12的输入:PB0 PB2
main.c
#include "delay.h"
#include "sys.h"
void Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //使能端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1; // 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOB, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_SetBits(GPIOB,GPIO_Pin_0); //输出高
}
int main(void){
int i;
delay_init(); //延时函数初始化
Init();
GPIO_SetBits(GPIOB,GPIO_Pin_0);
while(1) {
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
delay_ms(8);
for(i=0;i<1000;i++)
{
GPIO_SetBits(GPIOB,GPIO_Pin_1);
delay_ms(8);
GPIO_SetBits(GPIOB,GPIO_Pin_0);
delay_ms(8);
GPIO_ResetBits(GPIOB,GPIO_Pin_1);
delay_ms(8);
GPIO_ResetBits(GPIOB,GPIO_Pin_0);
delay_ms(8);
}
}
}