目錄标題
- A4988 步進電機驅動子產品測試-兩相4線步進電機
-
- 電機
- stm32發脈沖的代碼
- 常見問題總結:
- 燒毀
-
- 接線注意:
- 代碼。參考文章
- 連結
- 舵機指令包
- windows下運作步驟
- sync_read_write
- bulk_read_write
- 故障
-
- length does not match
- 調試過程中查的小知識
-
- list
- setup.py
- from . import XXX
- Visual Studio Code快捷鍵
A4988 步進電機驅動子產品測試-兩相4線步進電機
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiIXZ05WZj91YpB3IwczX0xiRGZkRGZ0Xy9GbvNGL2EzXlpXazxSP9EVWwYVbZZmVIFmaGJTYwJ0MMBjVtJWd0ckW65UbM5WOHJWa5kHT20ESjBjUIF2X0hXZ0xCMx81dvRWYoNHLrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdssmch1mclRXY39CXldWYtlWPzNXZj9mcw1ycz9WL49zZuBnLxETMwEjNxEjM0ATMxAjMwIzLc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
使用中,把使能腳和細分腳全部接地,即不設定細分(步進值為1),複位腳和睡眠腳用跳線帽短接。
A4988功能實驗測試:
DIR=1,STEP為3.3V占空比50%,頻率為500Hz的方波,電機電壓Vmot=12V。
電機
接線參考下圖對應關系
A+和A-為一相
B+和B-為一相
同相之間電阻較小,非同相之間電阻無窮大,接完線可以用萬用表測量是否接錯
A4988的引腳圖及運用 – 八色木
https://www.basemu.com/a4988_pinout_and_how_to_use.html
stm32發脈沖的代碼
//PB15 enable 低電平有效
//PB14 dir
//PB13 pulse
void loop()
{
int i,j,k,x=7;
int num=1000;
PBout(15)=0;
PBout(14)=1;
for(i=0;i<num;i++)
{
PBout(13)=1;
Delay_ms(x);
PBout(13)=0;
Delay_ms(x);
}
GPIOBE_REV;
Delay_ms(1000);
PBout(14)=0;
for(i=0;i<num;i++)
{
PBout(13)=1;
Delay_ms(x);
PBout(13)=0;
Delay_ms(x);
}
GPIOBE_REV;
Delay_ms(1000);
PBout(15)=1;
// GPIOBE_REV;
}
主函數:
int main(void)
{
u8 i,j,k=0;
RCC_Configuration();
GPIO_Configuration();//LED+用到的GPIO
while(1)
{
loop();
}
}
脈沖越快電機轉動速度越快
脈沖不能發的太快,否則電機跟不上就會吱吱響但是不轉動
常見問題總結:
1、4988驅動闆可以驅動57電機嗎?
4988可以驅動的電機跟尺寸關系不大,主要與工作電流有關,理論上電流小于2A的步進電機都是可以驅動的,不論是42還是57電機。
2、可以驅動多大的電流?
如果4988晶片上沒有加散熱片,電流最好在1.2A以下。如果加散熱片,電流可以達到2A。
3、步進電機的連接配接方式是什麼?
正如4988闆子背面所辨別的,連接配接方式是依次連接配接步進電機的1B-1A-2A-2B,或者反向為2B-2A-1A-1B,或者1A-1B-2B-2A,其它的方式一次類推。如果你的電機線是标準的紅藍綠黑的顔色,可以按照顔色連接配接為:紅-藍-綠-黑,或相反:黑-綠-藍-紅。
4、如何調節相電流?
相電流的大小跟步進電機的扭力有直接關系,如果感覺你的步進電機扭力不足,可以加大4988闆子的電流配置。驅動闆是通過一個小的電位器來實作對輸出電流的配置的。可以通過用萬用表測量電位器中間管腳的電位。電位和電流的關系滿足下面的公式:Vref = A*0.8.也就是如果你想配置電機工作電流為1A,則電位應該配置在0.8V。預設的元件配置可以将電流調節到1.5A,如果需要更大電流需要修改電路中的R1,将30K的阻值改為20K(左右),就可以将電流調節到2A左右。
5、4988闆子的細分如何配置?
4988闆子細配置設定置需要ramps或其它相似闆子的短路塊來配置。ramps上對應每個4988驅動都有ms1,ms2,ms3三個短路塊來調節細分(需要取下4988闆子才可以看到),
ms1 | ms2 | ms3
no | no | no |全細分
yes | no | no |1/2(2細分)
no | yes | no | 1/4 (4細分)
yes | yes | no |1/8(8細分)
yes | yes | yes | 1/16(16細分)
6、接上電機後,電機不能正常運作,在左右抖動,是什麼原因?
電機出現抖動一般有兩個原因,
一是缺相:可能是4988闆子沒有焊接好或因為外力導緻4988的輸出端某一相斷開,造成電機缺相進而抖動。也有可能是步進電機接線隻用一相沒有連接配接好;
而是兩相接錯:如果步進電機沒有按照正确的順序進行連接配接,電機也會出現抖動的情況,請按照問題3進行正确的連接配接。
7、4988可以驅動兩相六線或兩相無線的電機嗎?
可以,兩相連線按照問題3連接配接,将中間抽頭懸空即可。
8、電機停止轉動時會有滋滋的電流聲。
首先說明的是這是正常現象。步進電機的特點是走特定的角度而不是一直轉,是以步進電機都有一個參數,步距角。如果通過細分,可以最小走 步距角/細分數的角度,比如步距角為1.8度的步進電機,采用16細分,最小可以走的角度是1.8/16=0.1125度。但由于這個角度非常小,并且不一定在電機實體所在的位置(1.8度為一個實體位置),是以步進電機停止時也需要通電,進而保證電機不會自動跳到實體步距角上。因為這個特性使得步進電機在靜止時會有電流聲,這屬于正常現象,不用擔心。
連結:https://www.jianshu.com/p/a168c20b0f65
來源:簡書
著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。
燒毀
a4988晶片燒毀的現象:24V和GND短路,AB兩相也短路
步進電機驅動晶片a4988上電燒毀-OpenEdv-開源電子網
http://openedv.com/thread-100510-1-1.html
接線注意:
好幾根線都要接的時候
- 盡量弄成不同長度的,錯開接線的位置,可以有效避免因為不小心發生短路。
- 接完後盡量找膠帶粘上,避免裸露。
2020-09-26-舵機+兩相4線步進電機A4988 步進電機驅動子產品測試-兩相4線步進電機舵機指令包windows下運作步驟sync_read_writebulk_read_write故障
代碼。參考文章
代碼 A4988 步進電機驅動子產品測試 - 簡書
https://www.jianshu.com/p/a168c20b0f65
(8條消息) A4988步進驅動_Nc2016的部落格-CSDN部落格
https://blog.csdn.net/PoJiaA123/article/details/85107927
連結
(8條消息) 使用Arduino與A4988 驅動步進電機_淩順實驗室-CSDN部落格
https://blog.csdn.net/ling3ye/article/details/47001251
A4988 步進電機驅動子產品測試 - 簡書
https://www.jianshu.com/p/a168c20b0f65
(8條消息) A4988步進驅動_Nc2016的部落格-CSDN部落格
https://blog.csdn.net/PoJiaA123/article/details/85107927
(8條消息) 【arduino】arduino uno + A4988控制42步進電機_g1fdgfgdf2_的部落格-CSDN部落格
https://blog.csdn.net/g1fdgfgdf2_/article/details/78692759
舵機指令包
Instruction Packet
Instruction Packet is the command data sent to the Device.
windows下運作步驟
安裝vscode和python,pyserial
vscode選擇打開檔案夾
選擇協定2檔案夾
打開如圖
選擇檔案後改動com口,點選菜單“運作”
sync_read_write
由上圖協定可知,param前四個為位址和資料長度,後面是id編号
這裡初始化了同步讀取的四個參數,分别為端口 資料包 位址 資料長度。。協定第二條要求位址和資料長度不可變。
類初始化四個參數:
後面繼續添加要讀取的舵機id(添加了兩個):
發送,并獲得傳回資料:
使用完後,(程式即将退出時):
寫入類似,多了個寫入的目标位置值
bulk_read_write
# Enable Dynamixel#1 Torque
dxl_comm_result, dxl_error = packetHandler.write1ByteTxRx(portHandler, DXL1_ID, ADDR_PRO_TORQUE_ENABLE, TORQUE_ENABLE)
if dxl_comm_result != COMM_SUCCESS:
print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
elif dxl_error != 0:
print("%s" % packetHandler.getRxPacketError(dxl_error))
else:
print("Dynamixel#%d has been successfully connected" % DXL1_ID)
# Add parameter storage for Dynamixel#1 present position
dxl_addparam_result = groupBulkRead.addParam(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)
if dxl_addparam_result != True:
print("[ID:%03d] groupBulkRead addparam failed" % DXL1_ID)
quit()
while1循環
while 1:
print("Press any key to continue! (or press ESC to quit!)")
if getch() == chr(0x1b):
break
# Allocate goal position value into byte array
param_goal_position = [DXL_LOBYTE(DXL_LOWORD(dxl_goal_position[index])), DXL_HIBYTE(DXL_LOWORD(dxl_goal_position[index])), DXL_LOBYTE(DXL_HIWORD(dxl_goal_position[index])), DXL_HIBYTE(DXL_HIWORD(dxl_goal_position[index]))]
# Add Dynamixel#1 goal position value to the Bulkwrite parameter storage
dxl_addparam_result = groupBulkWrite.addParam(DXL1_ID, ADDR_PRO_GOAL_POSITION, LEN_PRO_GOAL_POSITION, param_goal_position)
if dxl_addparam_result != True:
print("[ID:%03d] groupBulkWrite addparam failed" % DXL1_ID)
quit()
# Bulkwrite goal position and LED value
dxl_comm_result = groupBulkWrite.txPacket()
if dxl_comm_result != COMM_SUCCESS:
print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
groupBulkWrite.clearParam()
# Add Dynamixel#2 LED value to the Bulkwrite parameter storage
dxl_addparam_result = groupBulkWrite.addParam(DXL1_ID, ADDR_PRO_LED_RED, LEN_PRO_LED_RED, [dxl_led_value[index]])
if dxl_addparam_result != True:
print("[ID:%03d] groupBulkWrite addparam failed" % DXL1_ID)
quit()
# Bulkwrite goal position and LED value
dxl_comm_result = groupBulkWrite.txPacket()
if dxl_comm_result != COMM_SUCCESS:
print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
# Clear bulkwrite parameter storage
groupBulkWrite.clearParam()
while 1:
# # Bulkread present position and LED status
dxl_comm_result = groupBulkRead.txRxPacket()
if dxl_comm_result != COMM_SUCCESS:
print("%s" % packetHandler.getTxRxResult(dxl_comm_result))
# Check if groupbulkread data of Dynamixel#1 is available
dxl_getdata_result = groupBulkRead.isAvailable(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)
if dxl_getdata_result != True:
print("[ID:%03d] groupBulkRead getdata failed" % DXL1_ID)
quit()
# # Check if groupbulkread data of Dynamixel#2 is available
# dxl_getdata_result = groupBulkRead.isAvailable(DXL2_ID, ADDR_PRO_LED_RED, LEN_PRO_LED_RED)
# if dxl_getdata_result != True:
# print("[ID:%03d] groupBulkRead getdata failed" % DXL2_ID)
# quit()
# Get present position value
dxl1_present_position = groupBulkRead.getData(DXL1_ID, ADDR_PRO_PRESENT_POSITION, LEN_PRO_PRESENT_POSITION)
# # Get LED value
# dxl2_led_value_read = groupBulkRead.getData(DXL2_ID, ADDR_PRO_LED_RED, LEN_PRO_LED_RED)
# print("[ID:%03d] Present Position : %d \t [ID:%03d] LED Value: %d" % (DXL1_ID, dxl1_present_position, DXL2_ID, dxl2_led_value_read))
if not (abs(dxl_goal_position[index] - dxl1_present_position) > DXL_MOVING_STATUS_THRESHOLD):
break
# Change goal position
if index == 0:
index = 1
else:
index = 0
故障
length does not match
Succeeded to open the port
Succeeded to change the baudrate
[RxPacketError] The data length does not match as expected!
####已解決,舵機位址錯誤
調試過程中查的小知識
list
txpacket = [0] * (length + 7)
在python中, 如果用一個清單list1乘一個數字n 會得到一個新的清單list2, 這個清單的元素是list1的元素重複n次, 例如:
list1 = [0]
list2 = list1 * 5 # list2 = [0, 0, 0, 0, 0]
(3條消息) python 清單乘一個數字_hq_cjj的部落格-CSDN部落格
https://blog.csdn.net/hq_cjj/article/details/86659589
setup.py
Python 庫打包分發(setup.py 編寫)簡易指南 | Huoty’s Blog
https://blog.konghy.cn/2018/04/29/setup-dot-py/#part-2bb23717ee7e9bfc
from . import XXX
我的了解是 from . import XXX預設的就是在目前程式所在檔案夾裡__init__.py程式中導入XXX,如果目前程式所在檔案夾裡沒有__init__.py檔案的話,就不能這樣寫,而應該寫成from .A import XXX,A是指目前檔案夾下你想導入的函數(或者其他的)的python程式名,如果你想導入的函數不在目前檔案夾,那麼就有可能用到 from … import XXX(即上一個檔案夾中的__init__.py),或者from …A import XXX(即上一個檔案夾中的檔案A)
連結:https://www.zhihu.com/question/28688151/answer/66982373
Visual Studio Code快捷鍵
(3條消息) 【Visual Studio Code】VS Code在Linux/Mac/Windows中向前、向後定位的快捷鍵及修改方法_H_O_W_E的專欄-CSDN部落格
https://blog.csdn.net/H_O_W_E/article/details/104944130