第六章、ADC
常见问题
1、基本概念:什么是ADC ?作用 ?逐次逼近型
2、传感器本质 ?传感器、电压、ADC数值转化 ?
3、ADC的特征 ? 转化时间、分辨率、精度、量化误差 ?
4、ADC框图组成部分 ?参考电压/模拟部分电压、输入通道、转换序列、触发源、数据寄存器、转换时间、中断 ?
5、转换模式_扫描模式 ?
## 1、ADC 模数转换器作用:模拟数据->数字数据
整流:3.3V(模拟)->1(数字) 0V->0
而ADC内部也有一套转化规则:
3.3V->1024/8/512 0V->0
2、传感器
压力传感器、光敏传感器、温度传感器、湿度传感器、气压传感器等等
这些传感器内部实现原理:本质是滑动变阻器
将外部环境信息转换成电压信息(比如100N的力对应3.3V)
外部环境数据:100N 变成 模拟电压
ADC就是去继续量化这个模拟电压的,1024量化3.3V
ADC的特征:ADC的厂商定义四个核心的东西:分辨率(意味着ADC可以表示的范围:比如分辨率是3,0到2的3次方-1;分辨率是10就是0到2的10次方-1,分辨率最高的12,精度更大,分的更清楚)、精度、误差(制作的时候,工艺有区别,存在一个理论值与实际值的差别)、转化时间(要给一个充分的时间,要么确定ADC已经转化完成,要么给一个明确的完成信号)
ADC的内部构造:分为并联选择型和逐次逼近型 (电压->ADC值 )
3、实验
<font style="color:#4874CB;">1、轮询模式</font>
<font style="color:#4874CB;"> HAL_ADC_Start(&hadc1); </font>
<font style="color:#4874CB;"> HAL_ADC_PollForConversion(&hadc1, 50);</font>
<font style="color:#4874CB;"> ADC_Value = HAL_ADC_GetValue(&hadc1);</font>
<font style="color:#4874CB;"> HAL_ADC_Stop(&hadc1); </font>
2、 DMA模式
<font style="color:#4874CB;"> HAL_ADC_Start_DMA(&hadc1,(uint32_t *)ADC_Value,2);</font>
<font style="color:#4874CB;"> printf("%d %d \r\n",ADC_Value[0],ADC_Value[1]); </font>
<font style="color:#75BD42;">(while循环中 采样周期要大一点 75.5Cycles )</font><font style="color:#4874CB;"> </font>
4、实验:单通道读取五向按键
这个五向按键有两个功能:判断是否按下,判断方向;
在五个按键上,接不同的电压,读取到不同的ADC的值,读的时候注意ADC的通道(通过原理图要找到五向按键和ADC的通道是哪个,必须要找到)
找到之后keil编程:第一步开启;第二步等待转化完成;第三步是获取ADC的值;第四步:停止 以上为轮询方式实现;
效果截图:
实验代码:
配置PA1为ADC1,然后设置一个USART1,实验代码:
中断方式实现:首先是ADC的中断开关;
然后找到对应的回调函数(跟着中断向量表中的ADC服务函数,每个服务函数里都有统一的ADC处理(在这个处理中肯定有callback回调函数,然后重写这个回调函数));接着获取ADC的值,处理完之后,把开关闭合上。
实验记录:
在轮询的前提下,加一个nvic:
硬件问题,如何用软件来区分五向按键向右按和不按(用PA8)