赞
踩
12位ADC是一个逐次必经型模式数字转换器。多达18个通道,
可测量 16个外部 和2个内部信号源.每个通道的A/D转换可以单次,
连续 扫描 或者 间断模式运行。
时钟选择
ADC 的输入时钟 不得超过 14Mhz 他是由Pclk2 经过分频 产生的。
我们想了解ADC的功能 第一步应该从看结构图开始
大概他的主要组成有7个部分
下面来对重点 部分组成 进行讲解
第"1"部分
ADC 测量的电压 范围是 VREF-<ADCIN<VREF+ 我门把 VREF+ 和VDDA接3.3电源的正极
VREF- 和 VSSA 接电源的负极,这样形成的电压范围是 0-3.3V
ADC的十几个通道 对应了不同的io口 ADC1 有两个通道是有特殊用法 请往下看。
输入转换过程
ADC IN0 是ADC 的输入通道 ,信号通过输入通道进入单片机。
ADC转换 :A(模拟量)--D(数字量)也就是 输入了模拟 信号 0或信号1
通过单片机转换变成了数字信号 即 3.3V或者 2.33V(对应的电压值
根据实际来看 这里只是举例说明)
外部通道转换又分为 规则通道和注入通道 ,规则通道多达16个 注入通道多达4个
注入通道很少用 下面继续说下两个通道区别
规则通道
顾名思义 就是 规规矩矩的 通道 很普通 一般我们就用它来进行adc转换
注入通道
他可以在 规则通道 转换过程,强行加入,这里可以理解为一个中断通道。
它会先执行中断通道 它结束以后 才会返回规则通道继续运行.
SQR1 寄存器控制着 ADC的转换顺序和 数目 如果是只有一个通道那倒无所谓了。
SQR2 寄存器控制着 ADC的转换顺序和 数目 如果是只有一个通道那倒无所谓了。
SQR3 寄存器控制着 ADC的转换顺序和 数目 如果是只有一个通道那倒无所谓了。
规则通道转换顺序总的来说 有三个寄存器来控制 (SQR1 SQR2 SQR3)
注入通道转换顺序控制寄存器 JSQR
他只有一个 很好记 也就是只有一个中断通道。
1)电路图
就比如 你拿到的题目是
看到的电路图是这样的
如果板子没有PA15 那可能是和别的io短接了 这样很明显看出 他是和R27 R28 R29 JTDO 短接了
但是板子只有 JIDO 有对应的 io 这样我们可以理解为 JTDO的PB3 ==PA15
2)稍微普及一下初中知识
短接相当于 串联 串联电路 电压处处相等。
1)代码的 4 部分组成
1 对应的 IO配置
2 基本的 ADC结构体配置
3 ADC 转换周期配置
4 校准 数据 函数
{
1 复位检查
2 校准
}
初始化结构体
typedef struct
{
uint32_t ADC_Mode; //ADC模式
FunctionalState ADC_ScanConvMode; //adc扫描模式
FunctionalState ADC_ContinuousConvMode; //单次转换 或者 连续转换
uint32_t ADC_ExternalTrigConv; //adc 触发信号选择
uint32_t ADC_DataAlign; //对齐模式
uint8_t ADC_NbrOfChannel; //通道 几
}ADC_InitTypeDef;
通过配置参数变量 来初始化 adc 函数
GPIO_InitTypeDef GPIO_Initstruct; ADC_InitTypeDef ADC_Initstruct; RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);//IO的时钟使能 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//ADC 1 时钟使能 、 //注意不要和转换周期混乱 两个是不一样的概念 不会冲突 要同时存在 缺一不可 GPIO_Initstruct.GPIO_Mode=GPIO_Mode_AIN; //模拟输入 固定 GPIO_Initstruct.GPIO_Pin=GPIO_Pin_1; //和PB3 短接 相当于是 PA1==BP3 GPIO_Initstruct.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOA,&GPIO_Initstruct); ADC_Initstruct.ADC_Mode=ADC_Mode_Independent; //独立模式 ADC_Initstruct.ADC_ScanConvMode =DISABLE; //关闭扫描 ADC_Initstruct.ADC_ContinuousConvMode= DISABLE;//关闭连续转换 ADC_Initstruct.ADC_ExternalTrigConv=ADC_ExternalTrigConv_None;//选择软件模式触发 ADC_Initstruct.ADC_NbrOfChannel=1;//对应的采集通道数目 ADC_Initstruct.ADC_DataAlign=ADC_DataAlign_Right;//采取右对齐 ADC_Init(ADC1,&ADC_Initstruct);//初始化 ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5); ADC_Cmd(ADC1,ENABLE); //使能 ADC1 ADC_ResetCalibration(ADC1); while( ADC_GetResetCalibrationStatus(ADC1)); ADC_StartCalibration(ADC1); while( ADC_GetCalibrationStatus(ADC1));
1 2 部分就不讲解了 不懂的看备注
第 3 转换周期
比如 :
ADC_RegularChannelConfig(ADC1,ADC_Channel_1,1,ADC_SampleTime_1Cycles5);
备注//ADC1,对应通道,采集通道数,转换周期 (1.5+12)
1.5 并不是 真实的转换周期 要加上 12才行.
周期计算
f=14 0 0 0 0 0 0 单位(s)根据公式 :f=1/T 也就是 1s内发生了
14 0 0 0 0 0 0 个周期事件, 那么一个周期 就是 1/14 00 00 00 s。
14个周期 就是 14/14000 000 = 1/1000 000 S
1 000 000us =1s , 那么 14周期就是 1us
4 校准数据
{ 1 }
ADC_ResetCalibration(ADC1); //复位检查
while( ADC_GetResetCalibrationStatus(ADC1));//等待检查完毕
什么是复位
复位就是 多检查 一次 以防 出错 而已 并没有多高级
4 校准数据
{ 2 }
ADC_StartCalibration(ADC1); //校准
while( ADC_GetCalibrationStatus(ADC1));//等待校准结束
ADC Turn.c
开始转换数据
float ADC_turnfloat;
ADC_SoftwareStartConvCmd(ADC1,ENABLE); //软件转换使能
while( ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0); //等待转换结束
ADC_turnfloat=ADC_GetConversionValue(ADC1)*3.30/0XFFF;//公式
return ADC_turnfloat;//返回显示
while( ADC_GetFlagStatus(ADC1,ADC_FLAG_EOC)==0); //等待转换结束
//用了这个标志位来表示数据转换结束
注意
我并没有使用中断 不要混乱了 。
标志位选择注意
杜邦线
配置完之后 用杜邦线把 PA1 和 PB3 串起来
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。