一、设备说明3 u0 \, u% j- w& W: L
单片机:STM32f103zet6; m# X3 j1 C8 p4 ~
雨滴模块% J. }& D e: T9 y$ t
9 t/ G( x" c9 A
5 `* u" A9 t1 i
+ u# [2 M) Q- Z0 S
' s) z C9 y$ |) ]2 J
% }4 {! E! ^* k1 o
`" J/ Z4 P! z3 C# c) Y9 j3 l; q二、部分关键代码! p! |! h/ p; J2 [) E
1.初始化ADC采集
' g& ]+ ]2 r1 j0 F; N代码如下(示例):
8 R1 F+ c- } S- L- <font face="微软雅黑" size="3">void Adc_Init(void). a# P! j" a* |0 r; r' N
- { / E9 k. M9 r4 e- }5 y* k+ h
- ADC_InitTypeDef ADC_InitStructure;
' y6 a! C% N: d* T - GPIO_InitTypeDef GPIO_InitStructure;/ `! [) x/ R4 P8 |7 g& p) w/ e3 o
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1 , ENABLE ); //使能ADC1通道时钟; k8 K1 [# K% H' f1 x$ k
- RCC_ADCCLKConfig(RCC_PCLK2_Div6); //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M
5 V, p& m+ G/ V$ M& r+ f% w- F0 M - //PA1 作为模拟通道输入引脚
. q, U4 n* J. U/ b - GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;, }/ L; L L- X" U4 J
- GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //模拟输入引脚0 F3 G9 }3 y- x. G0 P1 E) K
- GPIO_Init(GPIOA, &GPIO_InitStructure); 1 l4 q$ ^4 o* Q
- //**All notes can be deleted and modified**//, C; r! Z% l/ I3 s* `9 |! Q
- ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; //ADC工作模式:ADC1和ADC2工作在独立模式
( ^8 I( p& @9 Q9 C8 s/ p - ADC_InitStructure.ADC_ScanConvMode = DISABLE; //模数转换工作在单通道模式8 D$ ]; g: {0 X; {! H/ ~
- ADC_InitStructure.ADC_ContinuousConvMode = DISABLE; //模数转换工作在单次转换模式( Y) M* {6 R5 I/ l) K" M2 J0 `% T% N
- ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; //转换由软件而不是外部触发启动 E1 Q+ r1 C: z; k" S
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; //ADC数据右对齐
# Y. d7 ^" D: v9 {/ J - ADC_InitStructure.ADC_NbrOfChannel = 1; //顺序进行规则转换的ADC通道的数目6 V6 Z9 v4 L' O A+ S" b5 Y& i
- ADC_Init(ADC1, &ADC_InitStructure); //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器 + O( Z3 X' w" \+ l
- ADC_Cmd(ADC1, ENABLE); //使能指定的ADC1 # Q( s- A3 g; u, y2 [
- ADC_ResetCalibration(ADC1); //使能复位校准 . l/ |7 O! K" N# s$ S6 M
- while(ADC_GetResetCalibrationStatus(ADC1)); //等待复位校准结束
! L: Q& Q5 O7 S) n - ADC_StartCalibration(ADC1); //开启AD校准, O" U( O4 |3 ?' P
- while(ADC_GetCalibrationStatus(ADC1)); //等待校准结束
3 f# J2 ~/ l! k- H. Z* P" Q - </font>
复制代码 2.读入数据
. _+ @. N/ G/ o) X代码如下(示例):
" z' `5 f, k1 U* ~- <font face="微软雅黑" size="3"> adcx=Get_Adc_Average(ADC_Channel_0,5);//读取ad转换值 5次求平均
) ]6 }( ]$ E4 e" S$ ` - printf(" adcx %d\r\n",adcx);
* M1 ~- ~. `* n- n5 z3 @! f -
2 ^' q. R* [/ ~+ o" E - sensorVal =99-((float)adcx*3.3/4096)*2*99.0/5.0;// 采集值 *2表示电阻分压 输出最大5v 但是要转化为最大3.3v ) B" s+ W4 `% K- ]* f! C
- sensorVal =99-((float)adcx*3.3/4096)*99.0/5.0;* C& \ z/ O! l, m6 _( c# n/ _
- : X* Q+ g( b" x) D8 t& C8 p
- printf(" sensorVal %d\r\n",sensorVal);; U0 S5 U& y7 i
- if(sensorVal<BASICS_VAL)sensorVal = 0;//过滤传感器本身自带电压: K; A# w9 F0 ?) n+ N
- else! j$ D* J! _5 O" K' e6 J
- {
8 k3 z8 p5 w( z9 t/ W6 Y# q' _; W - sensorVal = (sensorVal-BASICS_VAL)*99/(99-BASICS_VAL);//将30-99值转化为0-99的值7 N; [7 U0 f9 L9 m# F; b' H* n# J9 F
- }
! I8 F7 e8 [% v5 e3 q0 R - , ?9 v) [8 v7 Y3 f
- printf(dis0,"nowValue:%d ",sensorVal); //打印 . i% d5 X6 G$ N. D( Y
-
N6 h% X }4 O - if(setMode){
* P! K1 t! t; f9 i0 _7 _( I - printf(dis1,"setValue:%02d< ",setNum); //打印 9 q( S/ T) P5 j
- }* V& S4 s6 p! O, I1 l: c
- else{; t! Y: b* ?$ N
- printf(dis1,"setValue:%02d ",setNum); + ~4 v( ]* F9 e0 H
- }- w$ L- ?5 p9 D6 Z3 r
- </font>
复制代码 % N, J5 N& ~; Q% W6 I
, x/ L$ X4 s% [4 Y' [7 K* Q
总结
) O5 Z4 ~7 L' [/ [$ x8 Z最后输出的结果:
- x! X7 C3 F7 o根据测试,雨滴模块浸入水的深度不同,返回的电压值转化成的adc值不同:8 O# Z! p+ N7 z' G
完全无水的情况返回的adc值为4096;. E( {" {- h$ Q; ]9 p9 n
完全浸入水中返回值接近400(是因为有模块供电的电压)。! U0 }: q1 e9 @2 w- D' G& t
根据400~4096的区间,按百分比输出,无水情况输出0,完全浸没输出99;; a% F' y2 u6 f4 ^" c- m
: Y) T- @+ T5 R" ?
|