打印

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

[复制链接]
1798|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
沙发
東南博士|  楼主 | 2017-5-25 14:11 | 只看该作者
2.选择好开发板后的显示是这样子的。

2.png (124.6 KB )

2.png

使用特权

评论回复
板凳
東南博士|  楼主 | 2017-5-25 14:12 | 只看该作者
3.点开TIM1, Combined Channels 中选择 Encoder Mode,这时,PA8和PA9被分配。单击PA10 选择GPIO_EXTI10,配置为中断口,用于连接编码器的Z相信号。

3.png (145.16 KB )

3.png

使用特权

评论回复
地板
東南博士|  楼主 | 2017-5-25 14:13 | 只看该作者
4.时钟可以就保持默认配置。

4.png (417.35 KB )

4.png

使用特权

评论回复
5
東南博士|  楼主 | 2017-5-25 14:14 | 只看该作者
5.这一步比较重要,在Configuration选项卡中,点击TIM1, Encoder Mode 选择 TI1 and TI2 模式,也就是手册中的X4模式,我用的是1圈360脉冲的编码器,配置为X4模式,就是不管A相还是B相的上升沿、下降沿,计数器都会+1或-1。所以在Prescalerj里设置了3,也就是分频4(3+1),这样就还原了实际角度。Counter Period 设置为65535。其他的暂时不管,保持默认。

5.png (125.88 KB )

5.png

使用特权

评论回复
6
東南博士|  楼主 | 2017-5-25 14:14 | 只看该作者
6.GPIO配置,刚才所配置的PA10 选择 External Interrupt Mode with Rising edge trigger detection。当然 Falling edge也是可以的。

6.png (403.85 KB )

6.png

使用特权

评论回复
7
東南博士|  楼主 | 2017-5-25 14:15 | 只看该作者
7.点击NVIC,把EXTI line[15:10] interrupts 后面打上√。

7.png (439.8 KB )

7.png

使用特权

评论回复
8
東南博士|  楼主 | 2017-5-25 14:16 | 只看该作者
8.点击Project ---settings  设置一下,再点Generate code,生成代码。

8.png (141.67 KB )

8.png

使用特权

评论回复
9
東南博士|  楼主 | 2017-5-25 14:16 | 只看该作者
生成代码

8-2.png (353.24 KB )

8-2.png

使用特权

评论回复
10
東南博士|  楼主 | 2017-5-25 14:17 | 只看该作者
9.点击Open Project

9.png (369.97 KB )

9.png

使用特权

评论回复
11
東南博士|  楼主 | 2017-5-25 14:18 | 只看该作者
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 */

使用特权

评论回复
12
東南博士|  楼主 | 2017-5-25 14:19 | 只看该作者
(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 */

}

使用特权

评论回复
13
wangjiahao88| | 2017-5-31 11:00 | 只看该作者
请问一下,这个四倍频会增加精度吗?如果不是四倍频的话,与四倍频之间会有什么差距呢?

是不是 500线的四倍频与2000线的不倍频 精度有什么差距呢?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

382

主题

6081

帖子

34

粉丝