看板 C_and_CPP 關於我們 聯絡資訊
首先你這樣寫很沒有效率,建議你做這種IO操作, 還是要去看datasheet,才能進步。 另外我猜你是用mega328來控制, 但是你使用的pin腳,5、6、7、8其實是不連續的, 我建議你改用8、9、10、11,分別對應PB0~PB3。 詳細範例我擺在最下面。 另外,我們來談談這個程式碼有什麼問題, 1. Dead time 我猜你每個IO控制兩個2個mosfet, 首先你要知道你這種方法沒有辦法產生mosfet deadtime, 除非,你使用的gate driver有內建。 2. 主迴路占用 還有這種方法控制stepper motor你必須依賴主迴路, 變成你主迴路不能放太多運算, 最好的方法是你要找一顆IC有支援 4 pwm 輸出的, 並且用中斷去控制。 3. 電流控制 一般stepper motor都是電流控制, 你還需要一個電流回授, 然後可控的PWM,而不是控制delay。 4. 成本太高 如果你要玩的stepper motor功率不高,直接買現成的IC比較快, 例如:A4988,網路一顆賣不到50塊,還內建32細分微步進, 控制只要 DIR + STEP 兩隻腳,方便省時效果好, 你買4顆gate driver價格就已經300去了, mosfet、mcu、pcb、人工...都還沒算。 #define MAX_STEP (4) const uint8_t m_step[MAX_STEP] = { 0b00000011, 0b00000110, 0b00001100, 0b00001001 }; void cw_step_control(unsigned long dt_ms) { static uint8_t c_step = 0; c_step++; c_step = c_step >= MAX_STEP? 0: c_step; PORTB = (PORTB & 0b11110000) | m_step[c_step]; delay(dt_ms); } void setup() { // set PB0~PB3 as output DDRB |= 0b00001111; // set PB0~PB3 output low PORTB &= 0b11110000; } void loop() { cw_step_control(300); } -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.68.97 (臺灣) ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1577169418.A.DD8.html ※ 編輯: qscgy4 (220.132.68.97 臺灣), 12/24/2019 15:39:04
lhz135: 感謝大德的回覆,目前小弟的程度還不夠要時間消化先 12/24 20:53
onegoman: 推。 12/24 21:13