历史上的今天
今天是:2025年04月21日(星期一)
2020年04月21日 | 模数转换器ADC
2020-04-21 来源:eefocus
6.1 ADC结构及寄存器说明
模数转换器ADC的主要功能是将模拟信号转化为数字信号以便于微控制器进行数据处理
ADC按转换原理分为逐次比较型、双积分型和∑-∆型
逐次比较型ADC通过逐次比较将模拟信号转化为数字信号转换速度快,但精度较低,是最常用的ADC
双积分型ADC通过两次积分将模拟信号转化为数字信号,精度高,抗干扰能力强,但速度较慢,主要用于万用表等测量仪器
∑-∆型ADC具有逐次比较型和双积分型的双重优点,正在逐步广泛地得到应用
STM32ADC是12位逐次比较器,多达18个通道,可测量16个外部和2个内部信号源,各通道的转换可以单词、连续、扫描或间断模式执行,转换结果可以左对齐或右对齐方式存储在16位数据寄存器中
STM32ADC的模拟看门狗特性允许应用程序检测输入电压是否超出用户定义的高/低阈值
输入时钟不得超过14MHz,由PCLK2经分频产生
STM32ADC主要由模拟多路开关、模拟至数字转换器、数据寄存器和触发选择等部分组成
转换通道分为规则通道和注入通道两组
规则通道由最多16个通道组成,按顺序转换
注入通道由最多4个通道组成,可插入转换

ADC使用的GPIO引脚

ADC1的通道16内部与温度传感器相连
通道17内部与参考电源VREFINT相连
ADC通过20个寄存器进行操作

6.2 ADC设计实例
6.2.1 用ADC1规则通道实现外部模拟信号的模数转换
规则通道相关的寄存器及其内容

ADC规则通道初始化子程序
//ADC1初始化子程序
void Adc1_Init(void)
{
RCC->APB2ENR |= 1<<3; //开启GPIOB时钟
RCC->APB2ENR |= 1<<9; //开启ADC1时钟
GPIOB->CRL &=0xffffff00; //PB.01(IN9)、PB.00(IN8)模拟输入
ADC1->CR1 |= 1<<8; //扫描模式
ADC1->CR2 |= 1<<20; //规则通道外部触发:TIM1_CH1
ADC1->SQR1 |= 1<<20; //规则通道序列长度:2
ADC1->SQR3 |= 9; //第1个转换通道:IN9
ADC1->SQR3 |= 8<<5; //第2个转换通道:IN8
ADC1->CR2 |= 1; //开启ADC
ADC1->CR2 |= 1<<2; //校准ADC
while(ADC1->CR2 & 1<<2); //等待校准完成
}
ADC规则通道处理子程序
//ADC1处理子程序
void Adc1_Proc(void)
{
if(ADC1->SR & 2) //EOC=1(转换结束)
{
adc1_dat[adc1_num] = ADC1->DR; //读取转换值
if(++adc1_num == 2)
adc1_num = 0;
}
}
6.2.2 用ADC1注入通道实现内部温度传感器的温度测量
STM32中有一个温度传感器,与ADC1的通道16相连,可以用来测量芯片的温度
温度传感器的最大采样时间为17.1ms,温度范围为-40~125°C,温度计算公式如下:
其中:V为温度传感器电压值,N为模数转换后的数字值
注入通道相关的寄存器及其内容

ADC注入通道初始化子程序
//ADC1初始化子程序
void Adc1_Init(void)
{
RCC->APB2ENR |= 1<<3; //开启GPIOB时钟
RCC->APB2ENR |= 1<<9; //开启ADC1时钟
GPIOB->CRL &=0xffffff00; //PB.01(IN9)、PB.00(IN8)模拟输入
ADC1->CR1 |= 1<<8; //扫描模式
ADC1->CR2 |= 1<<20; //规则通道外部触发:TIM1_CH1
ADC1->SQR1 |= 1<<20; //规则通道序列长度:2
ADC1->SQR3 |= 9; //第1个转换通道:IN9
ADC1->SQR3 |= 8<<5; //第2个转换通道:IN8
ADC1->CR2 |= 1<<10; //注入通道自动转换
ADC1->CR2 |= 1<<23; //开启温度传感器
ADC1->SMPR1 |= 5<<18; //SMP16[2:0] =5(55.5)
// (55.5+12.5)/4MHz=17s
ADC1->JSQR |= 0x10<<15; //JSRR[4:0]=0x10(通道16)
ADC1->CR2 |= 1; //开启ADC
ADC1->CR2 |= 1<<2; //校准ADC
while(ADC1->CR2 & 1<<2); //等待校准完成
}
ADC注入通道处理子程序
//ADC1处理子程序
void Adc1_Proc(void)
{
if(ADC1->SR & 2) //EOC=1(转换结束)
{
adc1_dat[adc1_num] = ADC1->DR; //读取转换值
if(++adc1_num == 2)
adc1_num = 0;
}
if(ADC1->SR & 4) //JEOC=1(注入通道转换结束)
{
ADC1->SR &= ~6; //清除JEOC和EOC
adc1_jdat = ADC1->JDR1; //读取转换值
}
}
上一篇:51单片机:用ADC0832做模数转换,测量电压大小
下一篇:51单片机笔记
史海拾趣
|
IAR5.3(评估版)编译老是提示如下的错误,是怎么一回事啊 Error[Lp021]: the destination for compressed initializer batch \"P2 mid-1\" is placed at an address that is dependent on the size of the batch, which is not allowed when using packbits compression. Consider using \"initialize by c ...… 查看全部问答> |
|
我用的是2450,问一下LCD横屏转竖屏,驱动程序里除了在头文件处修改分辨率外,还要修改什么地方呢? 我只修改了头文件处定义的分辨率的情况下,屏幕变窄了(部分屏幕黑色没图象),竖直方向靠下的部分没被显示出来。 不知道在哪(几)个文件里的函 ...… 查看全部问答> |
|
下了个WINCE6.0用的GPS软件,为什么EXE文件运行的时候要让我显示打开方式呢? rt 我用的是OMAP3530开发板,内置GPS模块,WINCE6.0环境已经建立,网上下了个GPS软件,EXE格式的用U盘考进去板子里打不开,出现类似于WINDOWS下的让你选择打开方式的窗口,不是EXE是可执行文件吗?而且下的是WINCE6.0可用的版本,谢谢各位了!… 查看全部问答> |
|
attach->pdp activation->ATD*99***1, ATD*99***1这条AT命令是做什么用的? PDP激活不就可以传数据了吗?… 查看全部问答> |
|
用ActiveSync直接在开发板上调试程序(wince6.0系统)。调试一次正常,但是结束调试再继续调试时,就会出现错误,有时候是部署不成功,有时候是部署成功,程序不能运行,都是说wince的存储内存不足。但是在wince的控制面板看到,存储 ...… 查看全部问答> |
|
这两天,下了个ucos在STM32F103ZE-SK开发板上移植的官方例程(uCOSII-ST-STM32F103ZE-SK),这其中有两个文件夹,u ...… 查看全部问答> |
|
本帖最后由 paulhyde 于 2014-9-15 09:04 编辑 电压比较器LM393 用正负12V 供电, 其输出的高电平、和低电平分别为多少呀? 我测试的高为12V, 低为-0.8V, 不知对否? 希望大家能给出自己的测试结果。 &nb ...… 查看全部问答> |
|
操作简单 2100操作简单直观,开箱即可使用。前面板易于理解和操作。其KI-Tool和KI-Link软件允许用户通过GPIB(如果安装了)或USB快速控制仪器,记录测量,以及显示数据的时间序列图。其LabView®和IVI驱动则给高级客户开放 ...… 查看全部问答> |




