### DIY桌面機械臂__FOC電機驅動器(#002)
目錄
- 前言
- 一、硬體框架與模型
- 1. 硬體原理圖
- 2. 模型與安裝
- 二、電路制作與測驗
- 1. 電路制作與修改
- 2. 程式設計與pid角度控制
- 2.1 AS5600的傳感器
- 2.2 SVPWM控制開環
- 2.3 倍訓pid控制
前言
? 之前寫了個設計桌面機械臂的文稿,本來按照流程要先對做一些基礎的仿真和測驗、可行性分析,但是后來覺得可以在實作程序中邊研究邊制作;而且看了一下高級的伺服電機機器人節點咱也買不起,就想從零開始學習并設計機器人模組,本人不是機械工程出生,但對控制類的系統有濃厚興趣,便開始執行并在博客中分享該專案的程序,并希望能和大家一起討論,
一、硬體框架與模型
? 設計機械臂最核心的部分應該就是關節部分的伺服電機了,針對與DIY文稿中的設計思路,每個伺服電機都為一獨立的控制系統,并通過CAN總線的形式獲取資料并控制,
? 測驗電機選擇2804云臺電機,是個7個極對數的無刷電機,至于為什么選這個,淘寶上幾元就能買到,初步考慮,硬體驅動的pcb部分與電機安裝一體,
1. 硬體原理圖
? 三相MOS驅動器用的是L6234P,最大電壓52V,瞬時最大電流5A,讓這個小電機轉起來應該是綽綽有余,單片機還是選用比較常用的STM32F103C8T6,但是最近價格漲的厲害,就換成了GD32同型別,傳感器采用磁感應器件AS5600,角度解析度是12位,電壓采用12V供電,通過MT2492 DCDC降壓到5V,
? 這里給出無刷電機驅動器的硬體原理圖與PCB圖:
? 
?
? 底層
頂層 
2. 模型與安裝
? 為了方便設計與安裝,這里把電機和驅動板繪制成3D模型,具體如下:
? 至于為什么設計的電路板比電機大一圈,看起來不緊湊,是因為為了安裝孔的位置以及較多的元器件,實在無法縮小板子的體積,但是對后面的設計與測驗影響不是很大,
二、電路制作與測驗
1. 電路制作與修改
? 拿到板子和器件后,立馬進行焊接與測驗,下圖是單面焊接完成的情況,
? 直到撰寫軟體才發現在原理圖中根本就沒有AS5600的介面,往往檢查好pcb的規則后就應該是設計投板的最后一步了,這樣的錯誤確實足夠愚蠢的,
?
后來,直接通過跳線到PB11,PB10的兩個引出來的焊盤上,才通程序式測驗,

? 關于中間那部分支撐是根據電路板的結構去設計,但是感覺這樣設計的問題在于每修改一次電路后,與之接觸的部分模塊都要重新設計,!
2. 程式設計與pid角度控制
-
首先要做的就是把單個模塊都調通,再進行下一步的操作
-
其次再進行pid的引數調節,達到比較合適的狀態
2.1 AS5600的傳感器
首先進行AS5600的傳感器引數讀取,并通過串口列印出來觀察,一開始對于I2C協議,想到的是STM32的硬體I2Cmaster,因為相較于模擬IO,回應會快一些,并且不會占用cpu資源,但是后來測驗發現系統的中斷對快速讀取的I2C程式部分有影響,會直接卡死,所以后來還是選擇了模擬IO的方式,
2.2 SVPWM控制開環
這里采用了simple foc的設計,并實作了電機的開環運行,
2.3 倍訓pid控制
? 給出控制電機的核心代碼,由于沒有加積分,所以存在的靜態誤差讓人很難以接受,后續再進行改進
void my_close_p_con(void)
{
float a_er=0;
float s_a=0;
float an_p_cofe=15; //角度的比例引數
float vq_p_cofe=30; //力矩的比例引數
float vq_d_cofe=450; //力矩的微分引數
static float a_er_l=0;
float an_pid_o=0; //角度pid輸出
float vq_pid_o=0; //力矩pid輸出
float an_pid_max=0.3; //最大牽引角度(我也不知道為啥我要這么命名)
float d_dat=0; //微分量
float ang_shift=0; //絕對的角度控制引數
s_a=FilterDeal(getAngle()); //濾波后的電機角度值
a_er=target_angle-s_a; //誤差值
an_pid_o=a_er*an_p_cofe; //角度只有比例控制
if(an_pid_o>an_pid_max)//限幅
{
an_pid_o=an_pid_max;
}
else if(an_pid_o<-an_pid_max)//限幅
{
an_pid_o=-an_pid_max;
}
d_dat=a_er-a_er_l; //微分量的輸出等于這次的誤差減去上一次誤差
vq_pid_o=fabs(a_er*vq_p_cofe+d_dat*vq_d_cofe); //力矩的引數控制,比例加微分(因為震蕩嚴重,所以加了d)
if(vq_pid_o>max_p) //力矩限幅
{
vq_pid_o=max_p;
}
ang_shift=init_ang_bias+s_a+an_pid_o; //絕對角度等于靜態校準偏差加上跟蹤的角度值加上pid的偏移量實作角度控制
S_Uq=vq_pid_o;
move(ang_shift); //運行
a_er_l=a_er; //保存誤差
更新時間:2021 - 9 - 6
持續更新,一起交流!!!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/298436.html
標籤:其他
