搜索
查看: 19140|回复: 23

[STM32L476] 【NUCLEO-L476RG开发】+ 利用STM32CubeMX 和定时器1实现编码器检测

  [复制链接]

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
发表于 2015-11-11 23:40:48 | 显示全部楼层 |阅读模式
本帖最后由 dsjsjf 于 2015-11-12 20:32 编辑

1.第一步,打开STM32CubeMX,选择NUCLEO-L476RG开发板。
QQ截图20151111223811.png
2.选择好开发板后的显示是这样子的。
QQ截图20151111223847.png

3.点开TIM1, Combined Channels 中选择 Encoder Mode,这时,PA8和PA9被分配。单击PA10 选择GPIO_EXTI10,配置为中断口,用于连接编码器的Z相信号。
QQ截图20151111224323.png

4.时钟可以就保持默认配置。
QQ截图20151111224425.png

5.这一步比较重要,在Configuration选项卡中,点击TIM1, Encoder Mode 选择 TI1 and TI2 模式,也就是手册中的X4模式,我用的是1圈360脉冲的编码器,配置为X4模式,就是不管A相还是B相的上升沿、下降沿,计数器都会+1或-1。所以在Prescalerj里设置了3,也就是分频4(3+1),这样就还原了实际角度。Counter Period 设置为65535。其他的暂时不管,保持默认。
QQ截图20151111224543.png

6.GPIO配置,刚才所配置的PA10 选择 External Interrupt Mode with Rising edge trigger detection。当然 Falling edge也是可以的。
QQ截图20151111224610.png

7.点击NVIC,把EXTI line[15:10] interrupts 后面打上√。
QQ截图20151111231044.png

8.点击Project ---settings  设置一下,再点Generate code,生成代码。
QQ截图20151111224309.png QQ截图20151111225340.png

9.点击Open Project。
QQ截图20151111225443.png

10.打开工程后,添加代码。
(1)添加外部中断代码,我是添加在main.c文件中,USER CODE BEGIN 4 和 USER CODE END 4,自己添加的代码一定要在BEGIN x和END x之间,要不然下次更新时会被覆盖掉。这段代码的作用是编码器经过0点的时候,将计数器的值清0.
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
  switch(GPIO_Pin)
  {
  case GPIO_PIN_10:
    {
      __HAL_TIM_SET_COUNTER(&htim1, 0);
    }break;
  }
}
/* USER CODE END 4 */



(2)修改main函数,

int main(void)
{

  /* USER CODE BEGIN 1 */
  int16_t Angle;
  char TmpArray[10];
  /* USER CODE END 1 */

  /* MCU Configuration----------------------------------------------------------*/

  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();

  /* Configure the system clock */
  SystemClock_Config();

  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM1_Init();

  /* USER CODE BEGIN 2 */
  HAL_TIM_Encoder_Start(&htim1, TIM_CHANNEL_ALL);
  /* USER CODE END 2 */

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
  /* USER CODE END WHILE */

  /* USER CODE BEGIN 3 */
    Angle = (int16_t)(__HAL_TIM_GET_COUNTER(&htim1));//获取定时器的值,因为在配置的时候做了分频处理,所以这边角度直接等于COUNTER的值。这里做了一下强制转换,因为用到了负角度。
    sprintf(TmpArray, "%4d", Angle);//
    SetDispSubject(DISP_PART_RIGHT, TmpArray);//显示函数,具体代码就不放上来了,大家可以根据自己的方式实现。
  }
  /* USER CODE END 3 */

}

评分

参与人数 3ST金币 +32 收起 理由
ham2222 + 1 很给力!
大海-399550 + 1 赞一个!
沐紫 + 30

查看全部评分

回复

使用道具 举报

该用户从未签到

33

主题

1276

帖子

0

蝴蝶豆

论坛元老

最后登录
2020-12-19
发表于 2015-11-11 23:48:57 | 显示全部楼层
谢谢分享.png
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

147

帖子

0

蝴蝶豆

高级会员

最后登录
2019-11-29
发表于 2015-11-11 23:51:25 | 显示全部楼层
多谢分享。支持一个
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

415

帖子

0

蝴蝶豆

高级会员

最后登录
2016-11-24
发表于 2015-11-12 08:40:30 | 显示全部楼层
首先感谢楼主分享!过程讲的很详细,不过楼主工程文件是否忘记传了?硬件连接可否讲一下,用的什么编码器?
回复 支持 反对

使用道具 举报

该用户从未签到

12

主题

427

帖子

0

蝴蝶豆

高级会员

最后登录
2018-12-6
发表于 2015-11-12 08:50:05 | 显示全部楼层
顶顶顶顶
回复

使用道具 举报

该用户从未签到

2

主题

998

帖子

0

蝴蝶豆

论坛元老

最后登录
2020-4-8
发表于 2015-11-12 08:52:54 | 显示全部楼层
多谢分享。。。。
回复

使用道具 举报

该用户从未签到

41

主题

2582

帖子

282

蝴蝶豆

论坛元老

最后登录
2021-4-1
 楼主| 发表于 2015-11-12 08:54:33 来自手机 | 显示全部楼层
alvin_ 发表于 2015-11-12 08:40
首先感谢楼主分享!过程讲的很详细,不过楼主工程文件是否忘记传了?硬件连接可否讲一下,用的什么编码器? ...

谢谢提醒,晚上补充。
回复 支持 反对

使用道具 举报

该用户从未签到

16

主题

597

帖子

19

蝴蝶豆

论坛元老

最后登录
2022-1-19
发表于 2015-11-12 08:58:26 | 显示全部楼层
期待更多的分享!
回复 支持 反对

使用道具 举报

该用户从未签到

31

主题

1982

帖子

0

蝴蝶豆

论坛元老

最后登录
2023-8-16
发表于 2015-11-12 09:07:44 | 显示全部楼层
谢谢LZ分享
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

415

帖子

0

蝴蝶豆

高级会员

最后登录
2016-11-24
发表于 2015-11-12 09:15:07 | 显示全部楼层
dsjsjf 发表于 2015-11-12 08:54
谢谢提醒,晚上补充。

再次感谢楼主分享!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|论坛-意法半导体STM32/STM8技术社区

GMT+8, 2024-4-19 20:03 , Processed in 0.233659 second(s), 47 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表