STM32——小车2个步进电机运动控制

xiaoxiao2021-02-28  115

使用STM32作为小车控制器,控制小车2个步进电机运动,PWM波频率调节小车速度,2个IO控制小车方向

头文件部分:

#ifndef __MOTORCONTROL_H #define __MOTORCONTROL_H #include "sys.h" // //电机抱闸驱动器控制程序 // //全局变量 int motion;//电机停止 int arrp, pscp;//PWM频率调节参数 float comp; void Initialization();//初始化 void Motor_IO_Init(void);//初始化GPIO口 /****************************** * * 机器人运动控制程序 * ********************************/ #define Vacuumpump PCout(11) #define MOTOR0 PCout(10) void Vacuumpumppoweron();//上电 void Vacuumpumppoweroff();//下电 /// void Brakeon();//抱闸上电 void Brakeoff();//抱闸下电 /// //左右驱动器使能函数 void poweron();//使能上电 void poweroff();//使能下电 //左驱动器DIR口控制 void dirleft1(); void dirleft0(); //右驱动器DIR口控制 void dirright1(); void dirright0(); /// void pulleft();//左驱动器PUL脉冲输出 void pulright();//右驱动器PUL脉冲输出 /// /// // void forward();//前进定义 void backward();//后退定义 void turnleft();//左转定义 void turnright();//右转定义 void stop();//停止定义 void fastVel();//电机快速 void fast();//电机快速 void middVel();//电机慢速 void slow();//电机慢速 void slowVel();//电机慢速 /// /// // //PWM脉冲产生函数 void TIM14_PWM_Init(u32 arr,u32 psc); void TIM10_PWM_Init(u32 arr,u32 psc); #endif

源文件部分:

#include "Motorcontrol.h" #include "delay.h" #include "stm32f4xx_gpio.h" #include "stm32f4xx_rcc.h" #include "usart.h" #include "stm32f4xx_tim.h" #include "misc.h" // // //初始化 void Initialization() { //全局变量 motion=0;//电机停止 Motor_IO_Init();//IO口初始化 poweron();//驱动器使能上电 Brakeoff();//下电 Vacuumpumppoweroff();//抱闸下电 //PWM频率调节参数 /************************** //系统时钟初始化SystemInit() // SystemInit(); //系统时钟等初始化 ***************************/ arrp=26880-1; pscp=0; comp=arrp/2; TIM10_PWM_Init(arrp,pscp);//步进电机最大频率最大速度 TIM14_PWM_Init(arrp,pscp); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. TIM_SetCompare1(TIM14,comp); //修改比较值,修改占空比 TIM_SetCompare1(TIM10,comp); //修改比较值,修改占空比 TIM_Cmd(TIM14, DISABLE); TIM_Cmd(TIM10, DISABLE); } //初始化GPIO口 void Motor_IO_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOC, ENABLE);//使能GPIOF时钟 //GPIOF9,F10初始化设置 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT;//普通输出模式 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;//推挽输出 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100MHz GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉 GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化 } /****************************** * *机器人运动控制程序 * ********************************/ //上电 void Vacuumpumppoweron() { GPIO_SetBits(GPIOC,GPIO_Pin_11); } //下电 void Vacuumpumppoweroff() { GPIO_ResetBits(GPIOC,GPIO_Pin_11); } // void Brakeon()//抱闸上电 { GPIO_SetBits (GPIOC,GPIO_Pin_10); } void Brakeoff()//抱闸下电 { GPIO_ResetBits(GPIOC,GPIO_Pin_10); } // //左右驱动器使能函数 //使能上电 void poweron() { GPIO_SetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7); } //使能下电 void poweroff() { GPIO_ResetBits(GPIOC,GPIO_Pin_6|GPIO_Pin_7); } /// //左驱动器DIR口控制 void dirleft1() { GPIO_SetBits(GPIOC,GPIO_Pin_9);//GPIOC9左电机驱动器DIR口置1 } void dirleft0() { GPIO_ResetBits(GPIOC,GPIO_Pin_9);//GPIOC9左电机驱动器DIR口置0 } //右驱动器DIR口控制 void dirright1() { GPIO_SetBits(GPIOC,GPIO_Pin_8);//GPIOC8右电机驱动器DIR口置1 } void dirright0() { GPIO_ResetBits(GPIOC,GPIO_Pin_8);//GPIOC8右电机驱动器DIR口置0 } /// //左驱动器PUL脉冲输出 void pulleft() { TIM_Cmd(TIM14,ENABLE);//使能脉冲 } //右驱动器PUL脉冲输出 void pulright() { TIM_Cmd(TIM10,ENABLE); //使能脉冲 } /// /// // //前进定义 void forward() { stop(); delay_ms(25); dirleft0(); dirright1();//左右电机驱动器方向DIR设置 pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } //后退定义 void backward() { stop(); delay_ms(25); dirleft1(); dirright0();//左右电机驱动器方向DIR设置 pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } //左转定义 void turnleft() { stop(); delay_ms(25); dirleft1(); dirright1();//左右电机驱动器方向DIR设置 pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } //右转定义 void turnright() { stop(); delay_ms(25); dirleft0(); dirright0();//左右电机驱动器方向DIR设置 pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } //停止定义 void stop() { //停止发脉冲,则电机停止运行 TIM_Cmd(TIM14, DISABLE); TIM_Cmd(TIM10, DISABLE); // } void fastVel()//电机快速 { //PWM频率调节参数 arrp=10752-1; pscp=0; comp=4*arrp/5; TIM10_PWM_Init(arrp,pscp);//步进电机最大频率最大速度 TIM14_PWM_Init(arrp,pscp); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. TIM_SetCompare1(TIM14,comp); //修改比较值,修改占空比 TIM_SetCompare1(TIM10,comp); //修改比较值,修改占空比 if(motion==1) { pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } } void fast() { arrp=13440-1; pscp=0; comp=4*arrp/5; TIM10_PWM_Init(arrp,pscp);//步进电机最大频率最大速度 TIM14_PWM_Init(arrp,pscp); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. TIM_SetCompare1(TIM14,comp); //修改比较值,修改占空比 TIM_SetCompare1(TIM10,comp); //修改比较值,修改占空比 if(motion==1) { pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } } void middVel() { //PWM频率调节参数 arrp=17920-1; pscp=0; comp=4*arrp/5; TIM10_PWM_Init(arrp,pscp);//步进电机最大频率最大速度 TIM14_PWM_Init(arrp,pscp); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. TIM_SetCompare1(TIM14,comp); //修改比较值,修改占空比 TIM_SetCompare1(TIM10,comp); //修改比较值,修改占空比 if(motion==1) { pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } } void slow() { //PWM频率调节参数 arrp=26880-1; pscp=0; comp=4*arrp/5; TIM10_PWM_Init(arrp,pscp);//步进电机最大频率最大速度 TIM14_PWM_Init(arrp,pscp); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. TIM_SetCompare1(TIM14,comp); //修改比较值,修改占空比 TIM_SetCompare1(TIM10,comp); //修改比较值,修改占空比 if(motion==1) { pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } } void slowVel()//电机慢速 { //PWM频率调节参数 arrp=53760-1; pscp=0; comp=4*arrp/5; TIM10_PWM_Init(arrp,pscp);//步进电机最大频率最大速度 TIM14_PWM_Init(arrp,pscp); //84M/84=1Mhz的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz. TIM_SetCompare1(TIM14,comp); //修改比较值,修改占空比 TIM_SetCompare1(TIM10,comp); //修改比较值,修改占空比 if(motion==1) { pulleft(); pulright();//左右电机驱动器PUL脉冲发送 } } /****************************** * * PWM脉冲产生函数 * ********************************/ //TIM14 PWM部分初始化 //PWM输出初始化 //arr:自动重装值 //psc:时钟预分频数 void TIM14_PWM_Init(u32 arr,u32 psc) { //此部分需手动修改IO口设置 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE); //TIM14时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); //使能PORTF时钟 GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9; //GPIOF9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOF,&GPIO_InitStructure); //初始化PF9 TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM14,&TIM_TimeBaseStructure);//初始化定时器14 //初始化TIM14 Channel1 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低 TIM_OC1Init(TIM14, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1 TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器 TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能 // TIM_Cmd(TIM14,ENABLE); //使能TIM14 //TIM_Cmd(TIM14, DISABLE); } void TIM10_PWM_Init(u32 arr,u32 psc) { //此部分需手动修改IO口设置 GPIO_InitTypeDef GPIO_InitStructure; TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM10,ENABLE); //TIM14时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTF时钟 GPIO_PinAFConfig(GPIOB,GPIO_PinSource8,GPIO_AF_TIM10); //GPIOF9复用为定时器14 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8; //GPIOF9 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //速度100MHz GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉 GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PF9 TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频 TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值 TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInit(TIM10,&TIM_TimeBaseStructure);//初始化定时器14 //初始化TIM14 Channel1 PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择定时器模式:TIM脉冲宽度调制模式2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能 TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低 TIM_OC1Init(TIM10, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1 TIM_OC1PreloadConfig(TIM10, TIM_OCPreload_Enable); //使能TIM14在CCR1上的预装载寄存器 TIM_ARRPreloadConfig(TIM10,ENABLE);//ARPE使能 // TIM_Cmd(TIM10,ENABLE); //使能TIM10 //TIM_Cmd(TIM10, DISABLE); }

转载请注明原文地址: https://www.6miu.com/read-44705.html

最新回复(0)