作者qscgy4 (社會很年青)
標題Re: [問題] 如何將此程式碼 用迴圈的方式表達
時間Tue Dec 24 14:36:56 2019
首先你這樣寫很沒有效率,建議你做這種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