历史上的今天
今天是:2024年09月25日(星期三)
2019年09月25日 | stm32-A4988驱动步进电机
2019-09-25 来源:eefocus
步进电机,不多做解释,百度一大堆,虽然写的都一样。
1.步进电机用的2相四线,下面是某淘宝图片。

2.驱动器是A4988模块,据说是3d打印机专用。
灰色的脚可以悬空,也可以用上。
ENABLE 使能 1停止
STEP pwm(50%) 控制速度 (频率范围:我试了下大概1Hz-1KHz都可以跑的,当然频率越慢,电机相当于静止状态)
DIR 控制方向
2B -> B+ (这里网上没怎么说清楚,只说了什么红绿蓝,鬼知道?)
1B -> B-
2A -> A+
1A -> A-
基本重要的就是这些,分步控制就是MS1 MS2 MS3,看后面。接线参考下面。


连线根据上面一个没有什么问题,下面直接上代码吧。stm32 通过tim3 ch1输出pwm,也就是PA6
void PWM1_Init()
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB , ENABLE); //使能GPIO外设时钟使能
//设置该引脚为复用输出功能,输出TIM1 CH1的PWM脉冲波形
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6 ; //TIM_CH1
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
TIM_TimeBaseStructure.TIM_Period = 999; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler =71; //设置用来作为TIMx时钟频率除数的预分频值 不分频
TIM_TimeBaseStructure.TIM_ClockDivision =0; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//TIM3通道一
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_Pulse = 60; /*占空长度 0 – 周期(max)*/
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OC1Init(TIM3, &TIM_OCInitStructure); //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
TIM_CtrlPWMOutputs(TIM3,ENABLE); //MOE 主输出使能
TIM_ARRPreloadConfig(TIM3, ENABLE); //使能TIMx在ARR上的预装载寄存器
TIM_Cmd(TIM3, ENABLE); //使能TIM1
}
void set_freq(u16 freq)
{
TIM3->ARR=1000000/freq; //设频率
TIM3->CCR1=1000000/freq/2; //设占空比 50%
}
初始化就不介绍了,就是设置成不分频,计数频率最大为1M,
set_freq函数就是设置频率,范围1-1000000对应1Hz-1MHz,这里是理论值,实际上我的步进电机2KHz好像就跑不起来了。
所以我认为1-2000的就够了,注意电机刚起的时不能太高的频率,一般低于500Hz没有问题。
史海拾趣
|
我在linux下开发短信,使用开源的smstools来开发。 使用pdu模式时,发现对英语与数字可以很简单地实现。 但使用中文信息时,发现移动发过来的pdu报文解不正确。 如报文:测试 =“6D4B8BD5” 将两位一组转换为16进制数值,再转换为无符号字符。 ...… 查看全部问答> |
|
void serial() interrupt 4 using 1 { while(TI) { TI=0; } while(RI) { RI=0; SBUF=xx; } } 请问在这种情况下,SBUF=xx能执行吗?如果能, ...… 查看全部问答> |
|
哪位老大帮帮忙,因为有几个接口和JTAG重了,所以我在程序中加了GPIO_PinRemapConfig(GPIO_Remap_SWJ_Disable, ENA ...… 查看全部问答> |
|
最近再使用STM8S207RB进行开发,以下是自己使用cosmic时遇到的一些常见问题: 1.printf/sprintf入口参数必须是u16类型,否则打印结果不正确,很奇怪 2.u32位类型的判断if ((val%0x1000) == 0)此判断前必须强制转换,即 if ((u ...… 查看全部问答> |
|
这几天焊了一批电路板,其中有几块在调试一段时间后莫名其妙的就给烧了,其中有两块明显的起火了,拆下来后有表测量,有的是××cc和GND短路,有的是Dvcc和GND短路了。自我感觉不会犯一些低级的错误,但就是想不通怎么会烧了,请大家帮忙想想,我这 ...… 查看全部问答> |




