OpenEdv-开源电子网

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

STM32 F1 编码器模式的相关疑惑

[复制链接]

4

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2015-10-7
在线时间
32 小时
发表于 2019-7-5 16:36:37 | 显示全部楼层 |阅读模式
本帖最后由 伟好好学习 于 2019-7-5 16:36 编辑

void Time3_Init_Config(u16 arr,u16 psc)
{
        TIM_TimeBaseInitTypeDef         TIM_TimeBaseStructure;
        NVIC_InitTypeDef                         NVIC_InitStructure;
        GPIO_InitTypeDef                         GPIO_InitStructure;
        TIM_ICInitTypeDef                        TIM_ICInitStructure;
        
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                //使能Timer3时钟
        
#ifdef TIME3_GPIO
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
         
        GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_6 | GPIO_Pin_7;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入浮空输入模式
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStructure);
        //TIM3_CH3----PB0;TIM3_CH4------PB1
//        GPIO_InitStructure.GPIO_Pin        = GPIO_Pin_0 | GPIO_Pin_1;
//        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //选择输入浮空输入模式
//        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
//        GPIO_Init(GPIOB, &GPIO_InitStructure);
#endif
        
        TIM_TimeBaseStructure.TIM_Period = arr;                                        //设置在下一个更新事件装入活动的自动重装载寄存器周期的值(计数到5000为500ms)
        TIM_TimeBaseStructure.TIM_Prescaler = psc;                                        //设置用来作为TIMx时钟频率除数的预分频值(10KHz的计数频率)
        TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1;                //设置时钟分割:TDTS = TIM_CKD_DIV1
        TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;        //TIM向上计数模式
        TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);                                //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位

#ifdef TIME3_Encoder
        TIM_DeInit(TIM3);
        TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);                //TIM_ICPolarity_Falling
        TIM_ICStructInit(&TIM_ICInitStructure);
    TIM_ICInitStructure.TIM_ICFilter = 6;//ICx_FILTER;
    TIM_ICInit(TIM3, &TIM_ICInitStructure);
        
        TIM3->CNT = Encoder_Init;
#endif

        /*中断优先级NVIC设置*/
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;                                //TIM3中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;        //先占优先级1级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                        //从优先级1级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                                //使能IRQ通道
        NVIC_Init(&NVIC_InitStructure);                                                         //初始化NVIC寄存器
        
        TIM_ClearFlag(TIM3, TIM_FLAG_Update);                                                // Clear all pending interrupts
        TIM_ITConfig(TIM3, TIM_IT_Update, ENABLE );                                 //使能TIM3指定的中断
        
        TIM_Cmd(TIM3, ENABLE);                                                                          //使能TIMx外设
}

这个是我自己按照网上的信息自己写的编码器的配置函数,我在测试有关编码器模式下的2倍频和4倍频的时候出现了一些不解。
当我把TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);函数的配置参数TIM_EncoderMode_TI1变成TIM_EncoderMode_TI12时,编码器可以以4倍频的方式输出计数,而此时不论后面的参数TIM_ICPolarity_Rising,是上升沿还是下降沿,还是两个沿都检测时,并不影响是否为4倍频输出。(例如200线的编码器此时转一圈变换800个计数)
而将配置参数变为TIM_EncoderMode_TI1时,此时不论后面的参数TIM_ICPolarity_Rising,是上升沿还是下降沿,还是两个沿都检测时,并不影响是否为2倍频输出。(例如200线的编码器此时转一圈变换400个计数).所以我的理解与我刚开始看网上资料有所偏差,刚开始以为是同时满足TIM_EncoderMode_TI12和TIM_ICPolarity_BothEdge这两个参数的情况下才会输出4倍频的计数,然后经过实际检测计算,却只是改变TIM_EncoderMode_TI12->TIM_EncoderMode_TI1/TIM_EncoderMode_T2这个参数时就会改变倍频的输出。所以后面的极性参数对倍频并没有影响,仅仅只是规定检测方式而已?希望懂的大神留言指导,谢谢了。


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

2

主题

4

帖子

0

精华

新手上路

积分
45
金钱
45
注册时间
2019-7-5
在线时间
14 小时
发表于 2019-7-5 20:13:34 | 显示全部楼层
您好我想请问一下您是在做编码器的信号接收吗?
回复 支持 反对

使用道具 举报

4

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2015-10-7
在线时间
32 小时
 楼主| 发表于 2019-7-25 20:11:56 | 显示全部楼层
knishinai 发表于 2019-7-5 20:13
您好我想请问一下您是在做编码器的信号接收吗?

是的,已经做好了
回复 支持 反对

使用道具 举报

0

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2019-6-22
在线时间
10 小时
发表于 2019-7-27 10:46:29 | 显示全部楼层
怎么配置只是一个口读脉冲
回复 支持 反对

使用道具 举报

4

主题

36

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
289
金钱
289
注册时间
2015-10-7
在线时间
32 小时
 楼主| 发表于 2019-8-6 18:09:17 | 显示全部楼层
林大杨 发表于 2019-7-27 10:46
怎么配置只是一个口读脉冲

TIM_EncoderInterfaceConfig(TIM3,TIM_EncoderMode_TI1,TIM_ICPolarity_Rising, TIM_ICPolarity_Rising);   
你改写上面这句话试试
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-5 09:22

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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