zoukankan      html  css  js  c++  java
  • STM32 ADC单通道采集 (STM32F103C8T6 ADC1的0通道 )

    // STM32F103C8T6 的ADC1 通道有10路,分别是:
    // 10 脚PA0 ADC12_IN0
    // 11 脚PA1 ADC12_IN1
    // 12 脚PA2 ADC12_IN2
    // 13 脚PA3 ADC12_IN3
    // 14 脚PA4 ADC12_IN4
    // 15 脚PA5 ADC12_IN5
    // 16 脚PA6 ADC12_IN6
    // 17 脚PA7 ADC12_IN7
    // 18 脚PA8 ADC12_IN8
    // 19 脚PA9 ADC12_IN9
    // ADC12 意为可配成ADC1或ADC2,不是有ADC12
    //以下是main.c 程序;

    #include "stm32f10x.h"
    #include "stm32f10x_tim.h"
    #include "stm32f10x_rcc.h"
    #include "stm32f10x_gpio.h"
    #include "stm32f10x_adc.h"

    float adc_data=0,dyzh=0; //采集值变量,电压显示值变量
    //引用请指明出处https://www.cnblogs.com/beiyhs/p/12320695.html          ** 北有寒山 ***

    void ADC_GPIO_Init(void)                            //ADC-GPIO输入引脚配置,在此可以设置10路外部输入通道
    {
    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); //使能AHB预分频器到端口A的开关
    // RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//引脚复用 进行重映射时要开启AFIO 时钟

    GPIO_InitTypeDef GPIO_InitStructure;                                              //声明结构变量
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;             //定义PA0,PA1脚为AD输入
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                      //IO口为模拟输入模式
    //GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;            //AD口设置为浮空输入
    GPIO_Init(GPIOA, &GPIO_InitStructure);                                         //按以上参数设置A口 A0/A1
    }

    //********************************************************************************************
    void ADC1_Init(void) //配置ADC参数及采集
    {

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE); //使能AHB预分频器到外设ADC1的开关
    RCC_ADCCLKConfig(RCC_PCLK2_Div8) ;                                   //时钟分频72M/8=9M 最大时钟不超过14M
    ADC_DeInit(ADC1);                                                                        //ADC复位
    ADC_DMACmd(ADC1, DISABLE);                                                //禁止DMA

    ADC_InitTypeDef ADC_InitStuctrue;                                              //声明ADC结构变量
    ADC_InitStuctrue.ADC_Mode = ADC_Mode_Independent;          //ADC 独立工作模式
    ADC_InitStuctrue.ADC_ScanConvMode = DISABLE;                   //是否扫描_单通道
    ADC_InitStuctrue.ADC_ContinuousConvMode = DISABLE;         //是否连续_单次
    ADC_InitStuctrue.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None; //不用外部触发,软件触发转换
    ADC_InitStuctrue.ADC_DataAlign=ADC_DataAlign_Right;           //数据右对齐
    ADC_InitStuctrue.ADC_NbrOfChannel = 1;                                   //结构体_ADC-通道个数_单通道
    //ADC_InitStuctrue.ADC_ScanDirection=ADC_ScanDirection_Backward; //数据覆盖/浏览方向
    ADC_Init(ADC1,&ADC_InitStuctrue);                                            //按以上参数设置ADC1

    ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);
    //配置内容和ADC外设的具体对接函数 (ADC端口1 ,ADC通道0 ,转换序号-第1个转换 ,转换的周期)
    ADC_Cmd(ADC1,ENABLE);                                                        //使能ADC1
    ADC_ResetCalibration(ADC1);                                                    //ADC寄存器复位校准函数
    while(ADC_GetResetCalibrationStatus(ADC1));                         //等待上一步完成
    ADC_StartCalibration(ADC1);                                                     //开始指定ADC的校准状态
    while(ADC_GetCalibrationStatus(ADC1));                                  //等待上一步完成
    }
    //******************************************************************************************
    void delay_ms(void)
    {
      unsigned char i,j;
      for(i=255;i>0;i--)
         {
          for(j=250;j>0;j--);
         }
    }

    //******************************************************************************************
    //******************************************************************************************
    int main(void)
    {
      ADC_GPIO_Init();                                         //配置ADC的IO口
      ADC1_Init();                                                 //配置ADC参数及采集

      while (1)
       {
       delay_ms();
       ADC_SoftwareStartConvCmd(ADC1, ENABLE); //开关_ADC软件触发-开关 状态寄存器为0
       while(ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==RESET);    //等待ADC完成
       adc_data=ADC_GetConversionValue(ADC1);    //所得数据即为ADC数据

       dyzh=(adc_data*3.27)/4095;                               //转换采集值为电压值
                                                                                   //参考电压3.27V,12位分辨率4095
                                                                                   //此处可以设断点,查看上面dyzh值
        }
    }

  • 相关阅读:
    路径查看linux 向内核注册总线例子
    属性应用Android Manifest之<provider>元素中文注释
    序数序列hdu 1394
    大分类分类Zen Cart大分类下直接显示产品列表插件
    虚拟化运行[OpenStack] VMWare产品介绍
    名称磁盘Linux系统监控的CPU、Mem、IO的OID
    端口服务器黑马韩前成linux从入门到精通proftpd服务器配置
    主库配置关于Dataguard Online redo log 和 Standby redo log
    尺寸品牌Jquery 仿淘宝京东多条件筛选 可自行结合ajax加载
    设置编辑(iPhone/iPad开发)设置UITextView为不可编辑状态
  • 原文地址:https://www.cnblogs.com/beiyhs/p/12320695.html
Copyright © 2011-2022 走看看