你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32单片机雨滴模块

[复制链接]
STMCU小助手 发布时间:2021-7-22 14:47
一、设备说明
/ o2 D+ W* \* y( c' s. R- b' f单片机:STM32f103zet6- b) h+ g. X0 p8 o: O
雨滴模块
6 D3 @, i7 x7 v1 }% b( { 1.png . ^7 m' P3 `2 a; x5 }2 n
; o6 g5 S$ v: O% x% v

7 n( _( c- ]" c2 x 2.png
, r8 K- A0 z' P7 b$ w" a9 A" f  ?3 _
+ I; K! h" t! ^
二、部分关键代码9 s, j( q; Z1 n) `
1.初始化ADC采集
/ {; {7 ?$ `/ d- T8 ?  N代码如下(示例):
4 u. T4 o0 G; J$ X8 J3 ^
  1. <font face="微软雅黑" size="3">void  Adc_Init(void)& G, J% z6 s8 j
  2. {         $ C  [# |* }5 O
  3.         ADC_InitTypeDef ADC_InitStructure; 3 f! r( U0 Q6 A5 m/ w0 g. H
  4.         GPIO_InitTypeDef GPIO_InitStructure;
    : C; r9 |5 n5 C1 |+ D
  5.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA |RCC_APB2Periph_ADC1        , ENABLE );          //使能ADC1通道时钟2 v5 k3 F+ o% u. B( ?* M  H4 {2 }
  6.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);   //设置ADC分频因子6 72M/6=12,ADC最大时间不能超过14M+ q) o" `; b6 U. h% g0 P0 G" i; J, r
  7.         //PA1 作为模拟通道输入引脚                        
    ! z/ g9 w/ M( A0 T* V+ E  v& P# s
  8.         GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;: t, [; y6 D. k; d6 ]" J
  9.         GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;                //模拟输入引脚8 A6 z4 [: U( b: y1 M0 @( L
  10.         GPIO_Init(GPIOA, &GPIO_InitStructure);        . a" ?8 _9 n4 |  W
  11. //**All notes can be deleted and modified**//. l7 j- `- ~, I" V3 V3 U
  12.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;        //ADC工作模式:ADC1和ADC2工作在独立模式
    * ~4 C% P+ J6 x$ e' P) W4 S$ r
  13.         ADC_InitStructure.ADC_ScanConvMode = DISABLE;        //模数转换工作在单通道模式
    $ ^, Q' ]  U) N& U- c# a1 }
  14.         ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        //模数转换工作在单次转换模式
    ( N& ], Q+ V. v# K: p& c: K+ v& d, b
  15.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;        //转换由软件而不是外部触发启动2 t+ p( d" Q. P9 d3 A9 ?1 m
  16.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        //ADC数据右对齐
    % @/ C/ t/ `0 i; d) d! J6 Q1 R9 [
  17.         ADC_InitStructure.ADC_NbrOfChannel = 1;        //顺序进行规则转换的ADC通道的数目
    / o2 W" |  z. e+ U' b/ r. \: |
  18.         ADC_Init(ADC1, &ADC_InitStructure);        //根据ADC_InitStruct中指定的参数初始化外设ADCx的寄存器    $ J" T# v1 {& ~- |4 x
  19.         ADC_Cmd(ADC1, ENABLE);        //使能指定的ADC1        ) }; p+ c6 V7 {& \  r
  20.         ADC_ResetCalibration(ADC1);        //使能复位校准           $ m; p" _& _; m7 f% U
  21.         while(ADC_GetResetCalibrationStatus(ADC1));        //等待复位校准结束        2 T3 t& @3 M( u/ C$ y
  22.         ADC_StartCalibration(ADC1);         //开启AD校准) u; E! ^* j% I
  23.         while(ADC_GetCalibrationStatus(ADC1));         //等待校准结束7 G" s- a1 v! {+ O1 @. v: w" D# X. G
  24. </font>
复制代码
2.读入数据
7 B, V% W5 v8 w" W# v: S- U! F代码如下(示例):
+ A0 S- m; g6 g$ ~
  1. <font face="微软雅黑" size="3">   adcx=Get_Adc_Average(ADC_Channel_0,5);//读取ad转换值 5次求平均               
    - i5 ~* `4 q7 h5 m2 b) r
  2.                         printf(" adcx %d\r\n",adcx);        ( _  X1 `, L8 D1 ~/ @
  3.                         + A3 k, h/ t: m) {" p8 s2 G4 P
  4.                         sensorVal =99-((float)adcx*3.3/4096)*2*99.0/5.0;// 采集值  *2表示电阻分压        输出最大5v 但是要转化为最大3.3v               
    8 z6 y% K: T/ d0 D* j* o
  5.                         sensorVal =99-((float)adcx*3.3/4096)*99.0/5.0;5 I9 z- l+ `% F6 ^, D7 a% _3 u8 P2 B% h
  6.                         3 Z3 t. J+ J6 K
  7.                         printf(" sensorVal %d\r\n",sensorVal);# w/ c% {# M% i5 a3 b
  8.                         if(sensorVal<BASICS_VAL)sensorVal = 0;//过滤传感器本身自带电压
    8 ^0 C4 l7 |' w9 e3 _3 ?
  9.                         else
    4 j: i; |4 m- y( R7 X+ J$ s
  10.                         {0 H. j  @9 g! O
  11.                                 sensorVal = (sensorVal-BASICS_VAL)*99/(99-BASICS_VAL);//将30-99值转化为0-99的值8 _6 |! w% Y6 d: V% j
  12.                         }
    5 Q7 N0 m2 V0 `. x
  13.                         $ Z( G! x+ Y( g# W, I& z. [; W
  14.                         printf(dis0,"nowValue:%d   ",sensorVal);                //打印                                        5 f3 R3 o" {9 |/ h& ]: [
  15.                         $ a6 E/ K5 r! Y4 R
  16.                         if(setMode){4 [: Y8 a$ h4 s: O
  17.                                 printf(dis1,"setValue:%02d<   ",setNum);                //打印                                * Z3 Y4 f( {+ I& |
  18.                         }
      x4 E* B1 [4 q1 T
  19.                         else{0 e: y6 I  x& z% E4 d" a5 T
  20.                                 printf(dis1,"setValue:%02d    ",setNum);       
    % Q# E% j' O7 c: {# C3 Y& |
  21.                         }
    , T5 c  u+ B! \1 |
  22. </font>
复制代码

/ ?: f* `& @( ^3 D1 s
. ~7 z2 r- f1 W& z& P
总结! S0 c( r6 t4 J6 U4 _8 d0 _8 C
最后输出的结果:0 f) c) F" U: `4 f( Z6 F# |
根据测试,雨滴模块浸入水的深度不同,返回的电压值转化成的adc值不同:
" W5 L6 v/ v% u) y2 ~, p完全无水的情况返回的adc值为4096;" e. f$ c7 u* ^9 y# G9 a
完全浸入水中返回值接近400(是因为有模块供电的电压)。4 R1 l' N8 @) v9 I
根据400~4096的区间,按百分比输出,无水情况输出0,完全浸没输出99;$ i# z7 K- b" n( G

$ k. C: `  p1 `
赞 收藏 评论0 发布时间:2021-7-22 14:47

举报

0个回答
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
人形机器人运动控制、感知与智能配电
半导体创新技术与应用方向
EE架构与软件定义汽车
12V/48V 汽车智能配电(SPD)
区域控制单元(ZCU)与分区架构
关注我们
st-img 微信公众号
st-img 手机版