版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第第頁無刷電機(jī)小車開發(fā)記錄—移植SimpleFOC流程
前情提要
今天過來繼續(xù)擼我的(無刷電機(jī))小車。驅(qū)動(dòng)無刷電機(jī)底層需要實(shí)現(xiàn)三大部分:功率驅(qū)動(dòng),位置反饋以及(電流)反饋。前面我已經(jīng)適配了功率驅(qū)動(dòng)(6線互補(bǔ)PWM),和位置反饋(PWM(接口))的底層驅(qū)動(dòng)代碼。
而電流反饋我電路使用的是線內(nèi)探測方案,輸出(模擬)電壓值。驅(qū)動(dòng)程序可暫時(shí)使用RTT的(ADC)底層驅(qū)動(dòng)。
相關(guān)(硬件)電路
功率(驅(qū)動(dòng)電路)和位置反饋的磁編碼器(芯片),前面文章給出過簡介。這里我給出最后一塊電路檢測相關(guān)的電路:
這里我只(檢測)了A,B兩相的相電流,第三項(xiàng)電流可由電流和為零(基爾霍夫第一定律)計(jì)算得到。
其中R45和R49為線內(nèi)采樣(電阻),壓差經(jīng)過LT199G1運(yùn)放放大后輸出。LT199G1的放大倍數(shù)是50,由于后面(MCU)的(AD)C只能檢測0~3.3V的正電壓(信號(hào)),所以這里加了個(gè)1.5V偏置。
可檢測最大電流I=1.5V/50/0.01R=3A。對(duì)于我的這個(gè)小電機(jī)來說足夠了,甚至后面可能還需要根據(jù)測試結(jié)果適當(dāng)增大采樣電阻阻值。
移植(Sim)pleFOC
萬事俱備只欠東風(fēng),到了驅(qū)動(dòng)無刷電機(jī)最關(guān)鍵的時(shí)刻了,就是移植FOC(算法)。目前(網(wǎng)絡(luò))上可以看到的FOC算法很多,雖然我也沒有過多的接觸,但感覺核心算法基本一致,無非就是外圍做了一些優(yōu)化,變形。所以我這里選擇了比較簡單的SimpleFOC進(jìn)行移植。后面可以根據(jù)自己的測試自行優(yōu)化。
FOC的原理我這里暫時(shí)不提及,網(wǎng)絡(luò)上可以找到包括稚暉君在內(nèi)的很多大佬的(科普)文章,也肯定比我講解的好,可自行查閱。如果有需要,我這里后面再另外補(bǔ)充一篇算法講解篇。這里只簡單提及移植過程。
下面給出SimpleFOC的官網(wǎng)鏈接,更多詳情可參考官網(wǎng)(教程)。如果完全按照官網(wǎng)提供的電路搭建平臺(tái),甚至可以不用管任何算法相關(guān)的內(nèi)容,直接驅(qū)動(dòng)無刷電機(jī)。如果完全以實(shí)現(xiàn)功能為目的,建議采用此途徑。
找到(Arduino)-FOC倉庫,克隆或者直接點(diǎn)擊“DownloadZIP”按鈕(下載)源代碼。
目錄結(jié)構(gòu)
解壓源代碼,可先簡單了解一下目錄結(jié)構(gòu),根目錄下主要有兩個(gè)文件夾,一個(gè)examples,內(nèi)部是基于Arduino的例程。另外一個(gè)是最主要的src源代碼目錄。
例程文件后面用到的時(shí)候再說,這里先看src下的目錄文件:
沒錯(cuò),這里可以看到,SimpleFOC是基于(C++)的?;贑++面向?qū)ο蟮奶匦裕梢园颜麄€(gè)結(jié)構(gòu)封裝的更好,也可以使用一些C++的高級(jí)語法。
其中“common”目錄下除了公用的(PI)D和低通濾波相關(guān)代碼外,還包括了驅(qū)動(dòng),電流(傳感器),位置傳感器的抽象類,包含了各傳感器的公共屬性。而外面的”drivers”,”current_sense”,”sens(or)s”目錄下封裝了面向各實(shí)際方案的不同子類。
common目錄內(nèi)容:
common/base_classes目錄內(nèi)容:
比如src/drivers目錄下就包含了3線PWM的(BLDC)(電機(jī))驅(qū)動(dòng)和6線PWM的BLDC電機(jī)驅(qū)動(dòng),以及幾個(gè)(步進(jìn)電機(jī))的驅(qū)動(dòng)類,他們都繼承與BLDCDriver類,然后各自實(shí)現(xiàn)各自獨(dú)有的屬性功能。
而子類目錄下的hardware_specif(ic)文件夾內(nèi),包含的是面向不同硬件平臺(tái)的驅(qū)動(dòng)接口,也是直接適配新的MCU硬件平臺(tái)的時(shí)候需要適配的代碼。
為什么要說直接適配呢?是因?yàn)槿绻皇亲鲭姍C(jī)驅(qū)動(dòng)板,完全可以使用SimpleFOC的軟件框架,把MCU等其它的相關(guān)驅(qū)動(dòng)代碼通過接口封裝進(jìn)來。而我這里顯然不屬于這種直接適配。我這里是想把SimpleFOC移植到(RTThread)的框架下,后面還想借助RTThread做其它功能。
SimpleFOC源碼加入RTT目錄
最后這個(gè)SimpleFOC想以一個(gè)功能包的形式嵌入到RTThread系統(tǒng)內(nèi),可以像RTThread已有的功能包一樣,通過UI或者menuconfig進(jìn)行配置。所以,在./packages目錄下創(chuàng)建SimpleFOC目錄,然后把SimpleFOC源碼包內(nèi)的src文件夾拷貝進(jìn)來:
添加SConscript文件
上面的操作只是在文件系統(tǒng)內(nèi)加入了代碼包,要想讓RTT編譯加入的代碼,還需要添加并修改SConscript構(gòu)建文件。./packages/SimpleFOC目錄下的SConscript文件比較簡單,直接把./packages目錄下的拷貝一份即可:
拷貝到./packages/SimpleFOC目錄下的SConscript文件內(nèi)容如下,主要是起到承接作用,讓scons構(gòu)建工具去子目錄內(nèi)繼續(xù)查找SConscript文件。
importos
frombuildingimport*
objs=[]
cwd=GetCurrentDir()
list=os.listdir(cwd)
fori(te)minlist:
ifos.path.isfile(os.path.join(cwd,item,'SConscript')):
objs=objs+SConscript(os.path.join(item,'SConscript'))
Return('objs')
/packages/SimpleFOC/src目錄內(nèi)的SConscript文件稍復(fù)雜。我這里使用的這級(jí)SConscript文件管理整個(gè)源碼包的構(gòu)建。
最主要的是SOURCES的源碼添加和CPPPATH的頭文件目錄的定義。語法說明請(qǐng)參見(python)以及RTT官網(wǎng)相關(guān)教程文檔。
...
SOURCES=["BLDCMotor.c","common/foc_u(ti)ls.c","common/base_classes/FOCMotor.c"]
SOURCES+=["common/base_classes/CurrentSense.c"]
SOURCES+=["common/base_classes/Sensor.c"]
SOURCES+=["common/lowpass_filter.c"]
SOURCES+=["common/pid.c"]
SOURCES+=["common/time_utils.c"]
SOURCES+=["sensors/MagneticSensorPWM.c"]
ifGetDepend(['RT_USING_SIMPLEFOC_DRV_6PWM']):
SOURCES+=['drivers/BLDCDriver6PWM.c']
ifGetDepend(['RT_USING_SIMPLEFOC_CURRENT_SENSE_INLINE']):
SOURCES+=['current_sense/InlineCurrentSense.c']
...
...
CPPPATH=[CWD,os.path.join(GetCurrentDir(),'inc'),CWD+'/common',CWD+'/common/base_classes',CWD+'/sensors',CWD+'/drivers']
CPPPATH+=[CWD+'/current_sense']
...
修改Kconfig文件
功能包的添加在/board/Kconfig文件內(nèi)。如下是我在”BoardextendedmoduleDrivers”菜單下加入的SimpleFOC的相關(guān)配置:
menu"BoardextendedmoduleDrivers"
menuconfigPKG_USING_SIMPLEFOC
bool"EnableSIMPLE_FOCmodule"
defaultn
selectRT_USING_SIMPLEFOC
ifPKG_USING_SIMPLEFOC
configSIMPLE_FOC_VOLTAGE_POWER_SUPPLY
int"voltagepowersupply"
default12
choice
prompt"Selectdriverstype"
defaultRT_USING_SIMPLEFOC_DRV_6PWM
configRT_USING_SIMPLEFOC_DRV_6PWM
bool"USING6PWMMODEDRIVER"
configRT_USING_SIMPLEFOC_DRV_3PWM
bool"USING3PWMMODEDRIVER"
en(dc)hoice
choice
prompt"Selectcurrentsensestype"
defaultRT_USING_SIMPLEFOC_CURRENT_SENSE_INLINE
configRT_USING_SIMPLEFOC_CURRENT_SENSE_INLINE
bool"USINGINLINEMODECURRENTSENSE"
configRT_USING_SIMPLEFOC_CURRENT_SENSE_LOWSIDE
bool"USINGLOWSIDEMODECURRENTSENSE"
endchoice
endif
endmenu
把相關(guān)的.cpp文件修改為.c文件
這里只是先修改文件類型,讓構(gòu)建文件能找到相關(guān)文件,具體內(nèi)容后面在修改。比如./packages/SimpleFOC/src/common目錄內(nèi)的相關(guān)文件:
使用UI工具配置RTT
完成了以上修改既可以配置RTThread系統(tǒng),把需要的代碼真正添加進(jìn)來了。
我這里添加進(jìn)來的所有文件列表如下:
用C代碼實(shí)現(xiàn)原有C++代碼的功能
這里是比較耗費(fèi)時(shí)間的,要用(C語言)的語法,實(shí)現(xiàn)類似C++的繼承以及函數(shù)重載的功能。大體思路就是繼承使用結(jié)構(gòu)體包含的方式實(shí)現(xiàn),函數(shù)重載就是用函數(shù)指針的方式鏈接子類(只是類的概念)的實(shí)現(xiàn)函數(shù)到父類內(nèi)。具體的可參加我開源的源代碼。
功能測試
開環(huán)控制
源碼包的/examples/motion_control目錄下有一些控制例程,我這里暫時(shí)測試了開環(huán)控制和速度閉環(huán)控制,開環(huán)控制不用關(guān)聯(lián)位置傳感器和電流傳感器,只實(shí)現(xiàn)(驅(qū)動(dòng)器)相關(guān)的代碼即可:
測試代碼如下,如果上面的流程沒有出錯(cuò),這里即可看到電機(jī)可以正常轉(zhuǎn)起來了,只不過是開環(huán)的旋轉(zhuǎn)效果不是很好,盡量不要測試太久,當(dāng)心電機(jī)發(fā)熱嚴(yán)重。
BLDCMotorMotor_left;
BLDCDriver6PWMMotor_left_driver;
floattarget_velocity=6.28;
voidmotor_test_timeout(void*pa(ram)eter)
{
Motor_left.foc_motor.ops.move(
}
intmain(void)
{
rt_timer_tmotor_tm;
...
BLDCMotor_set_default(
BLDCDriver6PWM_set_default(
Motor_left_driver.bldc_driver.voltage_power_supply=8;
Motor_left_driver.bldc_driver.voltage_limit=8;
Motor_left_driver.bldc_driver.ops.init(
Motor_left.linkDriver(
Motor_left.foc_motor.voltage_limit=4;
Motor_left.foc_motor.velocity_limit=50;
Motor_left.foc_motor.controller=velocity_openloop;
Motor_left.foc_motor.ops.init(
motor_tm=rt_timer_create("motor_test_tm",motor_test_timeout,
if(motor_tm!=RT_NULL)
rt_timer_start(motor_tm);
...
}
閉環(huán)控制
上面的開環(huán)測試可以正常旋轉(zhuǎn)就說明電路沒有問題,就可以測試閉環(huán)控制效果了,代碼如下:
BLDCMotorMotor_left;
BLDCDriver6PWMMotor_left_driver;
MagneticSensorPWMsensor_pwm;
InlineCurrentSensecurrent_sense;
floattarget_position=0;
floattarget_velocity=6.28;
voidMagneticSensorPWM_callb(ac)k()
{
Motor_left.foc_motor.ops.loopFOC(
Motor_left.foc_motor.ops.move(
}
intmain(void)
{
...
BLDCMotor_set_default(
BLDCDriver6PWM_set_default(
MagneticSensorPWM_set_default(
InlineCurrentSense_set_default_by_g(ai)n(¤t_sense,0.01f,50,"adc0",10,11,NOT_SET);
current_sense.current_sense.ops.init(
sensor_pwm.sensor.ops.init(
FOCMotor_linkSensor(
FOCMotor_linkCurrentSense(
Motor_left_driver.bldc_driver.voltage_power_supply=8;
Motor_left_driver.bldc_driver.voltage_limit=8;
Motor_left_driver.bldc_driver.ops.init(
Motor_left.linkDriver(
CurrentSense_linkDriver(
Motor_left.foc_motor.voltage_limit=4;
Motor_left.foc_motor.controller=velocity;
Motor_left.foc_motor.PID_velocity.output_ramp=1000;
Motor_left.foc_motor.PID_velocity.P=0.04;
Motor_left.foc_motor.PID_velocity.I=0.4;
Motor_left.foc_motor.PID_velocity.D=0;
Motor_left.foc_motor.LPF_velocity.(Tf)=0.01f;
Motor_left.foc_motor.ops.init(
Motor_left.foc_motor.ops.initFOC(
MagneticSensorPWM_enableInterrupt(
...
}
staticintmotorL_V_PI(intargc,char**argv)
{
rt_err_tresult=RT_EOK;
floatp,i;
charbuf[64];
if(argc>=3)
{
p=atof(argv[1]);
i=atof(argv[2]);
Motor_left.foc_motor.PID_velocity.P=p;
Motor_left.foc_motor.PID_velocity.I=i;
sprintf(buf,"setP:%.3f,I%.3fn",p,i);
rt_kprintf(buf);
}
else{
rt_kprintf("Usage:n");
rt_kprintf("motorL_V_PI-settheleftmotorvelocityPIvaluen");
rt_kprintf("eg:motorL_V_PI0.25issetleftmotorvelocityPto0.2,Ito5n");
result=-RT_ERROR;
}
returnRT_EOK;
}
MSH_CMD_EXPORT(motorL_V_PI,motorL_V_PI
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 虛擬現(xiàn)實(shí)行業(yè)營銷策略方案
- 養(yǎng)殖環(huán)境控制科技行業(yè)分析報(bào)告及未來五年行業(yè)發(fā)展報(bào)告
- 數(shù)字版權(quán)保護(hù)行業(yè)經(jīng)營分析報(bào)告
- 游戲反饋收集與處理行業(yè)調(diào)研及投資前景分析報(bào)告
- 廢棄建筑材料回收利用行業(yè)競爭分析及發(fā)展前景預(yù)測報(bào)告
- 多元文化旅游規(guī)劃行業(yè)發(fā)展全景調(diào)研與投資趨勢預(yù)測研究報(bào)告
- 人才租賃行業(yè)供需趨勢及投資風(fēng)險(xiǎn)研究報(bào)告
- 家用基因檢測設(shè)備行業(yè)競爭格局與投資戰(zhàn)略研究咨詢報(bào)告
- 手賬本出版行業(yè)相關(guān)項(xiàng)目診斷報(bào)告
- 銀行電子銀行行業(yè)營銷策略方案
- 教科版六年級(jí)英語上冊(cè)(廣州版)全冊(cè)完整課件
- 機(jī)動(dòng)車維修經(jīng)營備案表
- 培養(yǎng)基和試劑技術(shù)性驗(yàn)收記錄
- 智慧社區(qū)物業(yè)管理平臺(tái)課件
- 七講自然健康的分娩課件
- 幼兒園骨干教師登記表
- 飼料公司生產(chǎn)工藝說明
- 小學(xué)美術(shù)浙江人美五年級(jí)上冊(cè)2傳統(tǒng)門飾威武的門鈸
- 飼料委托加工合同協(xié)議書
- 完整版醫(yī)院體檢報(bào)告范本
- DL∕T 458-2020 板框式旋轉(zhuǎn)濾網(wǎng)
評(píng)論
0/150
提交評(píng)論