無刷電機(jī)小車開發(fā)記錄-移植SimpleFOC流程_第1頁
無刷電機(jī)小車開發(fā)記錄-移植SimpleFOC流程_第2頁
無刷電機(jī)小車開發(fā)記錄-移植SimpleFOC流程_第3頁
無刷電機(jī)小車開發(fā)記錄-移植SimpleFOC流程_第4頁
無刷電機(jī)小車開發(fā)記錄-移植SimpleFOC流程_第5頁
已閱讀5頁,還剩19頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論