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