步进马达
28BYJ-48步进马达。5V DC,减速比1:64:
2个绕组,5根接线如下。步进角360/64=5.625度。控制序列如下:
使用HR8833控制芯片,该芯片提供2个H桥,可以分别控制1个DC电机或者共同控制1个4相步进马达。步进马达接口和H桥控制逻辑如下。注意红色的共线5不用接:
单片机使用4个GPIO,分别与AIN1, AIN2, BIN1, BIN2接口。控制代码如下。其中 controlTable 是电机的控制序列,每个数组元素的bit3:0分别表示电机接线4-1的电平高低。doControl()函数的step参数取值0-7:
const uint8_t controlTable[] = { // 0b1000, // 0 0b1100, // 1 0b0100, // 2 0b0110, // 3 0b0010, // 4 0b0011, // 5 0b0001, // 6 0b1001, // 7 }; #define GET_PIN_STATE(bits, n) ( (1 & ((bits) >> (n))) ? \ GPIO_PIN_SET : GPIO_PIN_RESET ) void doControl(uint8_t step) { uint8_t bits = controlTable[step % 8]; HAL_GPIO_WritePin(AIN1_GPIO_Port, AIN1_Pin, GET_PIN_STATE(bits, 3)); HAL_GPIO_WritePin(BIN1_GPIO_Port, BIN1_Pin, GET_PIN_STATE(bits, 2)); HAL_GPIO_WritePin(AIN2_GPIO_Port, AIN2_Pin, GET_PIN_STATE(bits, 1)); HAL_GPIO_WritePin(BIN2_GPIO_Port, BIN2_Pin, GET_PIN_STATE(bits, 0)); }
关于电机的转速,需要进行一点计算。步进电机的转速完全取决于控制信号的切换速度。这里的步进电机规格书上给出:a, 步进角为360/64,即64步/周;b, 减速比为1:64。因此,对于转轴而言,其角度解析度为 r = 64x64=4096 步/周。
若控制信号的频率为f 步/秒,则转速为 v = 1/r x f = f/4096 周/秒。
若信号频率为 f = 1KHz(周期 1ms),则转速为 v = 1000/4096 ~ .244 周/秒,旋转一周约需时 4 秒。这是一个较慢的速度,如果要达到更快的速度,就需要 us 级的延时或定时器。另外,步进马达作为一个机电设备,速度一定是有一个有限的上限的。经过实测,信号周期最小为1200us;再快,马达就只震动而不转动。