本例我们选用了THB6064MQ集成步进电机驱动模块使用很简单,仅有3个输入端口分别是使能端口、方向控制端口和脉冲输入端口,在不细分的模式下每输入一个脉冲步进电机就转动一个步进角,本例使用的是32细分所以就是每32个脉冲步进电机转动一个步进角。
驱动步进电机的方法有很多,不同的驱动器可能使用的方法不一样,使用同一种驱动器控制的方法也可能不一样,这里我们使用的是利用STM32定时器的输出比较反转模式产生驱动电机所需的脉冲。
一般都是使用编码器读取在转动时产生的脉冲值根据采集时间计算电机轴的运转速度,本例使用的是STM32定时器模式来做编码器AB脉冲的读取。
- /**
- * 函数功能: 基本定时器硬件初始化配置
- * 输入参数: htim_base:基本定时器句柄类型指针
- * 返 回 值: 无
- * 说 明: 该函数被HAL库内部调用
- */
- void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef* htim_base)
- {
- GPIO_InitTypeDef GPIO_InitStruct;
- if(htim_base->Instance==ENCODER_TIMx)
- {
- /* 基本定时器外设时钟使能 */
- ENCODER_TIM_RCC_CLK_ENABLE();
- ENCODER_TIM_GPIO_CLK_ENABLE();
- /* 定时器通道1功能引脚IO初始化 */
- GPIO_InitStruct.Pin = ENCODER_TIM_CH1_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull=GPIO_PULLUP;
- GPIO_InitStruct.Alternate = GPIO_CH1_AFx_TIMx;
- HAL_GPIO_Init(ENCODER_TIM_CH1_GPIO, &GPIO_InitStruct);
-
- /* 定时器通道2功能引脚IO初始化 */
- GPIO_InitStruct.Pin = ENCODER_TIM_CH2_PIN;
- GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
- GPIO_InitStruct.Pull = GPIO_PULLUP;
- GPIO_InitStruct.Alternate = GPIO_CH2_AFx_TIMx;
- HAL_GPIO_Init(ENCODER_TIM_CH2_GPIO, &GPIO_InitStruct);
- }
- }
- // 采样和控制周期为20ms
- if(Time_Flag & SAMPLING)
- {
- // 获得编码器的脉冲值
- CaptureNumber = OverflowCount*65535 + __HAL_TIM_GET_COUNTER(&htimx_Encoder);
- // M法 测速度 M法是测量单位时间内的脉数,然后换算成频率,这里不算频率
- MSF = CaptureNumber - Last_CaptureNumber;
- Last_CaptureNumber = CaptureNumber;
- // 对速度进行累计,得到1s内的脉冲数
- MSF = abs(MSF);
- SUM_Pulse += MSF;
- MMPS = MSF*SPEED_CONSTANT;// 由脉冲数转换为 mm/s, MMPS = (MSF*(TXDCYCLE/SAMPLING_PERIOD))/PSPM;
- if(Speed >= MAX_SPEED) // 限制最大速度
- Speed = MAX_SPEED;
- if(Speed <= MIN_SPEED)
- Speed = MIN_SPEED;
-
- STEPMOTOR_Motion_Ctrl(CW,Speed);
- Time_Flag &= ~SAMPLING;
- }
- // 数据发送周期为1s
- if(Time_Flag & TXD)
- {
- //printf("OverflowCount:%d \n",OverflowCount);
- sprintf((char *)aTxBuffer,"捕获值: %d -- 速度: %.2f mm/s\n",CaptureNumber,(float)MMPS);
- sprintf((char *)aTxBuffer+strlen((const char*)aTxBuffer),"1s内编码器计数值: %5d \n",SUM_Pulse);
- HAL_USART_Transmit_DMA(&husartx,aTxBuffer,strlen((const char*)aTxBuffer));
- SUM_Pulse = 0;
- Time_Flag &= ~TXD;
- }
|