打印
[应用相关]

简单实用的编码器程序

[复制链接]
2950|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
waveforms|  楼主 | 2019-4-10 16:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
原贴链接:http://www.openedv.com/forum.php?mod=viewthread&tid=106395


下面的程序已在我的音量控制板上使用了几天,感觉还可以,这个程序的最大好处是简单明了。与大家分享。
用的是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);
  }
}


使用特权

评论回复
沙发
请叫我树人| | 2019-4-11 10:54 | 只看该作者
真是个好帖子!我要顶住啊! 感谢分享啊! 真是不错啊!好帖子啊!帮你顶住啊!

使用特权

评论回复
板凳
brucewoo| | 2019-4-11 16:56 | 只看该作者
感觉,外部中断的优先级比较高,你要看看系统定时器的优先级在它之上还是之下,否则中断内的delay可能有问题。
而且,在中断处理函数里加delay貌似不是很好的办法。

使用特权

评论回复
地板
zhuotuzi| | 2019-4-12 00:02 | 只看该作者
沙发是个什么鬼。

使用特权

评论回复
5
zhuotuzi| | 2019-4-12 00:02 | 只看该作者
多谢楼主分享。

使用特权

评论回复
6
wowu| | 2019-5-5 15:26 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
7
xiaoqizi| | 2019-5-5 15:27 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
8
木木guainv| | 2019-5-5 15:31 | 只看该作者
非常感谢楼主分享啊

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

32

主题

212

帖子

1

粉丝