Re: [問題] 如何將此程式碼 用迴圈的方式表達

看板C_and_CPP (C/C++)作者 (社會很年青)時間5年前 (2019/12/24 14:36), 5年前編輯推噓2(200)
留言2則, 2人參與, 5年前最新討論串2/3 (看更多)
首先你這樣寫很沒有效率,建議你做這種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

12/24 20:53, 5年前 , 1F
感謝大德的回覆,目前小弟的程度還不夠要時間消化先
12/24 20:53, 1F

12/24 21:13, 5年前 , 2F
推。
12/24 21:13, 2F
文章代碼(AID): #1U0R8AtO (C_and_CPP)
文章代碼(AID): #1U0R8AtO (C_and_CPP)