以输出一路pwm为例:
void STEP_MOTO_GPIO_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
/*开启GPIOB和GPIOC的外设时钟*/
RCC_APB2PeriphClockCmd(Moto_RCC1 | Moto_RCC2, ENABLE);
/*选择要控制的GPIOB引脚*/
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;
/*设置引脚模式为通用推挽输出*/
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
/*设置引脚速率为50MHz */
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
/*调用库函数,初始化GPIOB*/
GPIO_Init(Moto_Port1, &GPIO_InitStructure);
/* 高电平 */
GPIO_SetBits(Moto_Port1, GPIO_Pin_12 | GPIO_Pin_13);
}
2.初始化定时器以及输出pwm的io口PB9:
void TIM4_PWM_Init(u16 arr,u16 psc)
{
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
//初始化TIM4
TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
TIM_TimeBaseStructure.TIM_Prescaler = psc; //设置用来作为TIMx时钟频率除数的预分频值
TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //设置时钟分割:TDTS = Tck_tim
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式
TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位
//PWMB PB9
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE); //使能定时器4时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE); //使能GPIO外设和AFIO复用功能模块时钟
//设置该引脚为复用输出功能,输出TIM4 CH4的PWM脉冲波形 GPIOB.9
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //TIM4_CH4
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);//初始化GPIO
//初始化TIM4 Channel4 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
TIM_OCInitStructure.TIM_Pulse = 0;
TIM_OC4Init(TIM4, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM4 OC2
TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM4在CCR2上的预装载寄存器
TIM_Cmd(TIM4, ENABLE); //使能TIM4
}
/*具体控制电机的功能使用*/
#include "moto.h"
#include "step_moto.h"
#define Updown_Moto_Left_UP() {GPIO_SetBits(Moto_Port1, Updown_Moto_Left_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Left_ENA);}
#define Updown_Moto_Left_DOWM() {GPIO_ResetBits(Moto_Port1, Updown_Moto_Left_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Left_ENA);}
#define Updown_Moto_Left_STOP() {GPIO_SetBits(Moto_Port1, Updown_Moto_Left_ENA);}
#define Updown_Moto_Right_UP() {GPIO_SetBits(Moto_Port1, Updown_Moto_Right_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Right_ENA);}
#define Updown_Moto_Right_DOWM() {GPIO_ResetBits(Moto_Port1, Updown_Moto_Right_DIR); GPIO_ResetBits(Moto_Port1, Updown_Moto_Right_ENA);}
#define Updown_Moto_Rightt_STOP() {GPIO_SetBits(Moto_Port1, Updown_Moto_Right_ENA);}
#define Moto_PWM_SET_Updown_Moto_LEFT() {TIM_SetCompare4(TIM4,5000);}
#define Moto_PWM_SET_Updown_Moto_RIGHT() {TIM_SetCompare2(TIM2, 5000);}
#define Moto_PWM_REMOVE() {TIM_SetCompare4(TIM4, 0);TIM_SetCompare2(TIM2, 0);TIM_SetCompare3(TIM2, 0);TIM_SetCompare4(TIM2, 0);}
/*左右同步电机的运动*/
void Updown_Moto_UP(void)
{
Updown_Moto_Left_UP();
Updown_Moto_Right_UP();
Moto_PWM_SET_Updown_Moto_LEFT();
Moto_PWM_SET_Updown_Moto_RIGHT();
}
void Updown_Moto_DOWN(void)
{
Updown_Moto_Left_DOWM();
Updown_Moto_Right_DOWM();
Moto_PWM_SET_Updown_Moto_LEFT();
Moto_PWM_SET_Updown_Moto_RIGHT();
}
void Updown_Moto_STOP(void)
{
Updown_Moto_Left_STOP();
Updown_Moto_Rightt_STOP();
Moto_PWM_REMOVE();
}
通过调节在下一个更新事件装入活动的自动重装载寄存器周期的值来设置步进电机的转速:
void pwm_init(void)
{
delay_init();
STEP_MOTO_GPIO_Init();
TIM2_PWM_Init(15000,0);//不分频。PWM频率为7200000000/15000=4800hz //一秒转6圈
TIM4_PWM_Init(5625,0);//不分频。PWM频率为7200000000/5625=12800hz //一秒转16圈
}
int main(void)
{
pwm_init();
while(1)
{
//Updown_Moto_UP();//丝杆往上
Updown_Moto_DOWN();//丝杆往下
//Updown_Moto_STOP();//丝杆停止
}
return 0;
}
源程序附上:https://download.csdn.net/download/weixin_39589455/10972985
具体的接线后面更新