OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5274|回复: 2

求STM32F767定时器编码器模式的配置方式!!!!!!

[复制链接]

2

主题

2

帖子

0

精华

初级会员

Rank: 2

积分
74
金钱
74
注册时间
2018-8-7
在线时间
18 小时
发表于 2019-11-30 11:24:33 | 显示全部楼层 |阅读模式
各位大神,我最近在用STM32F767的定时器3做编码器AB信号采集,但是一直都有问题,采的脉冲一直不对。有没有大神用F7做过这个配置,可否指导一下,分享一下配置的代码,万分感谢。
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手入门

积分
18
金钱
18
注册时间
2021-12-12
在线时间
5 小时
发表于 2022-3-18 16:09:13 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

2

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2022-3-22
在线时间
5 小时
发表于 2022-4-2 10:33:49 | 显示全部楼层
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"
#include "timer.h"

        extern TIM_HandleTypeDef TIM_HandleType;
        extern        uint32_t gPeriod;

        uint32_t cnt,b=0;

        int main(void)
        {
                        HAL_Init();                           //初始化HAL库   
                        Stm32_Clock_Init(336,8,2,7);          //设置时钟,168Mhz
                        delay_init(168);                       //初始化延时函数               
                  Encoder_Init();                 //所以定时器3的频率为84M/8400=10K,自动重装载为5000-1,那么定时器周期就是500ms
                         while(1)
                        {
                                 HAL_Delay(300);
                                 cnt = __HAL_TIM_GET_COUNTER(&TIM_HandleType);  //读取计数器中的值,即编码器走过的线数
                                 b=(TIM3->CR1&0X0010)>>4;                       //读取CR1寄存器中DIR位的值,判断正传还是反转
                        }
        }


#include "timer.h"
#include "led.h"

  TIM_HandleTypeDef TIM_HandleType;
        TIM_Encoder_InitTypeDef TIM_Encoder_InitType;
       
        uint32_t gPeriod = (2500*4)-1;
        int c=0;
       
void Encoder_Init()
{
                TIM_HandleType.Instance=TIM3;
          TIM_HandleType.Init.CounterMode   =TIM_COUNTERMODE_DOWN;
          TIM_HandleType.Init.ClockDivision =TIM_CLOCKDIVISION_DIV1; //定时器时基单元的配置中该功能是配置ETR外部触发时钟分频的
          TIM_HandleType.Init.Period=gPeriod;                        //计数器的装载值,即编码器转一圈的最大线数值,若采用上升下降都计数,则该值为线数*4-1;
          TIM_HandleType.Init.Prescaler=0;                           //编码器模式下,计数器分频数为0即可
          TIM_HandleType.Init.AutoReloadPreload=TIM_AUTORELOAD_PRELOAD_DISABLE;//高级定时器时才使用自动重装载功能
         
          TIM_Encoder_InitType.EncoderMode  = TIM_ENCODERMODE_TI12;    //为了提高精度,一般采用上升和下降沿都计数
                TIM_Encoder_InitType.IC1Polarity  = TIM_ICPOLARITY_RISING;   //通道一的捕获极性不反相
                TIM_Encoder_InitType.IC1Selection = TIM_ICSELECTION_DIRECTTI;//通道一的信号直接映射到IC1上
                TIM_Encoder_InitType.IC1Prescaler = TIM_ICPSC_DIV1;          //通道一信号不分频,即发生一次就捕获一次
                TIM_Encoder_InitType.IC1Filter = 0;                          //输入捕获模式中,通道的采样频率和数字滤波器长度根据CKD[1:0]位来设置,一般不设置分频
                TIM_Encoder_InitType.IC2Polarity  = TIM_ICPOLARITY_RISING;
                TIM_Encoder_InitType.IC2Selection = TIM_ICSELECTION_DIRECTTI;
                TIM_Encoder_InitType.IC2Prescaler = TIM_ICPSC_DIV1;
                TIM_Encoder_InitType.IC2Filter = 0;

                HAL_TIM_Encoder_Init(&TIM_HandleType, &TIM_Encoder_InitType);
          HAL_TIM_Encoder_Start(&TIM_HandleType, TIM_CHANNEL_ALL);
          
}

void HAL_TIM_Encoder_MspInit(TIM_HandleTypeDef *htim)
{  
  GPIO_InitTypeDef GPIO_InitStruct ;
       
  if(htim->Instance==TIM3)
                {
                        __HAL_RCC_TIM3_CLK_ENABLE();
                        __HAL_RCC_GPIOA_CLK_ENABLE();
                        __HAL_RCC_GPIOC_CLK_ENABLE();

                        GPIO_InitStruct.Pin   = GPIO_PIN_6;
                        GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;
                        GPIO_InitStruct.Pull  = GPIO_PULLUP;
                        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
                        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
                        HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

                        GPIO_InitStruct.Pin   = GPIO_PIN_7;
                        GPIO_InitStruct.Mode  = GPIO_MODE_AF_PP;
                        GPIO_InitStruct.Pull  = GPIO_PULLUP;
                        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;
                        GPIO_InitStruct.Alternate = GPIO_AF2_TIM3;
                        HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);
                       
                }

}


纯属自己理解写的,如果有什么不对的地方感谢批评指正。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 00:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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