校园二手信息网站建设,网上交易平台,wordpress什么编辑器好用吗,网站新闻收录问题一、硬件设计
1.直流减速电机 直流减速电机#xff0c;即齿轮减速电机#xff0c;是在普通直流电机的基础上#xff0c;加上配套齿轮减速箱。齿轮减速箱的作用是#xff0c;提供较低的转速#xff0c;较大的力矩。 简单的来说#xff0c;STM32分配两个IO口给一个…一、硬件设计
1.直流减速电机 直流减速电机即齿轮减速电机是在普通直流电机的基础上加上配套齿轮减速箱。齿轮减速箱的作用是提供较低的转速较大的力矩。 简单的来说STM32分配两个IO口给一个直流减速电机并给予高低电平来使得电机进行正转或反转。 我用的电机为GM25-370直流减速电机带霍尔编码器工作电压6-24VDC额定电压12V额定电流0.65A空载转速350RPM额定功率5W最大精度1496CPR配备 CPR霍尔AB两相编码器减速后输出单圈374个正交脉冲。 2.TB6612FNG电机驱动芯片 要实现小车的转向与前进后退控制我们可以使用STM32实现但是STM32的IO口带负载能力较弱而直流电机是大电流感性负载所以我们需要功率放大器件在这里我选择使用TB6612FNG这款电机驱动芯片。 TB6612FNG 是东芝半导体公司生产的一款直流电机驱动器件它具有大电流MOSFET-H 桥结构双通道电路输出可同时驱动 2 个电机。相比于 L298N的热耗性和外围二极管续流电路TB6612FNG无需外加散热片外围电路简单只需外接电源滤波电容就可以直接驱动电机利于减小系统尺寸。对于PWM信号输入频率范围我采用10KHz的频率并通过改变占空比调节电机的速度。
平衡小车中使用到的引脚 电机1——PB12/PB13 电机2——PB14/PB15 PWM1——PA8 PWM2——PA11 3.H桥驱动电路 上面说到TB6612FNG 具有大电流MOSFET-H桥结构那么很多小伙伴想问什么是H桥结构呢我以下面两张图举例帮助大家简单化理解H桥电路结构。 注图中的电路Q1,Q2,Q3,Q4为三极管而TB6612内部集成的是四个MOSFET我以下图举例大家不可把下图看做是TB6612内部电路其内部电路可查看TB6612的参考手册。
① 当Q1,Q4导通Q2,Q3关断时电流从Q1,从电机正极通过电机负极再从Q4流出完成一条回路电机Motor正转。 ① 当Q2,Q3导通Q1,Q4关断时电流从Q3,从电机负极通过电机正极再从Q2流出完成一条回路电机Motor反转。 二、软件编程
1.电机驱动函数——motor.c1电机GPIO初始化函数 入口参数无
初始化GPIO–PB12、PB13、PB14、PB15为推挽输出
void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 开启时钟GPIO_InitStruct.GPIO_ModeGPIO_Mode_Out_PP;// 初始化GPIO--PB12、PB13、PB14、PB15为推挽输出GPIO_InitStruct.GPIO_PinGPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOB,GPIO_InitStruct);
}2限幅函数 入口参数电机A脉冲个数电机B脉冲个数
限制电机的脉冲个数在规定范围内有个最值即自动重装载值我设置的是PWM_MAX 7200PWM_MIN -7200
void Limit(int *motoA,int *motoB)
{if(*motoAPWM_MAX)*motoAPWM_MAX;if(*motoAPWM_MIN)*motoAPWM_MIN;if(*motoBPWM_MAX)*motoBPWM_MAX;if(*motoBPWM_MIN)*motoBPWM_MIN;
}3绝对值函数非常通用建议保存!! 入口参数常规变量
通过与0比较大于0则返回不变的值小于0则返回相反的值。
int abs(int p)
{int q;qp0?p:(-p);return q;
}4赋值函数 入口参数电机A脉冲个数电机B脉冲个数
入口参数即为PID运算完成后的最终PWM值后续会讲解PID算法的实现
void Load(int moto1,int moto2)
{//1.研究正负号对应正反转if(moto10) Ain11,Ain20;//正转else Ain10,Ain21;//反转//2.研究PWM值TIM_SetCompare1(TIM1,abs(moto1));//1.研究正负号对应正反转if(moto20)Bin11,Bin20;else Bin10,Bin21; //2.研究PWM值TIM_SetCompare4(TIM1,abs(moto2));
}2.电机驱动函数头文件——motor.h
#ifndef _MOTOR_H
#define _MOTOR_H#include sys.h #define Ain1 PBout(14)
#define Ain2 PBout(15)#define Bin1 PBout(13)
#define Bin2 PBout(12)void Motor_Init(void);
void Limit(int *motoA,int *motoB);
int abs(int p);
void Load(int moto1,int moto2);
#endif3.PWM函数——pwm.c
1. 定时器初始化函数 入口参数预分频值自动重装载值
PA8,PA11复用推挽输出对应定时器1通道1和通道4开启MOE主输出使能高级定时器特有!!!
void PWM_Init_TIM1(u16 Psc,u16 Per)
{GPIO_InitTypeDef GPIO_InitStruct;TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;TIM_OCInitTypeDef TIM_OCInitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_TIM1 | RCC_APB2Periph_AFIO,ENABLE);//开启时钟GPIO_InitStruct.GPIO_ModeGPIO_Mode_AF_PP; // 初始化GPIO--PA8、PA11为复用推挽输出GPIO_InitStruct.GPIO_PinGPIO_Pin_8 | GPIO_Pin_11;GPIO_InitStruct.GPIO_SpeedGPIO_Speed_50MHz;GPIO_Init(GPIOA,GPIO_InitStruct);TIM_TimeBaseStructInit(TIM_TimeBaseInitStruct); // 初始化定时器。TIM_TimeBaseInitStruct.TIM_ClockDivisionTIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterModeTIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_PeriodPer;TIM_TimeBaseInitStruct.TIM_PrescalerPsc;TIM_TimeBaseInit(TIM1,TIM_TimeBaseInitStruct); // TIM1TIM_OCInitStruct.TIM_OCModeTIM_OCMode_PWM1; // 初始化输出比较TIM_OCInitStruct.TIM_OCPolarityTIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputStateTIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse0;TIM_OC1Init(TIM1,TIM_OCInitStruct);TIM_OC4Init(TIM1,TIM_OCInitStruct);TIM_CtrlPWMOutputs(TIM1,ENABLE);// 高级定时器专属!!!--MOE主输出使能TIM_OC1PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC1预装载寄存器使能TIM_OC4PreloadConfig(TIM1,TIM_OCPreload_Enable);// OC4预装载寄存器使能TIM_ARRPreloadConfig(TIM1,ENABLE);// TIM1在ARR上预装载寄存器使能TIM_Cmd(TIM1,ENABLE); // 开定时器。
}4.PWM函数头文件——pwm.h
#ifndef _PWM_H
#define _PWM_H#include sys.h void PWM_Init_TIM1(u16 Psc,u16 Per);
#endif
以上就是平衡小车系列文章第二讲——电机驱动包括硬件结构讲解和STM32软件编程的讲解文章中出现错误或者小伙伴对以上内容有所疑问欢迎大家在评论区留言小政看到后会尽快回复大家