STM32学习笔记——基于正点原子例程编码器模式小结

最近一段时间学习了,STM32f4的编码器功能,经过自己探索和他人的热心帮助,对于编码器模式有了一定了解。STM32f4单片机提供编码器模式,以便用户可以直接使用编码器模式读出编码器所传输的位置信息,供单片机进行下一步操作。
本文章所使用的编码器为直流电机尾部自带的编码器。
学习STM32编码器模式,首先应该知道其模式返回的值所代表的含义是什么,正交编码器模式在对应的定时器数据寄存器TIMX->CNT中的值反映的是编码器所处的“位置”,或者所是角度(个人理解就是其所记录的脉冲次数),正负号代表编码器是正转还是反转。开始编程之前,首先应该知道自己所用的编码器的线数(所谓线数,个人理解就是电机转一圈,所使用的编码器单独一相所产生的脉冲数是多少),常见的有130、260、390、780。如果实在不知道自己所用的编码器的线数,可以在编编好程序后,手动把电机转一圈,使用串口读出此时定时器数据寄存器TIMX->CNT中的值然后除以自己所设置的是几倍频,对照编码器常用的线数规格,取接近值。

STM32f4正交编码器设置步骤

本设置以16位通用定时器TIM4为例

步骤一:设置初始化结构体变量

    GPIO_InitTypeDef GPIO_InitStructure;//定时器4对应IO端口初始化变量TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器4初始化变量TIM_ICInitTypeDef TIM_ICInitStructure;//定时器4输入捕获参数

步骤二:时钟设置

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//GPIO时钟设置RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//TIM4时钟设置

步骤三:GPIO口设置

    GPIO_StructInit(&GPIO_InitStructure); //端口复位,避免干扰GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;//初始化TIM4ch1和ch2通道端口,D12、D13        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF;//端口复用模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//时钟频率100MHZGPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD 端口                         GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);//GPIOD12、D13复用为TIM4_CH1,CH2

步骤四:TIM4定时器模式设置

    TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//结构体参数设置设为默认值TIM_TimeBaseStructure.TIM_Period = 520-1;//自动重装载值为520,这里我采用二倍频技术,编码器线数为260  TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数为1TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//对TIM4初始化

步骤五:TIM4输入捕获模式参数设置

    TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);//正交编码器模式,A,B两相都记录上升沿跳变,二倍频技术 TIM_ICStructInit(&TIM_ICInitStructure); //结构体参数设置设为默认值TIM_ICInitStructure.TIM_ICFilter = 0;  //滤波次数为1TIM_ICInit(TIM4, &TIM_ICInitStructure);//输入捕获初始化TIM_ClearFlag(TIM4, TIM_FLAG_Update); //TIM4更新中断标志清零

步骤六:其余参数设置

    TIM_SetCounter(TIM4,0);//TIM4数据寄存器清零TIM_Cmd(TIM4, ENABLE); //使能TIM4

步骤七:读取函数

//定时器5中断服务函数
void TIM5_IRQHandler(void)
{if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //是否产生更新(溢出)中断{printf("\\n编码器值为:%d\n",TIM4->CNT);}TIM_ClearITPendingBit(TIM5,TIM_IT_Update);  //清空TIM5中断标志位
}

整体代码

    GPIO_InitTypeDef GPIO_InitStructure;//定时器4对应IO端口初始化变量TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;//定时器4初始化变量TIM_ICInitTypeDef TIM_ICInitStructure;//定时器4输入捕获参数RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);//GPIO时钟设置RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD, ENABLE);//TIM4时钟设置GPIO_StructInit(&GPIO_InitStructure); //端口复位,避免干扰GPIO_InitStructure.GPIO_Pin = GPIO_Pin_12 | GPIO_Pin_13;//初始化TIM4ch1和ch2通道端口,D12、D13        GPIO_InitStructure.GPIO_Mode =  GPIO_Mode_AF;//端口复用模式GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;//浮空模式GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//时钟频率100MHZGPIO_Init(GPIOD, &GPIO_InitStructure); //初始化GPIOD 端口                         GPIO_PinAFConfig(GPIOD,GPIO_PinSource12,GPIO_AF_TIM4);GPIO_PinAFConfig(GPIOD,GPIO_PinSource13,GPIO_AF_TIM4);//GPIOD12、D13复用为TIM4_CH1,CH2TIM_TimeBaseStructInit(&TIM_TimeBaseStructure);//结构体参数设置设为默认值TIM_TimeBaseStructure.TIM_Period = 520-1;//自动重装载值为520,这里我采用二倍频技术,编码器线数为260  TIM_TimeBaseStructure.TIM_Prescaler = 0;//预分频系数为1TIM_TimeBaseStructure.TIM_ClockDivision =TIM_CKD_DIV1; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure);//对TIM4初始化TIM_EncoderInterfaceConfig(TIM4, TIM_EncoderMode_TI12, TIM_ICPolarity_Rising ,TIM_ICPolarity_Rising);//正交编码器模式,A,B两相都记录上升沿跳变,二倍频技术 TIM_ICStructInit(&TIM_ICInitStructure); //结构体参数设置设为默认值TIM_ICInitStructure.TIM_ICFilter = 0;  //滤波次数为1TIM_ICInit(TIM4, &TIM_ICInitStructure);//输入捕获初始化TIM_ClearFlag(TIM4, TIM_FLAG_Update); //TIM4更新中断标志清零TIM_SetCounter(TIM4,0);//TIM4数据寄存器清零TIM_Cmd(TIM4, ENABLE); //使能TIM4//定时器5中断服务函数
void TIM5_IRQHandler(void)
{if(TIM_GetITStatus(TIM5,TIM_IT_Update)==SET) //是否产生更新(溢出)中断{printf("\\n编码器值为:%d\n",TIM4->CNT);}TIM_ClearITPendingBit(TIM5,TIM_IT_Update);  //清空TIM5中断标志位
}

本文之前采用四倍频设置,但问过小伙伴后,小伙伴说官网的四倍频程序有问题,建议我我采用二倍频设置,自己也经过实验验,发现当正交编码器模式设置四倍频时,电机转一圈所得的脉冲数是二倍频模式的一半,二倍频为精度最高的模式,所以设置为二倍频设置

STM32学习笔记——基于正点原子例程编码器模式小结相关推荐

  1. STM32学习笔记3 正点原子miniSTM32串口通信实验

    初学者学习总结,如有错误,请大神指正 目的:用 STM32 的串口来发送和接收数据. 一.STM32串口 1.1 简介 ALIENTEK MiniSTM32 V3 版开发板选择的是 STM32F103 ...

  2. STM32 学习笔记 -- 基于stm32f4的看门狗配置和实验代码

    基于stm32f4的看门狗配置和实验代码 以下本人对stm32f4xx的独立看门狗和窗口看门狗学习.理解和总结,程序的说明和解释均在注释中,仔细阅读不难理解.我已经过验证,有问题或错误请指出. 版权声 ...

  3. STM32学习笔记(十) CAN通讯测试(环回模式)

    1.CAN通讯的理解 想学习CAN通讯,那么要对通讯协议有一定的认知.通讯协议是指通信双方对数据传送控制的一种约定.约定中包括对数据格式,同步方式,传输速度,传送步骤,检纠错方式以及控制字符定义等问题 ...

  4. STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板

    STM32下载程序至SRAM--基于正点原子精英STM32F103ZET6开发板 如题,由于STM32的FLASH烧写寿命在1万次左右,对于本人这样的改一行代码都想下载到开发板中测试的强迫症患者,真是 ...

  5. stm32f407 6路串口dma如何配置_stm32cubeMX学习十、扫码模块程序开发(基于正点原子STM32F407开发板)...

    本程序编写基于正点原子STM32F407开发板. 本文使用的扫码模块是下面这个品牌. 扫码模块的应用场景非常广泛,我们可以上百度搜索一下: 等等. 今天就来说说如何在开发板上实现控制它吧,打开数据手册 ...

  6. STM32学习笔记(三)丨中断系统丨EXTI外部中断(对射式红外传感器计次、旋转编码器计次)

    本篇文章包含的内容 一.中断系统 1.1 中断的定义 1.2 中断优先级 1.3 中断的嵌套 1.4 STM32中的中断系统 1.4.1 STM32的中断资源 1.4.2 嵌套中断向量控制器 NVIC ...

  7. STM32学习笔记(9)——(I2C续)读写EEPROM

    STM32学习笔记(9)--(I2C续)读写EEPROM 一.概述 1. 背景介绍 2. EEPROM简介 二.AT24C02--常用的EEPROM 1. 电路原理图 2. 写操作 (1)按字节写操作 ...

  8. 基于正点原子F103精英板和CubeIDE的Hal库LCD驱动移植(从零开始)

    最近在学习王维波老师的<STM32Cube高效开发教程>,王老师移植的是普中科技的驱动,而我手动移植了一下正点原子的lcd驱动,看了网上的诸多教程,有的博客存在一些bug,于是乎手动整理了 ...

  9. 嵌入式学习笔记——基于Cortex-M的单片机介绍

    基于Cortex-M的单片机介绍 前言 1生产厂商及其产品线 1.1ARM单片机的产品线 1.2命名规则 作业1 2习单片机的资料准备 2.1STM32开发所需手册 2.1.1芯片的数据手册 芯片基本 ...

最新文章

  1. vs项目移植到linux运行,VS2008项目移植到Linux
  2. Elasticsearch之数据建模
  3. C#之任务,线程和同步
  4. linux查看服务器设备信息命令dmidecode
  5. cocoapods的安装(这真是一个神奇的东西,每次安装的方法都不一样,而且很容易出现各种各样的错误)...
  6. the params of sys aud mod req msgs from TV
  7. @程序员,入门爬虫看这一篇就够了!
  8. 汇编语言二进制转十进制_汇编语言笔记(一)——基础知识
  9. Java核心技术卷1 如何阅读?
  10. linux查看设备网卡型号,linux查看网卡型号
  11. 技术自查番外篇六:死锁及解决办法
  12. Keil MDK编译后生产的.axf文件用什么打开?
  13. c++入门 简单语句 空语句 作用域和块 复合语句
  14. c语言黑熊,BLACK BRUIN黑熊扭矩马达C5510000AA
  15. 【产品】共享单车APP需要增加导航功能吗?
  16. vue尚品汇商城项目-day00【项目介绍:此项目是基于vue2的前台电商项目和后台管理系统】
  17. 基于单片机心率监测的LED灯辅助睡眠系统设备-毕业设计
  18. PyTorch:Bi-LSTM的文本生成
  19. 知乎周源微信_每周源代码36-PDC,BabySmash和Silverlight图表
  20. Java 获取姓氏的笔画数

热门文章

  1. Vue中状态管理——Vuex
  2. Linux系统上文件压缩和解压相关
  3. 汉字怎么转换成十六进制
  4. NodeMCU文档中文翻译 7 DHT温湿度传感器模块
  5. 内容安全策略(CSP)
  6. 计算机网络/通信 常用词和基本常识!(很有用的东西哦~~)
  7. 微信裂变涨粉如何实操效果最好
  8. 合作升级!阿里宣布入股哔哩哔哩2400万股,占比8%
  9. mysql sum 重复计算_mysql join sum时数据重复问题及解决方案
  10. Tudor.CutViewer.Lathe.v2.2.DC250403