附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下0 J" p" p$ y. Q4 ?) R0 ~
! ?2 x. b/ \3 a7 n4 B
- /**
: ]4 B K* d/ i4 _ - * @brief 配置ADC1的工作模式! J( G: l8 ^7 v. m
- * @param 无3 X" T3 U# B& g" K* a1 ]
- * @retval 无/ k6 |; N) m( W. N: f: Z( n. d* O
- */
/ A* C/ c w% T4 t - static void ADC1_Mode_Init(void)
+ Q' G1 s' c. A; m# v' J' x- F2 z3 b - {
. ~. o- u5 \; @: B% S% I$ D! [ - ADC_InitTypeDef ADC_InitStructure;9 Y8 t P# D2 @ E! N2 M8 k7 |
- 0 C3 C7 L* A+ _/ _
- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
$ [5 Q3 [- C7 H" ] - RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4); " J6 d7 w; s! o9 B
" I ^) N5 i7 T7 Q$ N5 w- /* ADC1 Periph clock enable */) y+ n" g5 ^# }* u S! I$ T
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
; O, C# N- X0 F% V6 p - , T" L% t* [& K) g) ?
- /* ADC1 DeInit */ 3 M, T+ N5 b! Y9 C* O& `
- ADC_DeInit(ADC1);/ _8 F7 Y; R& o( T5 @8 |
-
9 N; y. j8 \+ { - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/! m) U. r. K" y/ z) t
- ADC_StructInit(&ADC_InitStructure); 8 m+ n5 z1 b1 G5 S
- 0 t p3 x& I" J6 V* A. { C
- /*配置ADC分辨率为12位*/! K: D8 T2 J+ Z2 N. F
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;8 a6 @1 |8 }6 l
- 5 Q2 D4 f: A' E4 D# [. X5 X! `
- /*开启连续转换*/6 Y# o1 \ `' m! B6 q* \, B' x3 r
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; / R I$ u. q M9 o* p; J X
O3 f2 t% Q3 T, M, n+ A# p6 ]- /*禁止触发检测,使用软件触发*/2 { x8 M" t( F o, r3 v
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;" c& M* h2 q3 D5 X) U
/ n, n/ u3 e. @- /*ADC采集数据右对齐*/
! s- o) H* Y/ \4 V8 D4 |, g - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
& d3 N n3 Y4 b5 b0 x4 [
% N4 H0 ]( u7 F- /*向上扫描*/% X1 s7 @: o I+ d2 o7 E
- ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
4 F$ u* A% E0 Z8 a1 A5 ? - ( Q' D. K; @' A! L$ h
- /*ADC初始化*/
- e/ ^. m5 W4 u0 ] - ADC_Init(ADC1, &ADC_InitStructure); % S; g" E$ ~- u }6 H: a
-
( b2 }% Z- Y6 F$ @: Y" ^ - /*配置采样通道及时间*/) v) L' ^9 p7 m8 c! R0 c
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); ' C h H, b( x( N
+ M W' z2 W3 [- r- /* ADC 校准 */ A; _+ `2 m; `* w
- ADC_GetCalibrationFactor(ADC1);
) F b# ?4 c+ s - 8 U! c% t# [( o0 u, S
- /* 循环模式下的 ADC DMA 请求 */4 w9 ^2 l( J9 g6 i/ r2 ^& a K8 d g. }, d
- ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
: w& b5 U& F- H: ^; [: n/ j
! a: L- J( D$ E- X9 Z2 H- /* 使能 ADC_DMA */
# E5 n" o% P4 H- a) i8 q( U - ADC_DMACmd(ADC1, ENABLE); 9 G# A9 I* }3 _( w0 ~$ D% ~$ m$ ]# E, k
6 i& _! C, T5 z3 }3 _, v ~- /* 使能 ADC1 */* M8 X' N; ]* h1 w% }
- ADC_Cmd(ADC1, ENABLE); 5 H$ K! q3 p. J
- / s; f1 E& D7 D9 K' u& P
- /* 等待 ADCEN 标志 */5 P, v( }3 e+ I5 j# @* o& j
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
" s" I8 g- t# p2 T1 \' |0 }
, P5 o7 j, f$ }) L% A6 F% V8 l- /* ADC1 常规软件启动转换 */
) h3 J! z# }. G - ADC_StartOfConversion(ADC1);
! g2 { s1 S: g - - ]4 b* g$ \# S3 c, T) {8 u
- }
复制代码
* {7 l7 V3 o2 |! T! t8 D' b7 \. R: l' X/ Z
|
* @brief Configures the ADC clock (ADCCLK).
* @note This function is obsolete.4 U5 K6 k N: Y; M0 B
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver9 \' T' X W0 F
* @param RCC_ADCCLK: defines the ADC clock source. This clock is derived
* from the HSI14 or APB clock (PCLK).
* This parameter can be one of the following values:
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)% S4 ]- x# ^3 J8 g% ]8 M: J2 E
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2( r) G6 |1 I8 W$ \3 S" R
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None% O8 G/ r2 Y* l: ^/ ?# s+ z! b% I
*/) |# B: h% Z; d; e8 n8 U; t
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)$ Q0 @- Y$ ^3 F1 L9 `- T9 Y- e
{
ADC_InitTypeDef ADC_InitStructure;8 t& S! R$ D' z
1 \- ^- b$ ?/ R
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/( z. H9 C; B( S5 D1 N/ Z3 [
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);! G) X' s8 i0 s6 }% P1 w- _/ J$ t
$ q& G) y& U- R" W( l
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
另采集数据全0,还没看那里的问题..6 I, w! F' s( A" K3 E# J
/ R" h# p- H" q' {0 R1 ~+ x4 y
滤波显然会影响速度的吧?
滤波之后还能有多少bit?, u. F# |! M$ l* m
你现在是内基准还是外基准?
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持