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

作者: qscgy4 (有點厲害)   2019-12-24 14:36:56
首先你這樣寫很沒有效率,建議你做這種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);
}
作者: lhz135 (PPP)   2019-12-24 20:53:00
感謝大德的回覆,目前小弟的程度還不夠要時間消化先
作者: onegoman (SKY)   2019-12-24 21:13:00
推。

Links booklink

Contact Us: admin [ a t ] ucptt.com