首页 > 其他分享 >ADC按键电路实现

ADC按键电路实现

时间:2023-10-24 15:35:57浏览次数:39  
标签:按键 按下 电路 InitStructure ADC ADC1 GPIO

在程序设计以及硬件电路设计中,通常使用GPIO连接按键,通过检测外部按键按下的高低电平实现按键的检测。当我们需要多个按键且GPIO资源不够的时候,我们可以利用MCU的ADC功能,实现对按键的检测。

ADC按键检测电路如下:

当没有按键按下时,ADC检测IO口电压为3.3V。

当第1个按键按下时,ADC检测IO口电压为825mV,如下图:

当第2个按键按下时,ADC检测IO口的电压为1.32V,如下图:

 以此类推,当第3、4、5个按键按下时,电压分别如下图:

从上图结果可知,不同按键按下,ADC会采集到不到的电压,通过该原理,可以利用ADC实现对按键的检测,具体实现代码可参考下程序:

void adc_Init(void)
{
    ADC_InitTypeDef ADC_InitStructure;
    GPIO_InitTypeDef GPIO_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能GPIOA时钟和ADC

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC时钟分频为6分频
    ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;   //配置ADC为独立模式
    ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //设置在单通道模式下执行转换
    ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;  //设置在单次模式下执行转换
    ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //设置转换不是由外部触发启动
    ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //设置ADC数据右对齐
    ADC_InitStructure.ADC_NbrOfChannel = 1;                //顺序进行规则转换的ADC通道的数目
    ADC_Init(ADC1, &ADC_InitStructure);                    //根据ADC_InitStructure中指定的参数初始化ADC1寄存器

    ADC_Cmd(ADC1, ENABLE); //使能ADC1

    ADC_ResetCalibration(ADC1); //重置ADC1校准寄存器。

    while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束

    ADC_StartCalibration(ADC1); //开启AD校准

    while(ADC_GetCalibrationStatus(ADC1));      //等待校准结束
}

u16 get_adc(u8 ch)
{
    ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5 );//为所选ADC常规通道配置其在序列器中的相应列组及其采样时间。

    ADC_SoftwareStartConvCmd(ADC1, ENABLE); //使能ADC1软件启动转换

    while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC )); //等待转换结束

    return ADC_GetConversionValue(ADC1); //返回常规通道的最后一个ADC1转换结果数据
}

u16 Get_Adc_Average(u8 ch,u8 times)
{
    u32 temp_val=0;
    u8 t;
    for(t=0;t<times;t++)
    {
        temp_val+=get_adc(ch);
        Delay_Ms(5);
    }
    return temp_val/times;
}
/*********************************************************************
 * @fn      main
 *
 * @brief   Main program.
 *
 * @return  none
 */
int main(void)
{
    u16 adc;
    u16 sw=0;
    u8 key=0;
    float temp;



    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
    Delay_Init();
    USART_Printf_Init(115200);
    adc_Init();

    printf("SystemClk:%d\r\n",SystemCoreClock);
    printf("This is printf example\r\n");

    while(1)
    {
        adc=Get_Adc_Average(ADC_Channel_1,10);
        temp=(float)adc*(3.3/4096);
//        printf("adc:%d\r\n",adc);
//        printf("volate:%0.2f\r\n",temp);

        if(temp>1.62&&temp<1.66)
        {
            sw=1;
        }
        else if(temp>2.86&&temp<2.90)
        {
            sw=2;
        }
        else if(temp>2.95&&temp<3.05)
        {
            sw=3;
        }
        else if(temp>3.13&&temp<3.15)
        {
            sw=4;
        }

        key = sw;
        sw=0;
        adc=0;
        temp=0;
        switch(key)
        {
            case 1:
                printf("sw1 press\r\n");
                key = 0;
                break;
            case 2:
                printf("sw2 press\r\n");
                key = 0;
                break;
            case 3:
                printf("sw3 press\r\n");
                key = 0;
                break;
            case 4:
                printf("sw4 press\r\n");
                key = 0;
                break;
            default:
                break;
        }
        Delay_Ms(50);

    }
}

 

标签:按键,按下,电路,InitStructure,ADC,ADC1,GPIO
From: https://www.cnblogs.com/liaigu/p/17784909.html

相关文章

  • 模拟集成电路设计系列博客——3.3.1 带隙电压基准概念
    3.3.1带隙电压基准概念在模拟电路模块,尤其是数据转换模块中,一个非常重要的组件是电压参考。理想情况下,这个模块输出一个固定的已知幅度的直流电压,并且不随温度发生变化。通过这个模块再结合一个精确的电阻可以提供一个稳定的直流电流。有一系列手段可以产生集成电路中的电压参考......
  • 3-2 独立按键控制led状态
    #include<REGX52.H>voidDelay(unsignedintxms){ unsignedchari,j; while(xms) { i=2; j=239; do { while(--j); }while(--i); xms--; }}voidmain(){ while(1) { if(P3_1==0) //±íʾ°´ÏÂk1 { Delay(20); //????......
  • 一个古老的高压限流电路分析
        网络上找到吉时利的Model486和487的图纸,这里只分析一下高压电源部分的输出电路,截图如下,主要分析红框内部的电路。红框外部主要就是控制信号和供电电路,以及DAC。电源设计的挺有意思的,需要低压电路稳定后,高压才可以输出,且高压部分用的软启动方式,避免上电就有高压输出。......
  • 模拟集成电路设计系列博客——3.2.2 改进恒定跨导电路
    3.2.2改进恒定跨导电路可以将宽摆幅电流镜结合到上小节所述的恒定跨导偏置电路中。这种修改可以显著降低由于晶体管有限输出阻抗导致的二阶效应,同时并不过于影响信号摆幅。完整电路如下图所示[McLaren,2001]。这个电路是前面介绍过的固定跨导电路的改进版本,引入了宽摆幅电流镜......
  • 模拟集成电路设计系列博客——3.2.1 恒定固定跨导电路
    3.2.1基本恒定跨导电路我们知道晶体管的跨导可能是模拟放大器中最重要的参数,因此必须要保持稳定。其稳定性可以通过[Steininger,1990]首次采用的电路来实现,该电路将晶体管的跨导匹配到一个电阻的电导上。作为结果,对于一阶效应来说,晶体管的跨导独立于电源电压以及工艺和温度误差......
  • 开关电源DC-DC,LDO稳压电路设计
    在使用DC-DC或LDO芯片做电源稳压的时候,只需要关注VIN、SW、与GND三个脚的电路设计,即可得到更平稳的电压。1、在VIN一般要并联一个大电容(22uF或4.7uF)得到相对平稳电压,和一个小电容(0.1uF、100nF、10nF都可以)去除毛刺噪声,在layout时,小电容越靠近VIN脚和GND脚越好,然后接大电容,一般......
  • C#实现鼠标进入按键范围后按键自动窗体内位置移动
    新建winform窗体程序添加button控件 在事件中选择MouseEnter 代码如下privatevoidbutton_MouseEnter(objectsender,EventArgse){//给按钮一个新的坐标//这个按钮活动的最大宽度就是窗体的宽度减去按钮的宽度intx=this.ClientSize.Width-button.Widt......
  • 02_电路
    电路逻辑门电路的分类高电平和低电平的含义正逻辑:​ 高电平为3.5~5V​ 低电平为0~0.3V负逻辑:​ 高电平为0~0.3V​ 低电平为3.5V~5V电位值非固定​ 单片机:3.5~5V为高电平​ ARM芯片:3~3.3V为高电平与门电路或门非门异或逻辑同或逻辑与非门电......
  • 05_基本放大电路
    基本放大电路电容C1和C2起到隔直通交的作用,隔绝UCc的直流电,保留Es和Uo的交流电Ucc为电路供电,使三极管大Ube>0.7V,防止进入截止区各器件的取值范围Uce为什么会被反相会出现的情况Q点与Rb的关系Q点与Vcc的关系Q点与Rc的关系不足解决方案加电容C......
  • 模拟集成电路设计系列博客——3.1.3 稳压电路
    3.1.3稳压电路稳压器的目标是产生一个低噪声并能提供电流的电压源。他们一般来说用于这种情节:当一个关键模拟电路必须和其他的电路工作在同一个电源供电下时。如下图所示,其他的电路向共用的电源中引入了很大的噪声,使用稳压器可以为关键电路提供一个更加干净的电源。数字电路一般......