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

STM32读取双轴遥感的数据值

[复制链接]
STMCU小助手 发布时间:2022-8-20 16:00
一. 简介5 e# d$ M/ A8 ], i9 C, r# H
在按键控制方面,双轴按键遥感远比按键要方便,而且使用非常简单。它一共包括三个数据引脚,分别是X轴的模拟输入,Y轴的模拟输入和按键输入,另外还有一个GND和VCC。这里VCC是一个参考电压,可以接5V,也可以接3.3V。如果接的是5V的话,那么X轴的模拟输入电压就为0-5V。3 S+ |8 x% t- V% v# o
! f0 T9 }* ?) i% z/ P
d2f7399ee0f74ab4bab7b03642eebc5e.png
! [& w( k, Q) T8 E# o/ R$ u9 D0 l, s( [2 c3 O% B2 D5 s
二. STM32读取双轴遥感数据
! v2 x) H' E! k) W+ ?% ]5 E
由于输入的是模拟值,所以需要使用ADC进行模拟采集。通过数据手册可以知道,ADC是其引脚的附加功能,不需要进行复用配置。只需要将GPIO_Mode配置成AN即可,然后配置ADC的相关信息就可以了。; g- B( W. W! X# g& ~& j/ d* R

6 m& \, I8 j. x7 ]  I d0a758d507444c6d8de3f74ffb9cb947.png
0 S0 p  e4 T7 |* Y) s! D# l; a, J& Q4 K6 T4 h* x. \$ {3 W0 Z
1.GPIO初始化1 _, A& c. @4 t+ v, A

  1. ( {, l. `/ M0 m$ }6 _. q- a7 Y
  2. /*GPIO Init*/
    # R. A1 r) k8 Z5 ^
  3. void XYRocker1GPIOInit(void)
    $ }( J( X4 u- @! Y+ }0 b( v
  4. {: h9 D1 t# f  k9 b" k% W
  5.     GPIO_InitTypeDef GPIO_InitStruct;
    5 A& o' ]: v. H2 _6 E, r8 `& e
  6.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);: J: d: d( `9 c$ c5 h4 j. d% h! r
  7. : h0 {: C% k( F
  8.     /*XY GPIO*/+ ~4 K% z0 K! I& Q+ h( B: K
  9.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1;
    * D$ t# f5 }7 y2 P
  10.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AN;  /"附加功能"/
    1 n+ ~" G$ P" H; t' s
  11.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;2 \/ b) ~' R7 M8 p! q6 d
  12.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;, @9 C! `; u& k( p" f# }: R) t* F
  13.     GPIO_Init(GPIOA,&GPIO_InitStruct);
    ' H+ }/ U: J  z2 \* {: c

  14. ( p% o6 O6 \. E) _4 t5 L% b# h
  15.     /*rocker key 双轴遥感的按键*/   5 ]. T" d4 ]4 _# z+ l# l5 ]
  16.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_12;: {; c( q: _  P8 a
  17.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;
    1 o8 Q8 o3 h& J& x, k, v/ c9 b( w
  18.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;# `7 [0 ?: d: Z& j) _7 \; n- l, n8 n
  19.     GPIO_Init(GPIOB,&GPIO_InitStruct);+ |  j- U! m2 ?: h, \
  20. }
复制代码

% z9 p; u# F: b' {% b4 o9 pADC初始化
8 o: F6 w) t2 e; \, g: K; d0 Q# `
  1. void XYRockerADCInit(uint8_t num)
    # L4 @1 v( @# h1 ?# }) p
  2. {
    ; [2 U1 F  n& G/ ]4 u" ?
  3.     ADC_InitTypeDef     ADC_InitStruct;
    . ^) S* T+ \1 u- O& s3 x/ Z
  4.     ADC_CommonInitTypeDef  ADC_ComminInitStruct;* D( U/ p1 d" [4 P/ W
  5. 6 _7 t8 S3 U( _  \  e
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);) J: g1 E4 J* ^" h0 J7 t' z
  7.     ADC_DeInit();
      I! n% k& ]: g" }8 \# I9 d
  8.         5 b: M0 n  j: s% @# t& `2 E
  9.     ADC_ComminInitStruct.ADC_Mode                = ADC_Mode_Independent;
      _8 k- T/ p; A
  10.     ADC_ComminInitStruct.ADC_TwoSamplingDelay    = ADC_TwoSamplingDelay_20Cycles;
    1 _6 a/ i+ z, g
  11.     ADC_ComminInitStruct.ADC_DMAAccessMode       = ADC_DMAAccessMode_Disabled;
    ' V* C, k: U* `# o8 H: m4 M
  12.     ADC_ComminInitStruct.ADC_Prescaler           = ADC_Prescaler_Div4;
    7 Z" |. M! O" r7 t8 b; p
  13.     ADC_CommonInit(&ADC_ComminInitStruct);7 Y$ T6 }0 S! c) ^# e
  14. & n  U# e8 w/ f! P8 e, B/ |
  15. ! e' Z& B* L8 e1 ^* E
  16.     ADC_InitStruct.ADC_Resolution           = ADC_Resolution_12b;0 i$ b  y6 [3 E, N3 C
  17.     ADC_InitStruct.ADC_ScanConvMode         = DISABLE;
    5 _4 C1 M9 F0 M) L8 V
  18.     ADC_InitStruct.ADC_ContinuousConvMode   = DISABLE;
    & X2 C3 i* D% a
  19.     ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;" O0 n, ]5 Y, S
  20.     ADC_InitStruct.ADC_DataAlign                         = ADC_DataAlign_Right;//右对齐
    6 F  d2 O: O2 R5 z6 H& F
  21.     ADC_InitStruct.ADC_NbrOfConversion      = num;
    9 L9 G2 _7 w5 C0 z, t( H+ B. ?' c
  22.     /*双轴有两个模拟输入,所以这里设置为2,如果是两个遥感,使用的是同一个ADC的话,这里设置为4*/# }, n* L3 N7 h- H2 q3 L

  23. & b0 U' o3 X' z% f: U! Y; k8 S* @( Z
  24.     ADC_Init(ADC1,&ADC_InitStruct);
    3 ^8 k/ D5 f: Q
  25. 9 ~/ i2 W: y$ \, @& V. L9 S
  26.         + \, z7 s. E% a) n, G
  27.         ADC_Cmd(ADC1,ENABLE);; y. c; X" Q+ I( n
  28. }8 H- ~: z" y3 }& v
复制代码
3 S7 q# u' Z4 c6 _. m% y9 Z
数据读取! T" J; A& |" P, m/ G6 a
  1. uint16_t getX1Value()# x/ J+ v5 |. g4 Q3 S: w
  2. {
    / D( @$ ~$ ]+ R8 j3 R2 |; b& o
  3. /*设置通道进行转换*/" m) b4 a! U& U' L; s
  4.     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles );        
    . l( x/ `0 ~, r
  5.         ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能        
    ! P6 {# b$ D8 s
  6.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    ! W1 N7 x/ q. g4 Y$ N5 v$ g
  7.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果/ i, \9 I# g! ~+ P; }
  8. }
复制代码

- `0 v3 y1 l8 S' O1 c经过上面的几步,就可以进行双轴遥感的读取啦。
5 I5 D% ]8 l8 f% L/ |- I1 p复位状态值为2200左右。双轴遥感向上的时候只就为0左右,向下的时候,就是65536左右了(16bit 0-65536)。左右方向也是如此。其实际的电压值,会由0-65536映射到0-VCC来(VCC是你给它接的电压值)。
( d2 b) R1 g) A2 P; E% w. z+ b  z8 A' I" p( v+ w1 f

! @" U6 v! p; K& m' z
赞 收藏 评论0 发布时间:2022-8-20 16:00

举报

0个回答

所属标签

相似技术帖

官网相关资源

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