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

STM8 ADC扫描(C++版本)

[复制链接]
小槑槑 发布时间:2015-4-23 22:38
刚开始学单片机,STM8在IAR环境下能用C++,对我来说实在是太好了,我是那种没对象不会编程的银,我可以把功能都封装起来,以后需要优化时再脱离库函数。
: q4 K5 k' k$ x. ]8 U4 N3 _: [2 E这两天总结了一下STM8 ADC的用法,手头的103F6支持5路ADC,两路被UART占用了,这里列出我的三路扫描的方法,与各位初学者共同探讨:
) i: F  I0 N/ P& |& w4 v. D( |) I" \, N9 `% j5 J1 x% {) c! {7 W/ V+ W: M
// 头文件:0 X/ n* H. H$ ?2 s  k* [4 J
! @% U8 j2 L, S  v8 k! z
/*
, ]: _* T1 D& U; c   ADC
. A1 ]  ^$ L; B# [*/0 Q2 q, G+ y) B+ ]$ g8 T6 u) P- W
# P$ w" l- t. H; D2 \
#ifndef  _ADC1_H
7 U3 j6 n. [5 |- l! Q% Y& K#define  _ADC1_H
( k3 E7 O( n" S5 i
  {, N# C8 g" y& K#include "stm8s_conf.h"
( `; f$ W/ V4 O* v* ~' Z
* J( m% A( g1 |* I# Z' v+ G7 C4 |#define ADC1_EOC_IRQ                    0x16
# A0 p+ F1 y1 p  P  t$ N, y
& b7 [! r! B  ]" G! E( Wclass __near cADC1( }$ Z5 x0 o# U/ @% R/ N
{  d+ G2 t. K- v/ J! f. A
  public:9 n1 n& A, R" A. ]' S
    cADC1(int);9 u/ C/ _" ]; C' w9 v! c$ A/ q: v
    uint16_t                    read_ADC_value(ADC1_Channel_TypeDef);
9 m% u: P- Z# K4 o0 r: l, N    void                        NextConversion();" F& H% y! e3 O% |
    void                        StartConversion();! Y" V7 b+ s4 J3 ^3 J7 m
  private:
" [1 Y$ ~% N7 L; U+ J$ E  N    uint16_t                    m_channel2_value,m_channel3_value,m_channel4_value;
. U3 H) E! @$ D: u3 n9 @- h    ADC1_Channel_TypeDef        m_current_channel;              
$ K1 D4 n) i" Y8 C2 d4 Q. \3 |# r; U};
' i$ q; K" k+ B8 D
) Z! T8 R7 a6 ?0 q' S6 OcADC1           __near Adc1(0);
. J2 U6 J8 i& x: }9 {6 m#endif
1 ]; V! Q) d" Z; Y% @/ g1 k& Z  V/ ^7 z, W4 l8 r9 }1 d
// 源程序( O! ?! D  ~- f6 o6 ?
#include "Adc1.h"
( i. p; R* x& V: ?& O0 \
& ~8 z8 `& R! _( F/* ADC1 通道扫描方式, 开通了三个通道 */, e1 z7 o5 V; P$ m
3 A( i' n3 O3 j. K8 V  j
cADC1 __near *Adc1_instance;  - l7 |* b6 f% T. m
" M1 ~0 a- O2 \: {; @
cADC1::cADC1(int id)# a1 {' x/ q: _5 f5 F. F% M
{5 o( E- B, f. N6 Q: v  P0 B
  Adc1_instance = this;      // 中断要引用这个实例
- s4 _! c! `* f: r- X- a  // 对于stm8s003 103F3,有ANI2~6$ n9 q; C0 {0 k, {% }( f; y
  // ADC1_CHANNEL_2:, E, n9 K. c/ _) m" _
    GPIO_Init(GPIOC, GPIO_PIN_4, GPIO_MODE_IN_FL_NO_IT); 5 b6 \& i) z1 k3 n  H
  // ADC1_CHANNEL_3:
* }, E7 u4 Z1 Q/ y  W    GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT);
2 z5 Z+ [1 L9 W* H" |8 Q: L  // ADC1_CHANNEL_4:9 `8 d8 R/ t! N: o- c- T
    GPIO_Init(GPIOD, GPIO_PIN_3, GPIO_MODE_IN_PU_NO_IT);" E) A/ D5 \  m& M4 Q( c6 m: r
  // ADC1_CHANNEL_5:  // UART1_TX5 F5 e# `0 X1 S9 N
  // GPIO_Init(GPIOD, GPIO_PIN_5, GPIO_MODE_IN_FL_NO_IT);
2 X8 ~0 F' S& n) u9 I  // ADC1_CHANNEL_6:  // UART1_RX
6 [6 _8 f+ U2 s  // GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); / L1 d3 p1 Z$ Q2 \! |: T

# o: e/ h# x# a4 Y  m_current_channel =  ADC1_CHANNEL_2;4 r- h$ r. c* {7 w
  ADC1_Init(ADC1_CONVERSIONMODE_SINGLE , m_current_channel, ADC1_PRESSEL_FCPU_D8,\" R5 S. D' _  |! c4 G1 s% n: @# W) S
    ADC1_EXTTRIG_TIM, DISABLE, ADC1_ALIGN_RIGHT,ADC1_SCHMITTTRIG_ALL,ENABLE);
1 ^7 G+ ]1 s3 c: z% b) g  ADC1_ScanModeCmd(ENABLE);             // 扫描模式# U8 h; b3 ~6 S' [3 q
  ADC1_DataBufferCmd(ENABLE);           // 使用数据缓冲区寄存器
+ w8 O7 r+ e' {" E, z9 U1 x8 D6 q  ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE); // 转换结束中断! d  o  Z% w! b1 w+ _' W
  StartConversion();                    // 执行第一次转换. J4 N, b7 j& m& Q! K+ D; \
}
& O9 A* N. S+ B. W4 d5 m' X5 X# U
uint16_t cADC1::read_ADC_value(ADC1_Channel_TypeDef Ani)( _5 |/ G+ B1 H( X5 X
{
* S4 v* @7 [3 I1 G. |% L  switch (Ani)
3 _" @" ]5 q6 j: Y* j. D& W' u  {6 ]' X4 J/ J- k1 O! [2 B. W) T
   case ADC1_CHANNEL_2:  return m_channel2_value;
/ z* }  \0 a) Q: g# E1 q   case ADC1_CHANNEL_3:  return m_channel3_value;
2 C6 i9 x& R' L% d   case ADC1_CHANNEL_4:  return m_channel4_value;
( j5 l/ ?- n6 W! Q& A  Z   default: return 0;
7 F2 p$ y4 M& O; [3 z2 r+ L* P  }1 K( m4 e& {9 Z3 F9 z* q$ F
}
' P# g& e; X# ?& N2 l: \9 N! l# N$ w' E; D' j
* q5 M7 o' K/ m0 s/ m
void cADC1::StartConversion()8 W: Z. h6 W4 v" u1 z
{
* f  h& H% i1 e+ u) G  if (ADC1_CHANNEL_2 == m_current_channel)      // 启动通道
+ e& }! ~  x3 w9 s  {
. I. O% V2 A$ z6 ~7 ~    ADC1_Cmd(ENABLE);                           // 中断使能; q0 h# o7 ]/ m- D1 {
    ADC1_StartConversion();3 X! d% G( E' F2 `' `9 |$ M
  }
+ \: k. n% H3 u/ ^; N. H# b2 \}9 G8 N5 a( t8 r) v- G9 o
: P9 |  P, ]) d8 s
void cADC1::NextConversion()# |) t9 W- q( `7 w! Q; A/ `. [* _$ J2 L
{  k. M8 b; p! ^6 g- P. J; {% |( t; x" `
  switch (m_current_channel)' i+ Z" C/ K2 q+ b# ^. L: s
  {
9 y# f* Q* U8 ~+ Q    case ADC1_CHANNEL_2:5 L; S/ B; P. X: }
      m_channel2_value = ADC1_GetBufferValue(0x02); // 读取ADC结果,保存在成员变量中) L# |2 }/ X4 m7 l$ p, Y9 g
      m_current_channel = ADC1_CHANNEL_3;           // 切换到下一个通道
8 ?) c" G( u  D% X4 {0 ^( c( I( e      ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, m_current_channel, ADC1_ALIGN_RIGHT);
) t+ w4 t. u6 Y  \$ m1 Z; t9 b2 ]      break;
& E! N( E. `! E" Y7 ^; `
% X: p. ~1 f8 T6 i    case ADC1_CHANNEL_3:) ^9 j6 y: `+ c7 Q9 Y
      m_channel3_value = ADC1_GetBufferValue(0x03); // 读取ADC结果,保存在成员变量中
. P+ C) R; i3 c$ u+ A      m_current_channel = ADC1_CHANNEL_4;           // 切换到下一个通道
2 X8 M( {) B) ]9 H* }$ E% o      ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, m_current_channel, ADC1_ALIGN_RIGHT);! s) K, ?" x6 M# N2 X  K. l: E/ c
      break;3 t6 b) v9 N' e9 z& z/ |
# \* P; s' E+ g& j7 k8 q0 d% x
    case ADC1_CHANNEL_4:
6 |: l0 V  J( Z# i& P: E      m_channel4_value = ADC1_GetBufferValue(0x04); // 读取ADC结果,保存在成员变量中: c3 P% j& @2 e. q
      m_current_channel = ADC1_CHANNEL_2;           // 切换到下一个通道
) @5 L3 Y, S/ \% W; g      ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, m_current_channel, ADC1_ALIGN_RIGHT);
1 y& V  Q  G5 A8 A7 I! F6 n                                                   
0 u2 {+ K: j- ]5 N6 u/ O% t3 d      ADC1_Cmd(DISABLE);                            // 停止,由StartConversion启动下一次的扫描
% q% L9 i; B4 L1 w: ~+ L' x4 r      break;
8 L/ i4 L0 C5 C( e9 |                                                     //  可以扩展到通道5、6
! n1 d& z4 S8 T2 V0 T( p    default:
$ T% Y# K, E6 i( @7 \; t2 z      break;! w' x; K  ?' j4 K0 Y3 E5 e% B9 d
  }
* q, j/ N5 n/ _/ q3 s$ t}( N, x3 P. ^$ e3 U) i

' M9 }2 o5 h- E# ?9 f: p  d. }INTERRUPT_HANDLER(ADC1_EOC_IRQHandler, ADC1_EOC_IRQ)
2 h+ U' ^* W$ n  |% [{4 [5 ~( l0 F. P7 U& k
  ADC1_ClearITPendingBit(ADC1_IT_EOC);
7 v2 E: j4 H8 w7 K4 o3 R* c& u# |  Adc1_instance->NextConversion();0 i3 T, d- W. j; c& s' O+ i$ Q" ]
}* A( a/ o1 }# a" p( w

8 u. i7 Q! c; w只需要定时调用Adc1.StartConversion(),就可以通过 Adc1.read_ADC_value(ADC1_CHANNEL_x)读取相应通道的ADC值。
赞 收藏 1 评论2 发布时间:2015-4-23 22:38

举报

2个回答
小槑槑 回答时间:2015-4-23 22:59:58
void cMANAGER::Run()( t( T0 x( h; |7 k. T
{. n+ L# H$ h2 T) K! S: l
  int value;2 N1 u5 t& L. Y
//  Led_yellow.Flash();1 M6 M8 g% R0 x& Q
  value = Adc1.read_ADC_value(ADC1_CHANNEL_2);) a$ n6 U; X6 `8 i7 G4 J. H. F
  double voltage = value * 3.3/ 1023;
5 ~, I5 R4 J7 ]  I$ E% {9 E7 ?" F  double radio = (double)value / 1023 * 100;
; Q3 x9 s- h: f* o9 i  cUART1::printf("value = %d %d %d %fV %f% \r\n",% `4 w$ d' B7 ^% y) H7 H7 i' \
    Adc1.read_ADC_value(ADC1_CHANNEL_3),4 J! N' R% r1 l$ h3 f. D
    Adc1.read_ADC_value(ADC1_CHANNEL_4),
/ J+ X0 |: z4 r" B    (int)value, voltage, radio);3 y! b7 R- i7 n/ x8 k5 w) l
}
$ K. T- L$ j& i三路采样输出的结果:
1 x) C! D8 d4 }  A. B22:55:29.677 value = 550 658 413 1.3322V 40.3714%
% ~3 \  R& \! `5 i3 h" Y22:55:30.180 value = 550 658 414 1.3354V 40.4692%
$ x% n5 Y* h! p9 a, V22:55:30.683 value = 550 658 414 1.3354V 40.4692% % o: O& P6 O/ w0 n
22:55:31.186 value = 551 657 413 1.3322V 40.3714%
  j& y' x% d2 X0 X( w# U22:55:31.690 value = 550 657 413 1.3322V 40.3714% , Q* n# W' S. N2 V* U) G
22:55:32.192 value = 550 657 413 1.3322V 40.3714% 3 a3 v+ E+ ]4 o/ W
22:55:32.695 value = 550 657 414 1.3354V 40.4692% , g# c8 L" Y$ I" @, |/ ]- U
22:55:33.198 value = 550 658 414 1.3354V 40.4692% 4 u8 ?) \; m. U  ]
22:55:33.701 value = 551 658 414 1.3354V 40.4692% ; e% [' b5 ?8 [- l: y
22:55:34.206 value = 550 658 413 1.3322V 40.3714%
5 M! c1 n# a" @( H! `$ y22:55:34.707 value = 550 657 414 1.3354V 40.4692% % x* }" W* p- ?: g3 q
22:55:35.210 value = 550 657 413 1.3322V 40.3714% 1 g- m3 Q! R  j5 _5 p8 N% p. O. {
22:55:35.713 value = 550 657 413 1.3322V 40.3714% / x; H0 ~8 M* d
22:55:36.216 value = 550 657 413 1.3322V 40.3714% " R" ], W' I* ]% s
22:55:36.719 value = 550 658 413 1.3322V 40.3714%
% F7 F  m: r6 f3 G/ t22:55:37.220 value = 550 658 414 1.3354V 40.4692%
8 g: b! p3 P. L2 K! b22:55:37.720 value = 550 657 414 1.3354V 40.4692%
9 T& \- Q" q" d4 K5 [7 ^1 x22:55:38.228 value = 550 657 413 1.3322V 40.3714%
- U9 Q& o& ^. S, w0 y22:55:38.731 value = 550 657 413 1.3322V 40.3714% " {4 L7 w0 Y4 @( ?
22:55:39.234 value = 550 658 413 1.3322V 40.3714% 2 _, Q( }8 Q: L( Q. d  P
lianghang 回答时间:2015-4-24 14:43:53
C 语言还是很重要的;

所属标签

相似技术帖

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