OpenEdv-开源电子网

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

简单实用的编码器程序

[复制链接]

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
发表于 2017-7-9 14:00:45 | 显示全部楼层 |阅读模式
本帖最后由 rjx007 于 2017-7-9 14:10 编辑

下面的程序已在我的音量控制板上使用了几天,感觉还可以,这个程序的最大好处是简单明了。与大家分享。
用的是EC11编码器,用用了一个外部中断,编码器A相接中断。

头文件:ec11.h
#ifndef _ec11_H
#define _ec11_H
#include "stm32f10x.h"

extern u8  VOLUME_1;

#define EA GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1)   //PA1
#define EB GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2)   //PA1

void ec11_init(void);
#endif



void ec11_init(void)           //编码器管脚配置及中断初始化
{
        GPIO_InitTypeDef GPIO_InitStructure;          //声明一个结构体变量,用来初始化GPIO
        
        EXTI_InitTypeDef EXTI_InitStructure;

        NVIC_InitTypeDef NVIC_InitStructure;
        
        /* 开启GPIO时钟 */
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);
        
        /*  配置GPIO的模式和IO口 */
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1 |GPIO_Pin_2 ;           //选择你要设置的IO口
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;//上拉输入  
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;           //设置传输速率
        GPIO_Init(GPIOA,&GPIO_InitStructure);                  /* 初始化GPIO */               
         
        GPIO_EXTILineConfig(GPIO_PortSourceGPIOA, GPIO_PinSource1);//选择GPIO管脚用作外部中断线路
        //此处一定要记住给端口管脚加上中断外部线路
        /* 设置外部中断的模式 */
        EXTI_InitStructure.EXTI_Line=EXTI_Line1;
        EXTI_InitStructure.EXTI_Mode=EXTI_Mode_Interrupt;
        EXTI_InitStructure.EXTI_Trigger=EXTI_Trigger_Falling;
        EXTI_InitStructure.EXTI_LineCmd = ENABLE;
        EXTI_Init(&EXTI_InitStructure);
        
        /* 设置NVIC参数 */        
        //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);                 
        NVIC_InitStructure.NVIC_IRQChannel = EXTI1_IRQn;         //打开EXTI2的全局中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0; //抢占优先级为0
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;                  //响应优先级为0
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;                   //使能
        NVIC_Init(&NVIC_InitStructure);               
}


void EXTI1_IRQHandler(void)
{
  if(EXTI_GetITStatus(EXTI_Line1) != RESET)
  {               
     delay_ms(2);//消抖
               
    if(EA!=EB)
        {
                 if(VOLUME_1>0)    //最小值
                    { VOLUME_1--;}
                else
                    {VOLUME_1=0;}
         }
    else
         {
                 if(VOLUME_1<100)     //最大值
                     { VOLUME_1++;}
                 else
                     {VOLUME_1=100;}                        
                                
          }
    EXTI_ClearITPendingBit(EXTI_Line1);
  }
}



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

使用道具 举报

120

主题

7878

帖子

13

精华

资深版主

Rank: 8Rank: 8

积分
12012
金钱
12012
注册时间
2013-9-10
在线时间
427 小时
发表于 2017-7-9 14:20:57 | 显示全部楼层
回复 支持 反对

使用道具 举报

0

主题

12

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2376
金钱
2376
注册时间
2013-11-11
在线时间
147 小时
发表于 2017-7-21 10:50:06 | 显示全部楼层
谢谢楼主分享。。。
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
发表于 2017-7-24 10:42:59 | 显示全部楼层
能把你的电路原理图发一下看看吗
回复 支持 反对

使用道具 举报

5

主题

62

帖子

1

精华

中级会员

Rank: 3Rank: 3

积分
426
金钱
426
注册时间
2016-3-9
在线时间
75 小时
发表于 2017-7-24 10:52:38 | 显示全部楼层
你这个把编码器的A相接PA1中断,B相接PA2普通管脚,C相接地吗,A,B相接3.3V上拉电阻?发个原理图看看,谢谢
回复 支持 反对

使用道具 举报

64

主题

249

帖子

1

精华

金牌会员

Rank: 6Rank: 6

积分
1073
金钱
1073
注册时间
2017-6-10
在线时间
279 小时
 楼主| 发表于 2017-7-24 16:29:55 | 显示全部楼层
本帖最后由 rjx007 于 2017-7-24 17:00 编辑

A相设置为外部中断,B相为普通IO口,C接地。我没有用外接上拉电阻,只是设置内部上拉,如果正转时音量反而减小,那只要将音量增和减的语句交换位置即可,即将if.....   else....里的语句交换一下位置即可。以上代码经使用,还是比较可靠的。
这个音量控制板有如下功能:红外遥控器自学习功能(只要是常用的NEC格式的都行),第一次使用时只要学习一次即可。所有设置都可记忆(输入端口选择,本次音量值关机记忆,红外遥控器学习等,保存在24C02中),开机大音量保护,100级指数式音量平滑调节,音量控制用12个继电器,平衡电路要两块继电器板。非常实用,这个代码是我从用了多年的PIC,AVR单片机上移植过来的。是我学习STM32 的第一个成果。用的是STM32F103C8T6.
我画电路板一般不画电路图,只是将单片机的所有IO脚的用途写下来,画PCB时就按这个画就行了。
一楼代码的注释有几处笔误,请看官包涵。代码是没有错误的。











2017748151376138[1].jpg
2017748173941921[1].jpg
回复 支持 反对

使用道具 举报

0

主题

11

帖子

0

精华

新手上路

积分
37
金钱
37
注册时间
2021-10-26
在线时间
9 小时
发表于 2021-10-26 21:15:58 | 显示全部楼层
谢谢楼主分享。。。
回复 支持 反对

使用道具 举报

0

主题

1

帖子

0

精华

初级会员

Rank: 2

积分
61
金钱
61
注册时间
2015-7-1
在线时间
5 小时
发表于 2025-3-3 09:54:56 | 显示全部楼层
你这个程序,在编码器旋转到一直接通的位置上,程序会不会卡死
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-4-11 06:05

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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