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

STM32读取双轴遥感的数据值

[复制链接]
STMCU小助手 发布时间:2022-9-7 19:04
一. 简介8 K4 U3 [* H) x0 R
在按键控制方面,双轴按键遥感远比按键要方便,而且使用非常简单。它一共包括三个数据引脚,分别是X轴的模拟输入,Y轴的模拟输入和按键输入,另外还有一个GND和VCC。这里VCC是一个参考电压,可以接5V,也可以接3.3V。如果接的是5V的话,那么X轴的模拟输入电压就为0-5V。& ]% n) e! k/ Q( q
: o1 L* [4 Y* S7 g
d2f7399ee0f74ab4bab7b03642eebc5e.png 3 w+ C& l9 v8 ]* q  M5 `0 z
8 ~/ ~% _; U. b0 m9 S
二. STM32读取双轴遥感数据
- o  u7 D" }1 Y/ E由于输入的是模拟值,所以需要使用ADC进行模拟采集。通过数据手册可以知道,ADC是其引脚的附加功能,不需要进行复用配置。只需要将GPIO_Mode配置成AN即可,然后配置ADC的相关信息就可以了。
, i% o+ A$ z7 m* p$ @" M! u  d7 f
( X( T( X6 n# B) J' [% E* N/ B+ Q d0a758d507444c6d8de3f74ffb9cb947.png
' F* [+ r) r+ g8 m6 q6 c) l
7 S+ U8 m* P. o/ j/ YGPIO初始化
% ^4 t9 m1 i! p2 K; n% Y4 y8 o
$ `3 z2 k5 m! i. a- P/ P0 i
  1. /*GPIO Init*/. {  N$ r. X1 r7 H
  2. void XYRocker1GPIOInit(void)
    ; U9 m/ K! T* k: y9 h
  3. {
    + {7 M7 `: d( T9 S
  4.     GPIO_InitTypeDef GPIO_InitStruct;) {5 }! m( }3 t9 ]. x+ w) y) e3 F0 B
  5.     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA,ENABLE);
    7 P/ o0 _4 i% O

  6. 8 W/ n: w5 T2 \+ W) N( Q
  7.     /*XY GPIO*/. f1 Z3 H& V* c# m+ W
  8.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_0 | GPIO_Pin_1;9 R: G7 O5 Q( f$ S* }: c
  9.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_AN;  /"附加功能"/. u; s  i5 v3 a5 x. [
  10.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_100MHz;. ^1 o$ ?  o, f+ R/ V- Q) G
  11.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL;
    ; z8 q9 o% s4 O. c1 I$ o8 |
  12.     GPIO_Init(GPIOA,&GPIO_InitStruct);
    3 f6 y3 S' h; C" B4 i1 |
  13.   V5 I8 E8 y* k' F8 `! l
  14.     /*rocker key 双轴遥感的按键*/   
    1 p. N7 V; X- k  B; i* N+ S
  15.     GPIO_InitStruct.GPIO_Pin   = GPIO_Pin_12;
    2 w# B) D4 T2 `8 M
  16.     GPIO_InitStruct.GPIO_Mode  = GPIO_Mode_IN;
    + S/ t$ r" U- ~1 a* I: p' b. `
  17.     GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
    2 w/ p- i/ `. L3 F9 P
  18.     GPIO_Init(GPIOB,&GPIO_InitStruct);: z* l1 _" ~5 b8 G" t
  19. }
复制代码
4 l1 t- @% h  a# |) \4 [/ z& Z3 E
ADC初始化
7 r  G' q5 {7 n) _1 m" s) N' @4 u
  1. void XYRockerADCInit(uint8_t num)
      q! N1 Z" |+ V7 b
  2. {" H# H. n& ?9 k" i$ S4 k
  3.     ADC_InitTypeDef     ADC_InitStruct;1 ~! D! e" e' Y8 r9 [. G; y2 \
  4.     ADC_CommonInitTypeDef  ADC_ComminInitStruct;
    & T& A, j& G9 K' _7 K6 q
  5. " J9 y; u4 @* P1 s5 O. [
  6.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);8 V% J4 r/ D* I! C
  7.     ADC_DeInit();3 S6 k6 C4 W0 _( S# p! u; y
  8.         2 q5 z1 Z" l0 O
  9.     ADC_ComminInitStruct.ADC_Mode                = ADC_Mode_Independent;
    % J) L2 L# L* W( I6 U- q# L
  10.     ADC_ComminInitStruct.ADC_TwoSamplingDelay    = ADC_TwoSamplingDelay_20Cycles;& ~" a- F# C- c
  11.     ADC_ComminInitStruct.ADC_DMAAccessMode       = ADC_DMAAccessMode_Disabled;
    & Y- i- c% ~! E0 A
  12.     ADC_ComminInitStruct.ADC_Prescaler           = ADC_Prescaler_Div4;* ?6 L! [# v3 ~! P
  13.     ADC_CommonInit(&ADC_ComminInitStruct);, K% C4 M( U3 K% L' Q

  14. . `0 x& N! n& w1 p1 p: a- |4 u0 v: f
  15.   ]. Q, b5 @; _; I5 K& [/ W% z/ d
  16.     ADC_InitStruct.ADC_Resolution           = ADC_Resolution_12b;, B' X7 m1 q) k4 S* i3 [2 D  A
  17.     ADC_InitStruct.ADC_ScanConvMode         = DISABLE;. {8 Y7 V9 h0 y9 F8 U
  18.     ADC_InitStruct.ADC_ContinuousConvMode   = DISABLE;
      m& J# L) O/ a+ i
  19.     ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;$ Y% @4 A+ d( g6 H8 |3 K: ?
  20.     ADC_InitStruct.ADC_DataAlign                         = ADC_DataAlign_Right;//右对齐2 h9 W! [1 l5 n, }1 }
  21.     ADC_InitStruct.ADC_NbrOfConversion      = num;
    ! k5 P9 G4 q0 q3 V: P
  22.     /*双轴有两个模拟输入,所以这里设置为2,如果是两个遥感,使用的是同一个ADC的话,这里设置为4*/
    " G# O$ x( y* }; E

  23. - v7 V$ G. Q5 R3 T- {
  24.     ADC_Init(ADC1,&ADC_InitStruct);
    , D  _+ E. Z: \+ x- ~& j9 T

  25. $ ~# h$ o/ N# q7 |  w
  26.         
    + x! y! A3 v# _
  27.         ADC_Cmd(ADC1,ENABLE);
    ; |) _7 I6 r4 V( @
  28. }
复制代码
3 `3 X* e, k. V/ ^) S
数据读取
( q& m# A$ j) h! ]% a
  1. uint16_t getX1Value()
    ! Q* O. W1 q$ E2 n) m
  2. {
    / I8 K+ s8 ?6 T9 w% F
  3. /*设置通道进行转换*/$ e& J+ T: N- p  \( t1 ]( t
  4.     ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_480Cycles );        
      x  @) O; r8 w/ H) l% p/ T9 B
  5.         ADC_SoftwareStartConv(ADC1);                //使能指定的ADC1的软件转换启动功能        8 p5 d  s' j/ S
  6.         while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待转换结束
    - R2 R; v+ t# t2 b% `% `
  7.         return ADC_GetConversionValue(ADC1);        //返回最近一次ADC1规则组的转换结果! Y( }" p# O9 R0 a! ^8 y4 [
  8. }
复制代码
8 F+ Q  z7 L* }  C- {, Q
经过上面的几步,就可以进行双轴遥感的读取啦。% c. f6 r) L3 t' F8 ?. R
复位状态值为2200左右。双轴遥感向上的时候只就为0左右,向下的时候,就是65536左右了(16bit 0-65536)。左右方向也是如此。其实际的电压值,会由0-65536映射到0-VCC来(VCC是你给它接的电压值)。0 |+ D7 w% Z, s. o; A3 ^+ R7 }5 _
————————————————
$ j/ y/ l1 f, Q版权声明:ValentineHP' v, ]$ A' |0 R% y3 ]. B. a4 y

7 H& U6 b& l& I5 e
赞 收藏 评论0 发布时间:2022-9-7 19:04

举报

0个回答

所属标签

相似技术帖

官网相关资源

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