stm32f103系列单片机内部ADC为12位ADC。
12位ADC是一种逐次逼近型模拟数字转换器。它有多达18个通道,可测量16个外部和2个内部
信号源。各通道的A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右
对齐方式存储在16位数据寄存器中。
模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阀值。
ADC的输入时钟不得超过14MHz,它是由PCLK2经分频产生。

ADC 主要特征

● 12位分辨率

● 转换结束、注入转换结束和发生模拟看门狗事件时产生中断

● 单次和连续转换模式

● 从通道0到通道n的自动扫描模式

● 自校准

● 带内嵌数据一致性的数据对齐

● 采样间隔可以按通道分别编程

● 规则转换和注入转换均有外部触发选项

● 间断模式

● 双重模式(带2个或以上ADC的器件)

下面就用代码演示如何设置ADC单次转换模式


void ADCx_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;ADC_InitTypeDef ADC_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_ADC1, ENABLE);RCC_ADCCLKConfig(RCC_PCLK2_Div6);                 //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14MGPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1| GPIO_Pin_2| GPIO_Pin_3| GPIO_Pin_4| GPIO_Pin_5;                //PA1GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;         //模拟输入GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);ADC_DeInit(ADC1);ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;      //工作在独立模式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_InitStructure.ADC_NbrOfChannel = 1;                   //规则转换ADC通道数ADC_Init(ADC1, &ADC_InitStructure);ADC_Cmd(ADC1, ENABLE);                       //使能ADC1ADC_ResetCalibration(ADC1);                 //复位校准while(ADC_GetResetCalibrationStatus(ADC1));   //等待复位校准结束ADC_StartCalibration(ADC1);                   //开启AD校准while(ADC_GetCalibrationStatus(ADC1));      //等待校准结束}

  首先初始化IO口,这里的初始化的是ADC抓换通道的0–5,对应的IO口PA0到PA5,将这6个IO口这是为模拟输入模式。接下来在将这几个口设置为ADC口,在设置之前首先将ADC模式复位,然后将ADC设置为单通道单词转换模式,也就是每次只转换一个通道,转换一次后就停止转换,直到接收到下一次转换命令为止。开始转换的命令是由软件来设置的。

  ADC口初始化好之后,还需要一个读取转换结果的函数,用于读取指定通道的转换值。

//获取ADC值
//ch:通道号
u16 Get_Adc( u8 ch )
{ADC_RegularChannelConfig( ADC1, ch, 1, ADC_SampleTime_239Cycles5 );    //ADC1,ADC通道,采样时间为239.5周期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;
}

Get_Adc()函数用于读取指定通道的ADC转换值,这里的通道必须是初始化函数中初始化过的通道,这个函数每次只读取一次通道值,为了确保转换结果的正确性,需要多次读取通道值取平均值,所以这里Get_Adc_Average()函数就是用来设置多次读取指定通道值,然后取平均值后返回。比如可以设置读取通道1,100次然后取平均值。ADC相关的设置函数就初始化好了,接下来在主函数中调用Get_Adc_Average()函数就可以读取通道值了。

int main(void)
{u16 adcx = 0;float temp;delay_init();             //延时函数初始化NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);uart_init(115200);LED_Init();LED0 = 1;LED1 = 1;delay_ms(500);LED0 = 0;LED1 = 0;ADCx_Init();printf("ADC test!!!\r\n");while(1){adcx = Get_Adc_Average(ADC_Channel_0, 10);printf("ch0       num: %d\r\n", adcx);temp = (float)adcx * (3.3 / 4096);adcx = temp * 1000;printf("ch0 adc value: %d\r\n", adcx);adcx = Get_Adc_Average(ADC_Channel_1, 10);printf("ch1       num: %d\r\n", adcx);temp = (float)adcx * (3.3 / 4096);adcx = temp * 1000;printf("ch1 adc value: %d\r\n", adcx);adcx = Get_Adc_Average(ADC_Channel_2, 10);printf("ch2       num: %d\r\n", adcx);temp = (float)adcx * (3.3 / 4096);adcx = temp * 1000;printf("ch2 adc value: %d\r\n", adcx);adcx = Get_Adc_Average(ADC_Channel_3, 10);printf("ch3       num: %d\r\n", adcx);temp = (float)adcx * (3.3 / 4096);adcx = temp * 1000;printf("ch3 adc value: %d\r\n", adcx);adcx = Get_Adc_Average(ADC_Channel_4, 10);printf("ch4       num: %d\r\n", adcx);temp = (float)adcx * (3.3 / 4096);adcx = temp * 1000;printf("ch4 adc value: %d\r\n", adcx);adcx = Get_Adc_Average(ADC_Channel_5, 10);printf("ch5       num: %d\r\n", adcx);temp = (float)adcx * (3.3 / 4096);adcx = temp * 1000;printf("ch5 adc value: %d\r\n", adcx);LED0 = !LED0;delay_ms(500);}
}

在主函数中依次读取通道0到通道5的值,读取10次取平均值,然后将转换后的值打印出来。由于ADC为12位,所以转换后的最大值为4096,对应的最大电压值为3.3V,为了方便观察,将转换后的值换换位电压值。

STM32F103单片机ADC功能使用相关推荐

  1. STC8A单片机ADC功能使用

    1.概述 STC8系列单片机内部集成了一个12位15通道的高速ADC转换器.ADC的时钟为系统时钟的2分频的16分频的32分频到系统时钟的2分频的16分频的512分频.转换结果有2种格式:左对齐和右对 ...

  2. 单片机ADC采样算法----有效值采样法

    在使用单片机ADC功能采样数据时,通常情况下用平均值计算就够了,但是在计算功率时就需要用有效值来计算真正做功的情况.如果是标准的正弦波的话,正弦波的峰值是有效值得1.414倍,可以通过峰值来计算有效值 ...

  3. STM8单片机ADC采样功能通过定时器触发

      在使用STM8单片机的ADC功能时,读取ADC数据时一般有两种方式,一种是通常不断地读取采样标志位,来判断ADC采样是否结束,一种是通过中断的方式来通知系统采样是否结束.   有时候采样ADC数据 ...

  4. 用单片机普通IO口(不用ADC功能)采集模拟量

    http://www.51hei.com/bbs/dpj-126017-1.html 以下介绍的这个方法是用没有 ADC 功能的芯片来检测模拟量,采集温度: 1. 温度检测电路图 :   2. 温度检 ...

  5. LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序

    /* 程序名: LCD1602,4位数据总线液晶屏时钟,STC12C5A60S2的10位ADC功能程序 编写时间: 2015年10月4日 硬件支持: LCD1602液晶屏 STC12C5A60S2 外 ...

  6. 一个单片机ADC的挖坑填坑之旅

    [导读] 本文来解析一个盆友在使用STM32采集电池电压踩过的坑.以STM32F4 的ADC属于逐次逼近SAR 型ADC为例进行分析,参考STM32F405xx  Datasheet,对于如何编写AD ...

  7. 基于AVR单片机PWM功能的数控恒流源研制

    随着电子技术的深入发展,各种智能仪器越来越多,涉及领域越来越广,而仪器对电源的要求也越来越高.现今,电源设备有朝着数字化方向发展的趋势.然而绝大多数数控电源设计是通过高位数的A/D和D/A芯片来实现的 ...

  8. STM8单片机ADC连续扫描模式

      当STM8单片机使用ADC功能读取多个通道的值时,可以使用连续模式,但是连续模式一次只能采样一个通道的值,那么如果要采样多个通道时怎么办呢?STM8提供了一个多通道连续采样扫描模式.也就是说多个通 ...

  9. STM8单片机ADC带缓存的连续采样模式

      在上一篇文章中说了STM8的ADC连续采样模式,为了提高采样的精度和速率,STM8单片机还提供了带缓存的连续采样模式,也就是说ADC会连续采集8个数据,放在缓存中,读取数据时可以一次从缓存中读取8 ...

最新文章

  1. 软件包管理 之 软件在线升级更新yum 图形工具介绍
  2. WebSocket部署服务器外网无法连接解决方案
  3. 训练集数量对神经网络光谱的影响
  4. python—多线程之死锁
  5. php-fpm自启动,php-fpm自启脚本
  6. python给变量赋值范围_关于lambda:在Python中将变量赋值给本地函数范围
  7. 租网站服务器安全吗,租用的服务器安全吗
  8. 【JMS】JMS详解
  9. CookieValue注解
  10. vim中字体和配色方案设置
  11. python 拟牛顿法 求非线性方程_9-非线性优化
  12. go学习笔记-运算符
  13. 调试mysql语句_Mysql sql 语句调试
  14. 日常如何维护OA系统?
  15. Silvaco 安装问题
  16. Base16,Base32,Base64编码的介绍
  17. 插上移动硬盘计算机没反应,移动硬盘插电脑没反应怎么办解决教程
  18. Java数字转大写金额格式小程序代码
  19. 三种常见的建筑企业并购方案
  20. org.hibernate.loader.custom.NonUniqueDiscoveredSqlAliasException: Encountered a duplicated sql alias

热门文章

  1. 常用的几个提高iOS开发效率的开源类库及工具
  2. 也谈基于Web的含工作流项目的一般开发流程
  3. 【转】热门3D游戏视觉效果名词简介
  4. 不能调试的问题的解决
  5. BIM工程信息管理系统-EF实体框架数据操作基类
  6. 20190808估值方法
  7. 杨元:CSS浮动(float,clear)通俗讲解
  8. 一个MD4在线加密脚本源码
  9. 跟我一起创建一个简单的javascript ajax对象 ---献给Web开发初学者
  10. TFS 2005安装的注意事项