stm32f103c8t6编码器控速hal库
时间: 2025-04-29 13:54:54 浏览: 21
### 使用 HAL 库实现 STM32F103C8T6 的编码器速度控制
#### 编码器测速初始化
为了使用 HAL 库对 STM32F103C8T6 进行编码器控速,首先需要完成编码器测速的初始化工作。这一步骤涉及多个方面:
- **开启外设时钟**:通过 `RCC_APB1PeriphClockCmd` 和 `RCC_APB2PeriphClockCmd` 函数来使能 TIM3 及 GPIOA 外设时钟[^4]。
```c
// 开启TIM3及时钟
__HAL_RCC_TIM3_CLK_ENABLE();
// 开启GPIOA时钟
__HAL_RCC_GPIOA_CLK_ENABLE();
```
- **配置编码器信号的 GPIO** :定义并初始化用于接收编码器 A/B 相脉冲输入的 GPIO 引脚。通常情况下,这两个引脚会被设定为上拉输入模式,并且其最大频率被限定在一定范围内以确保稳定性和准确性。
```c
GPIO_InitTypeDef GPIO_InitStruct = {0};
/*Configure GPIO pin : PA6 */
GPIO_InitStruct.Pin = GPIO_PIN_6;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
/*Configure GPIO pin : PA7 */
GPIO_InitStruct.Pin = GPIO_PIN_7;
GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
GPIO_InitStruct.Pull = GPIO_NOPULL;
HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
```
#### 定义定时器参数
接下来要做的就是创建一个结构体实例化对象用来存储有关定时器的所有必要属性值;之后再调用相应的函数来进行具体数值上的赋值操作,比如周期计数寄存器(ARR)、预分频系数(PSC)等设置。
```c
TIM_EncoderInitStruct.Instance = TIM3;
// 设置自动重装载值
TIM_EncoderInitStruct.Init.Period = 65535;
// 设定向上计数方式
TIM_EncoderInitStruct.Init.CounterMode = TIM_COUNTERMODE_UP;
// 预分频器设置
TIM_EncoderInitStruct.Init.Prescaler = 0;
// 计数方向由TI1和TI2上升沿触发
TIM_EncoderInitStruct.EncoderMode = TIM_ENCODERMODE_TI12;
// TI1滤波器采样时间
TIM_EncoderInitStruct.Init.IC1Filter = 0xF;
// TI2滤波器采样时间
TIM_EncoderInitStruct.Init.IC2Filter = 0xF;
if (HAL_TIM_Encoder_Init(&htim3, &sConfig) != HAL_OK)
{
Error_Handler();
}
```
#### 获取当前的速度数据
当一切准备就绪后,在主循环或者中断服务程序(ISR)里就可以利用 HAL 提供的方法去获取最新的位置变化情况进而推算出实际转速了。一般来讲会采用读取捕获比较寄存器(CCRx)的方式得到增量信息然后再除以固定的时间间隔从而得出平均角速度。
```c
int main(void){
uint32_t lastPosition = __HAL_TIM_GET_COUNTER(&htim3);
while (1){
// 延迟一段时间以便于测量更稳定的速率
HAL_Delay(100);
int currentPosition=__HAL_TIM_GET_COUNTER(&htim3);
float speed=(currentPosition-lastPosition)/((float)(100/1000));
printf("Current Speed:%f\n",speed);
lastPosition=currentPosition;
}
}
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim){
if(htim->Instance==TIM3){
// 中断处理逻辑...
}
}
```
以上即为使用 HAL 库实现 STM32F103C8T6 的编码器速度控制的主要过程概述。
阅读全文
相关推荐


















