本科畢業(yè)于自動化,期間學習了各種電機運動控制原理,自動控制原理,但是只會考試而未究其理。最近接觸到simplefoc這個基于arduino的開源無刷電機驅(qū)動庫,想正好借此機會將本科學到的內(nèi)容用于實際,于是就有了這個小項目,基于無刷電機FOC的平衡小車。
無刷電機相比于普通小車用的有刷電機,相同體積下扭矩更大,無刷電機驅(qū)動小車時可以直驅(qū)而不像有刷電機需要帶減速器才能滿足扭矩要求,且響應(yīng)速度更快。采用無刷電機可以把小車做的更緊湊美觀。
無刷電機的驅(qū)動電路和算法要更加復(fù)雜,無刷電機在低速工作時,算法層面上采用磁場定向控制算法FOC(Field-oriented control),可以精確控制電機的位置,速度乃至電流也就是轉(zhuǎn)矩,由此可以做出很多好玩的東西?;趂oc的無刷電機在機器人關(guān)節(jié),相機云臺電機控制等領(lǐng)域得到廣泛應(yīng)用。
博客文檔鏈接
https://blog.csdn.net/weixin_42487906/article/details/124898392
視頻鏈接
https://www.bilibili.com/video/BV1Sv4y137FG/
github倉庫,內(nèi)有代碼,3D打印文件,pcb制板文件:
https://github.com/FranHawk/simplefoc_balance_car
立創(chuàng)eda工程 可在線查看原理圖和pcb:
總共有三個板子
主板(包括電機控制和驅(qū)動部分):https://oshwhub.com/FranHawk/balance_car_esp32_simplefoc
編碼器板:https://oshwhub.com/FranHawk/as5600-16mm
RGB燈帶板:https://oshwhub.com/FranHawk/rgb_strip
所有的電子元件材料都可以對照BOM表或者工程里的原理圖買,在淘寶或者立創(chuàng)上買均可,下面列出一些關(guān)鍵材料的鏈接
AS5600 L6234PD INA240A1:【淘寶】https://m.tb.cn/h.ft947n2?tk=gn3u2P8IocI「L6234PD L6234D L6234 HSOP 原裝汽車IC 進口芯片熱賣 質(zhì)量超好」點擊鏈接直接打開
電機部分的芯片 這個店家買到的貨還算便宜
其他的電子元器件都可以在優(yōu)信電子之類的找到,財力充足的可以直接立創(chuàng),省事。
2210云臺電機(至少兩個)【淘寶】https://m.tb.cn/h.fslSDE8?tk=G8Pk2P8HluO「清倉HJ2210-75T無刷云臺電機狗3云臺專用 航拍電機 云臺空心軸馬」點擊鏈接直接打開
輪胎胎皮(至少兩個) 【淘寶】https://m.tb.cn/h.ft9UFV4?tk=L8Ez2P8u1Ma「AXIAL 1比24車SCX24 90081小米吉姆尼通用橡膠攀爬輪胎皮直徑52mm」點擊鏈接直接打開
電機支架(至少兩個) 【淘寶】https://m.tb.cn/h.fsl86Kp?tk=i9Oo2P8FvxY「390電機支架 385固定座 365安裝底座 380馬達固定架 送螺絲螺母 點擊鏈接直接打開
黑色亞克力板(至少兩個) 【淘寶】https://m.tb.cn/h.fH9ybkd?tk=2OCV2P8vqAf「平衡小車DIY專用亞克力支架板擴展板」點擊鏈接直接打開
電池 900mah【淘寶】https://m.tb.cn/h.fGk2f0O?tk=33dF2PjbvTN「航模電池5200mAh 11.1V足容高C7.4V車模船模 RC攀爬車質(zhì)量保證」點擊鏈接直接打開
其他機械小零件
打開開源資料鏈接上的三個pcb工程,在嘉立創(chuàng)投板生產(chǎn),把元器件都買到并焊上去
主板
按照上圖用紅黑電源線焊接主板和XT30 公頭插頭
編碼器板
編碼器板沒什么元器件,記得上面這個焊點要焊上,背面還有一個as5600芯片,總共要做兩個
RGB燈板
把燈焊上去,沒什么好說的,總共要做兩個
sh1.0 3P和4P的線
分別做兩條,用作連接RGB板和編碼器板到主板,注意接線前一定要檢查編碼器板和主板的線順序是不是對應(yīng)的,我買到的反的,需要自己調(diào)換順序
制作兩個電機部分
先把徑向磁鐵粘在電機軸心
把編碼器板,電機支架和電機用m2.5螺釘按上圖組裝,中間加些墊片,防止相互間摩擦,如下圖
3D打印輪轂,套在電機上,再套上胎皮,3D打印文件在github里
3D打印固定板,用魔術(shù)貼和扎帶固定電池,用m3*5 銅柱和螺釘將3D打印固定板和主板組裝
將兩個電機部分和主板部分用m3螺釘組裝,電機線通過3.8mm 插頭連接到主板,順序隨意。編碼器板用sh1.0 mm 4P線連接,第一層亞克力板上裝四個m3 20mm的銅柱,如下圖
RGB燈板和第二層亞克力板粘在一起
連接RGB的線到主板,固定第一層和第二層亞克力板,完成組裝
通過vscode+platformio來燒寫程序
第一次燒寫程序前,先找到hw_bldc.cpp里的hw_bldc_init()函數(shù)里
有這樣幾句
motor_0.init();
motor_1.init();
motor_0.initFOC();
motor_1.initFOC();
第一次燒寫時,initFOC里不需要有參數(shù),上電后simplefoc會運行自檢程序,檢測電機旋轉(zhuǎn)方向和電角度,會在串口中輸出,通過串口得到參數(shù)后填入initFOC
motor_0.init();
motor_1.init();
motor_0.initFOC(4.53, Direction::CW);
motor_1.initFOC(0.64, Direction::CCW);
如上,每個人的這兩個參數(shù)都是不一樣的,然后第二次燒寫代碼。之后每次啟動就不會消耗時間自檢了。
手機控制手機安裝點燈APP,https://diandeng.tech/dev
創(chuàng)建一個藍牙設(shè)備,添加一個手柄控件,起名叫JoyKey
對于燈光效果的遙控可自行開發(fā)
電路部分分為一個主板,兩個編碼器小板,兩個RGB燈板
驅(qū)動是小車的核心部分,是小車動起來的關(guān)鍵。無刷電機轉(zhuǎn)動時需要分別控制電機的三相電壓。采用FOC算法控制時,還需要位置傳感器提供轉(zhuǎn)子和定子的相對位置,如果要控制轉(zhuǎn)矩,還需要電流傳感器。初次學習FOC,我采用燈哥開源FOC驅(qū)動的方案,燈哥github倉庫地址。
電機驅(qū)動采用L6234P三相H橋集成驅(qū)動芯片
電流檢測采用INA240A2芯片,放大增益為50,這個芯片也比較貴,可以用INA240A1代替,放大增益為20,我焊的時候用的就是這個,一樣能用。
電機位置檢測采用AS5600絕對值磁編碼器芯片,IIC通訊,我為這個芯片畫了個小板子附在電機軸處,與主板相連,同時還需要在電機軸線處固定一個徑向磁鐵。
由主要功能可知,需要MCU具有藍牙和WIFI功能,還需要足夠的性能用于FOC算法,同時控制RGB。最近看到的esp32可以說正合適,esp32有320K RAM,4M ROM,兩個core,一個核專門用來跑foc算法,另外一個核用來跑其他程序包括RGB控制,simplefoc官網(wǎng)上說esp32單次foc運算能有1ms,引腳也足夠多,滿足平衡控制的需求。
平衡控制需要通過傳感器檢測到小車自身的姿態(tài),我采用最常見的MPU6050 6軸加速度計陀螺儀芯片
WIFI圖傳由主板通過2.54排母插接ESP-CAM模塊實現(xiàn)
RGB采用WS1802B LED燈,MCU一個IO口就可以驅(qū)動一串RGB
其他一些接口和轉(zhuǎn)串口芯片什么就不多介紹了,可以看我開源的電路工程了解
理論基礎(chǔ)無刷電機平衡小車的理論部分需要了解
1.無刷電機磁場定向控制FOC算法
2.平衡車建模和控制算法
理論部分網(wǎng)上有很多資料,講解也非常清楚易懂,珠玉在前,我引出一些比較好的文章,供想要深究的讀者查看
磁場定向控制FOC算法FOC算法的內(nèi)容比較多,初學者可以看下稚暉君這篇文章,比較通俗易懂
simplefoc官方文檔的介紹也比較詳細,還有源碼講解,代碼中也用到了simplefoc的庫,所以最好去官網(wǎng)文檔了解一些simplefoc的使用方法
https://simplefoc.com/
其他比較好的文章
ESP32這款MCU有兩個核心,我采用freertos來對兩個核進行調(diào)度,整體軟件框架基于arduino+freertos
用到的庫Adafruit_NeoPixel 用于驅(qū)動RGB燈帶
blinker-library點燈科技的藍牙庫,可以通過手機app和平衡車藍牙通訊
MPU6050_lightMPU6050驅(qū)動庫
Arduino-FOCsimplefoc的arduino支持庫
0 core:
task 0:simplefoc的電流環(huán)的運算、俯仰角數(shù)據(jù)讀取的和電機電壓的輸出
1 core:
task 1:平衡環(huán)和速度環(huán)pid運算
task 2:RGB閃爍和通過藍牙接收手機的控制命令
這個任務(wù)的代碼比較簡單,loopFOC和move負責simplefoc電流環(huán)的運算和電壓輸出
mpu.update()讀出MPU6050數(shù)據(jù)并返回俯仰角,俯仰角通過互補濾波結(jié)算得到就可以了
shaftVelocity返回電機速度,用于task 1速度環(huán)pid的運算
void task_motor_move(void *pvParameters)
{while (1)
{// iterative setting FOC phase voltage
motor_1.loopFOC();
motor_0.loopFOC();
// Serial.printf("d:%f,%f\n",motor_1.shaftVelocity(),motor_0.shaftVelocity());
motor_1.move(motor_output_left);
motor_0.move(motor_output_right);
// // iterative function setting the outter loop target
mpu.update();
speed_right = motor_0.shaftVelocity();
speed_left = motor_1.shaftVelocity();
}
}
TASK 1該任務(wù)主要是平衡環(huán)和速度環(huán)pid運算,用狀態(tài)機的思維將平衡車狀態(tài)分為STOP,RUNNING,PICKUP三個狀態(tài),這樣做主要是為了避免平衡車被拿起時電機瘋轉(zhuǎn)。
開機時狀態(tài)為STOP,把車扶正到平衡位置附近則進入RUNNING狀態(tài),當拿起傾斜角后過大,則進入PICKUP狀態(tài),逆時針旋轉(zhuǎn)車體后進入STOP狀態(tài)。
RUNNING狀態(tài)運行平衡環(huán),速度環(huán)和角度環(huán)。平衡環(huán)采用pd,速度環(huán)用pi,角度環(huán)僅用單p。
void task_control(void *pvParameters)
{while (1)
{angle_pitch = mpu.getAngleY();
// Serial.printf("d:%f\n",angle_pitch);
acc_Z = mpu.getAccZ();
if (running_state == STATE_STOP)
{if (abs(angle_pitch - angle_pitch_offset)< 0.5)
{running_state = STATE_RUNNING;
}
}
else if (running_state == STATE_RUNNING)
{speed_average = (speed_right + speed_left) / 2;
if (abs(angle_pitch - angle_pitch_offset) >50 )
{speed_I_sum=0;//清空積分系數(shù)
running_state = STATE_PICKUP;
}
else
{speed_target = translate_speed;
speed_error = speed_target - speed_average;
speed_I_sum+=(speed_error*speed_I);
if(speed_I_sum>15){speed_I_sum = 15;
}
if(speed_I_sum<-15){speed_I_sum = -15;
}
angle_target_pitch = speed_P * speed_error + speed_I_sum;
motor_output_left = angle_P * ((angle_pitch - angle_pitch_offset) - angle_target_pitch) + angle_D * mpu.getGyroY()+rotate_speed; //+ angle_D * mpu.getGyroY()
motor_output_right = angle_P * ((angle_pitch - angle_pitch_offset) - angle_target_pitch) + angle_D * mpu.getGyroY()-rotate_speed;
angle_last_pitch = angle_pitch;
}
}
else if (running_state == STATE_PICKUP)
{motor_output_left = 0;
motor_output_right = 0;
if (speed_right >3.14 && speed_left< -3.14)
{running_state = STATE_STOP;
}
}
vTaskDelay(1);
}
}
TASK 2task 2用于RGB效果顯示,和接收手機blinker app通過藍牙發(fā)送的數(shù)據(jù)。一般的RGB等效都有一個延時函數(shù),普通的延時函數(shù)都是在原地死等,這樣大大降低CPU效率,影響其他程序運行,這里我編寫了一系列非阻塞式RGB燈效:在顯示完燈效后不再原地延時,而是直接進行調(diào)度,切換到其他task。詳細可看我代碼。
void task_neopixel(void *pvParameters)
{uint32_t neopixel_pattern_previous = 0;
uint32_t neopixel_pattern_interval = 500;
uint32_t neopixel_pattern_number = 0;
while (1)
{// 效果切換
if((neopixel_count-neopixel_pattern_previous)>neopixel_pattern_interval){neopixel_pattern_previous = neopixel_count;
neopixel_pattern_number++;
neopixel_state_clear(strip_1_handler);
neopixel_state_clear(strip_2_handler);
if(neopixel_pattern_number>4){neopixel_pattern_number = 0;
}
}
switch(neopixel_pattern_number){case 0:
neopixel_police_style_2(strip_2_handler,10,5);
neopixel_police_style_2(strip_1_handler,10,5);
break;
case 1:
neopixel_police_style_1(strip_2_handler,10,5);
neopixel_police_style_1(strip_1_handler,10,5);
break;
case 2:
neopixel_loop(strip_2_handler, 255, 255, 255, 4, 4);
neopixel_rainbow(strip_1_handler);
break;
case 3:
neopixel_bounce(strip_1_handler, 0, 255, 0, 2, 3, 0);
neopixel_fade_in_out(strip_2_handler, 255, 0, 255, 2, 1,25);
break;
case 4:
neopixel_spread_out(strip_2_handler, strip_2_handler.strip.Color(0,255,0), strip_2_handler.strip.Color(0,0,255), 4, 10);
neopixel_spread_out(strip_1_handler, strip_1_handler.strip.Color(255,0,0), strip_1_handler.strip.Color(255,255,0), 4, 10);
break;
default:
break;
}
neopixel_count++;
#ifdef USE_BLINKER
Blinker.run();
#endif
vTaskDelay(10);
}
}
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)站欄目:SimpleFOC無刷電機平衡小車-創(chuàng)新互聯(lián)
URL分享:http://jinyejixie.com/article38/dsijsp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、App設(shè)計、微信小程序、外貿(mào)建站、面包屑導(dǎo)航、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容