|
刚开始学单片机,STM8在IAR环境下能用C++,对我来说实在是太好了,我是那种没对象不会编程的银,我可以把功能都封装起来,以后需要优化时再脱离库函数。 这两天总结了一下STM8 ADC的用法,手头的103F6支持5路ADC,两路被UART占用了,这里列出我的三路扫描的方法,与各位初学者共同探讨: ) 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 /* ADC */0 Q2 q, G+ y) B+ ]$ g8 T6 u) P- W # P$ w" l- t. H; D2 \ #ifndef _ADC1_H #define _ADC1_H #include "stm8s_conf.h" #define ADC1_EOC_IRQ 0x16 class __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); void NextConversion();" F& H% y! e3 O% | void StartConversion();! Y" V7 b+ s4 J3 ^3 J7 m private: uint16_t m_channel2_value,m_channel3_value,m_channel4_value; ADC1_Channel_TypeDef m_current_channel; }; cADC1 __near Adc1(0); #endif 1 k& Z V/ ^7 z, W4 l8 r9 }1 d // 源程序( O! ?! D ~- f6 o6 ? #include "Adc1.h" /* 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; // 中断要引用这个实例 // 对于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: GPIO_Init(GPIOD, GPIO_PIN_2, GPIO_MODE_IN_PU_NO_IT); // 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); // ADC1_CHANNEL_6: // UART1_RX // GPIO_Init(GPIOD, GPIO_PIN_6, GPIO_MODE_IN_FL_NO_IT); / L1 d3 p1 Z$ Q2 \! |: T 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); ADC1_ScanModeCmd(ENABLE); // 扫描模式# U8 h; b3 ~6 S' [3 q ADC1_DataBufferCmd(ENABLE); // 使用数据缓冲区寄存器 ADC1_ITConfig(ADC1_IT_EOCIE, ENABLE); // 转换结束中断! d o Z% w! b1 w+ _' W StartConversion(); // 执行第一次转换. J4 N, b7 j& m& Q! K+ D; \ } . W4 d5 m' X5 X# U uint16_t cADC1::read_ADC_value(ADC1_Channel_TypeDef Ani)( _5 |/ G+ B1 H( X5 X { switch (Ani) {6 ]' X4 J/ J- k1 O! [2 B. W) T case ADC1_CHANNEL_2: return m_channel2_value; case ADC1_CHANNEL_3: return m_channel3_value; case ADC1_CHANNEL_4: return m_channel4_value; default: return 0; }1 K( m4 e& {9 Z3 F9 z* q$ F } : \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 { if (ADC1_CHANNEL_2 == m_current_channel) // 启动通道 { ADC1_Cmd(ENABLE); // 中断使能; q0 h# o7 ]/ m- D1 { ADC1_StartConversion();3 X! d% G( E' F2 `' `9 |$ M } }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 { 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; // 切换到下一个通道 ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, m_current_channel, ADC1_ALIGN_RIGHT); break; case ADC1_CHANNEL_3:) ^9 j6 y: `+ c7 Q9 Y m_channel3_value = ADC1_GetBufferValue(0x03); // 读取ADC结果,保存在成员变量中 m_current_channel = ADC1_CHANNEL_4; // 切换到下一个通道 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: m_channel4_value = ADC1_GetBufferValue(0x04); // 读取ADC结果,保存在成员变量中: c3 P% j& @2 e. q m_current_channel = ADC1_CHANNEL_2; // 切换到下一个通道 ADC1_ConversionConfig(ADC1_CONVERSIONMODE_SINGLE, m_current_channel, ADC1_ALIGN_RIGHT); ADC1_Cmd(DISABLE); // 停止,由StartConversion启动下一次的扫描 break; // 可以扩展到通道5、6 default: break;! w' x; K ?' j4 K0 Y3 E5 e% B9 d } }( N, x3 P. ^$ e3 U) i INTERRUPT_HANDLER(ADC1_EOC_IRQHandler, ADC1_EOC_IRQ) {4 [5 ~( l0 F. P7 U& k ADC1_ClearITPendingBit(ADC1_IT_EOC); Adc1_instance->NextConversion();0 i3 T, d- W. j; c& s' O+ i$ Q" ] }* A( a/ o1 }# a" p( w 只需要定时调用Adc1.StartConversion(),就可以通过 Adc1.read_ADC_value(ADC1_CHANNEL_x)读取相应通道的ADC值。 |
STM8自学笔记(推荐STM8很好的入门电子书)
无刷直流电机控制应用+基于STM8S系列单片机---电子书
【精华资料】STM8Sxx固件库FOR IAR
基于STM8的DALI (数字可寻址调光协议)
分享STM8 风驰光盘的资料,是完整的(包括原理图+例程+PDF注释)
《无刷直流电机控制应用 基于STM8S系列单片机》
STM8S库函数中文参考 小软件
【资料分享】STM8L的智能手持血糖监测设备的源码
基于STM8S207工程模板
【培训资料】STM8系列PPT培训资料
微信公众号
手机版
{. 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;
double radio = (double)value / 1023 * 100;
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),
(int)value, voltage, radio);3 y! b7 R- i7 n/ x8 k5 w) l
}
三路采样输出的结果:
22:55:29.677 value = 550 658 413 1.3322V 40.3714%
22:55:30.180 value = 550 658 414 1.3354V 40.4692%
22: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%
22: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%
22: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%
22:55:37.220 value = 550 658 414 1.3354V 40.4692%
22:55:37.720 value = 550 657 414 1.3354V 40.4692%
22:55:38.228 value = 550 657 413 1.3322V 40.3714%
22: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