目录
一、硬件原理
通过该硬件电路,我们可以知道通过旋转RP5,RP6电位器可以调节该滑动变阻器的阻值,从而达到调节该点的电压。而我们需要做的就是通过ad来采集A01,AO2口的电压。
这个很简单,话不多说,我们直接上手看配置。
二、CUBEMX配置
首先进行拓展板上的跳线,将短接帽连接P3,P4;
AO1对应的是PA4,AO2对应的是PA5;
所以在CUBEMX中将PA4,PA5引脚打开,设为ADC采集通道;
这里需要说几个需要注意的点。
1.因为我们使用了不同采集通道的同一个ADC,因此在单个ad采集的基础上需要打开扫描转换模式,这样才能采集完一个通道后采集另一个通道。
2.将Number of Corversion (转换数量) 修改为2,因为我们有两个通道。否则我们只能使用到一个通道;
然后下面就是依旧的打开DMA传输。选择连续转换模式,其余的默认。
然后就是关闭 DMA 中断,上一篇已经说过,容易造成系统死机;
生成代码,打开KEIL;
三、程序编写
1.用一个数组创建两个ad采集存储容器,每次只存储一个值,可以实现实时的ad采集。
uint16_t adc[2];
这样做可以理解为,同时采集两个通道的ad值,每个通道的ad值对应数组中的相应位置,下一次扫描的值会覆盖上一次存储的值。而我们只需要做的就是对数组中相应的位置进行处理就代表了对相应通道的数据处理。
我们将采集的ad电压值通过屏幕进行显示。
uint8_t adcstr1[5];
uint8_t adcstr2[5];
将所需的对象定义好后,就启动ADC和DMA;
在while{}循环体前面添加
HAL_ADCEx_Calibration_Start(&hadc2,ADC_SINGLE_ENDED);
HAL_ADC_Start_DMA(&hadc2,(uint32_t *)adc,2);
注意:HAL_ADC_Start_DMA()中,最后一个值要填与前面设置的数组内存的值一致,否则会导致每个通道储存的位置错位。
相应的 ,如果需要采集三个通道的值,容器就改为3,这里也改为3.
在while{}中添加处理代码:
sprintf((char*)adcstr1,"ADC1:%.1f",adc[0]*3.3/4095);
LCD_DisplayStringLine(Line1,(uint8_t *)adcstr1);
sprintf((char*)adcstr2,"ADC2:%.1f",adc[1]*3.3/4095);
LCD_DisplayStringLine(Line2,(uint8_t *)adcstr2);
这个很简单,就不再赘述。编译无误,烧录程序。