常州 微网站,部门网站集约化建设方案,网站设计的公司,最新被百度收录的网站STM32CubeMx配置定时器的编码器模式
上次文章写了编码器是如何工作的#xff0c;今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。
编程思路#xff1a;
A相:TIM3_CH1
B相:TIM3_CH2
SWITCH:PB5#xff08;外部中断的方式#xff09;
实现效果今天就来用STM32F103C8T6的TIM3的通道1跟通道2编写一个编码器识别程序。
编程思路
A相:TIM3_CH1
B相:TIM3_CH2
SWITCH:PB5外部中断的方式
实现效果
编码器顺时针旋转编码器计数值 1
编码器逆时针旋转编码器计数值 -1
按下SWITCH编码器计数值值清 0
话不多说上教程
1.配置时钟
选择外部高速时钟源HSE 2.配置SWITCH管脚为外部中断模式默认上拉 选择中断模式触发下降沿有效 默认是上拉输入 添加用户标签为SWITCH 使能NVIC配置 3.配置定时器管脚为编码器模式
选择编码器模式分频值设置为2-1计数值设置为1自动重装在值1自动重载使能通道1,2都计数都是上升沿有效 4.配置时钟到72MHz
手动输入72MHz自动匹配 5.配置工程属性
填写工程名字选择工程路径选择工程平台KEIL MDK
6.配置工程代码属性
拷贝必要的库文件单独形成.c跟.h文件 7.生产工程并添加修改代码
直接打开工程修改必要代码 7.1修改定时器代码
添加一个自定义结构体 /* USER CODE BEGIN Private defines */typedef struct
{int Encoder_Val;int Encoder_Dir;
}EC11_t;extern EC11_t EC11;
/* USER CODE END Private defines */编写一个中断回调函数
编写回调函数逻辑代码
/* USER CODE BEGIN 0 */
EC11_t EC11;
/* USER CODE END 0 *//* USER CODE BEGIN 1 */
void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{uint8_t dir 0;if(htim htim3){dir __HAL_TIM_IS_TIM_COUNTING_DOWN(htim3);if(dir1){EC11.Encoder_Val;EC11.Encoder_Dir 1;}if(dir0){EC11.Encoder_Val--;EC11.Encoder_Dir -1;}}
}
/* USER CODE END 1 */
7.2修改外部中断代码
添加一个中断回调函数
/* USER CODE BEGIN 1 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{EC11.Encoder_Val 0;
}
/* USER CODE END 1 */7.3修改初始化代码 /* USER CODE BEGIN TIM3_Init 2 */__HAL_TIM_CLEAR_IT(htim3,TIM_IT_UPDATE);HAL_TIM_Encoder_Start(htim3, TIM_CHANNEL_ALL);__HAL_TIM_ENABLE_IT(htim3,TIM_IT_UPDATE);/* USER CODE END TIM3_Init 2 */
8.下载调试代码
现象1顺时针旋转编码器值加1 现象2顺时针旋转编码器值减1 按键按下编码器值清零 9.总结
至此编码器已经全部写完了。STM32CubeMx的使用比较方便注意一点就是如果修改代码尽量写到英文的注释中去这样即使再重新修改CubeMx配置重新生成代码也不会改变原来的程序否则原来的代码就没了别问我咋知道的血泪的教训啊