公司網(wǎng)站建設應注意什么seo技術網(wǎng)網(wǎng)
一、硬件設計
1.直流減速電機
??直流減速電機,即齒輪減速電機,是在普通直流電機的基礎上,加上配套齒輪減速箱。齒輪減速箱的作用是,提供較低的轉(zhuǎn)速,較大的力矩。
??簡單的來說,STM32分配兩個IO口給一個直流減速電機,并給予高低電平,來使得電機進行正轉(zhuǎn)或反轉(zhuǎn)。
我用的電機為GM25-370直流減速電機(帶霍爾編碼器),工作電壓:6-24VDC,額定電壓12V,額定電流0.65A,空載轉(zhuǎn)速350RPM,額定功率5W,最大精度,1496CPR,配備 CPR霍爾AB兩相編碼器,減速后輸出單圈374個正交脈沖。
2.TB6612FNG電機驅(qū)動芯片
????????要實現(xiàn)小車的轉(zhuǎn)向與前進后退控制,我們可以使用STM32實現(xiàn),但是STM32的IO口帶負載能力較弱,而直流電機是大電流感性負載,所以我們需要功率放大器件,在這里,我選擇使用TB6612FNG這款電機驅(qū)動芯片。
??TB6612FNG 是東芝半導體公司生產(chǎn)的一款直流電機驅(qū)動器件,它具有大電流MOSFET-H 橋結構,雙通道電路輸出,可同時驅(qū)動 2 個電機。相比于 L298N的熱耗性和外圍二極管續(xù)流電路,TB6612FNG無需外加散熱片,外圍電路簡單,只需外接電源濾波電容就可以直接驅(qū)動電機,利于減小系統(tǒng)尺寸。對于PWM信號輸入頻率范圍,我采用10KHz的頻率,并通過改變占空比調(diào)節(jié)電機的速度。
平衡小車中使用到的引腳:
??電機1——PB12/PB13
??電機2——PB14/PB15
??PWM1——PA8
??PWM2——PA11
?
3.H橋驅(qū)動電路
????????上面說到TB6612FNG 具有大電流MOSFET-H橋結構,那么很多小伙伴想問:什么是H橋結構呢?我以下面兩張圖舉例,幫助大家簡單化理解H橋電路結構。
注:圖中的電路Q1,Q2,Q3,Q4為三極管,而TB6612內(nèi)部集成的是四個MOSFET,我以下圖舉例,大家不可把下圖看做是TB6612內(nèi)部電路,其內(nèi)部電路可查看TB6612的參考手冊。
?
① 當Q1,Q4導通,Q2,Q3關斷時,電流從Q1,從電機正極通過電機負極,再從Q4流出,完成一條回路,電機Motor正轉(zhuǎn)。
?① 當Q2,Q3導通,Q1,Q4關斷時,電流從Q3,從電機負極通過電機正極,再從Q2流出,完成一條回路,電機Motor反轉(zhuǎn)。
二、軟件編程
1.電機驅(qū)動函數(shù)——motor.c
1)電機GPIO初始化函數(shù)
?入口參數(shù):無
- 初始化GPIO–PB12、PB13、PB14、PB15為推挽輸出
void Motor_Init(void)
{GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);// 開啟時鐘GPIO_InitStruct.GPIO_Mode=GPIO_Mode_Out_PP;// 初始化GPIO--PB12、PB13、PB14、PB15為推挽輸出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_12 | GPIO_Pin_13 | GPIO_Pin_14 | GPIO_Pin_15;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOB,&GPIO_InitStruct);
}
2)限幅函數(shù)
?入口參數(shù):電機A脈沖個數(shù),電機B脈沖個數(shù)
- 限制電機的脈沖個數(shù)在規(guī)定范圍內(nèi),有個最值,即自動重裝載值(我設置的是PWM_MAX = 7200,PWM_MIN = -7200)
void Limit(int *motoA,int *motoB)
{if(*motoA>PWM_MAX)*motoA=PWM_MAX;if(*motoA<PWM_MIN)*motoA=PWM_MIN;if(*motoB>PWM_MAX)*motoB=PWM_MAX;if(*motoB<PWM_MIN)*motoB=PWM_MIN;
}
?3)絕對值函數(shù)(非常通用,建議保存!!)
?入口參數(shù):常規(guī)變量
- 通過與0比較,大于0則返回不變的值,小于0則返回相反的值。
int abs(int p)
{int q;q=p>0?p:(-p);return q;
}
4)賦值函數(shù)
?入口參數(shù):電機A脈沖個數(shù),電機B脈沖個數(shù)
- 入口參數(shù)即為PID運算完成后的最終PWM值(后續(xù)會講解PID算法的實現(xiàn))
void Load(int moto1,int moto2)
{//1.研究正負號,對應正反轉(zhuǎn)if(moto1>0) Ain1=1,Ain2=0;//正轉(zhuǎn)else Ain1=0,Ain2=1;//反轉(zhuǎn)//2.研究PWM值TIM_SetCompare1(TIM1,abs(moto1));//1.研究正負號,對應正反轉(zhuǎn)if(moto2>0)Bin1=1,Bin2=0;else Bin1=0,Bin2=1; //2.研究PWM值TIM_SetCompare4(TIM1,abs(moto2));
}
2.電機驅(qū)動函數(shù)頭文件——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);
#endif
3.PWM函數(shù)——pwm.c
1. 定時器初始化函數(shù)
?入口參數(shù):預分頻值,自動重裝載值
- 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_Mode=GPIO_Mode_AF_PP; // 初始化GPIO--PA8、PA11為復用推挽輸出GPIO_InitStruct.GPIO_Pin=GPIO_Pin_8 | GPIO_Pin_11;GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStruct);TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct); // 初始化定時器。TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up;TIM_TimeBaseInitStruct.TIM_Period=Per;TIM_TimeBaseInitStruct.TIM_Prescaler=Psc;TIM_TimeBaseInit(TIM1,&TIM_TimeBaseInitStruct); // TIM1TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1; // 初始化輸出比較TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_High;TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;TIM_OCInitStruct.TIM_Pulse=0;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函數(shù)頭文件——pwm.h
#ifndef _PWM_H
#define _PWM_H#include "sys.h" void PWM_Init_TIM1(u16 Psc,u16 Per);
#endif
以上就是平衡小車系列文章第二講——電機驅(qū)動,包括硬件結構講解和STM32軟件編程的講解,文章中出現(xiàn)錯誤或者小伙伴對以上內(nèi)容有所疑問,歡迎大家在評論區(qū)留言,小政看到后會盡快回復大家!