你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 16908|回复: 23

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

  [复制链接]

41

主题

2476

回帖

282

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 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

主题

1243

回帖

0

蝴蝶豆

论坛元老

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

使用道具 举报

3

主题

144

回帖

0

蝴蝶豆

高级会员

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

使用道具 举报

8

主题

407

回帖

0

蝴蝶豆

高级会员

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

使用道具 举报

12

主题

415

回帖

0

蝴蝶豆

高级会员

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

使用道具 举报

2

主题

996

回帖

0

蝴蝶豆

论坛元老

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

使用道具 举报

41

主题

2476

回帖

282

蝴蝶豆

论坛元老

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

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

使用道具 举报

14

主题

521

回帖

19

蝴蝶豆

论坛元老

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

使用道具 举报

31

主题

1951

回帖

0

蝴蝶豆

论坛元老

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

使用道具 举报

8

主题

407

回帖

0

蝴蝶豆

高级会员

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

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

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版