附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
3 {( ~( W% s+ k, i" ~
& |. i, {. X5 L. b/ _, j& a8 z0 I' b- /**" K- ?1 O {% K' I
- * @brief 配置ADC1的工作模式( f8 `7 R8 l* ]' l* ~
- * @param 无
! o6 r, H: s2 Q6 E7 Y A( Q - * @retval 无
) V' w) l8 u1 Z8 E2 ^ - */
: a: G5 U; ~7 c3 }* B5 A' b' R - static void ADC1_Mode_Init(void)
$ t9 L" y; L: k1 O - {# S& R# }- i7 r, w
- ADC_InitTypeDef ADC_InitStructure;
$ }- i( b. q/ I6 k - 1 K' f, S" d6 y9 s/ Q! I
- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
+ E" Z, v1 }# O - RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
/ w% y# Y) q( d - 3 [5 ^3 ^% j; S8 Q- ]
- /* ADC1 Periph clock enable */
" C6 G0 A$ \' A( F5 E A - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);( g) a6 V1 L4 }6 y& n$ Z2 G
- : k4 y+ z4 L6 p* M1 ?
- /* ADC1 DeInit */ 4 ~, ~7 ~0 S; K; ~ W
- ADC_DeInit(ADC1);
% Q6 N; |8 H! r( m: E P7 x - + ^5 |# ^; Y; ?" l" Q% x- ?# @
- /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/
2 s5 ?( o$ `3 h' D: C - ADC_StructInit(&ADC_InitStructure);
4 v% `6 H) G8 \6 V M4 C9 x
2 Y' j2 q1 c3 U: A7 E- /*配置ADC分辨率为12位*/
' d1 h9 {5 \9 l+ Z - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;
! a& p% |' ~% ^
( T# f# d! Z8 K8 t- /*开启连续转换*/
4 B9 K1 S. V3 s% Y - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; 0 Q# r9 c! A- M" o, G; r7 h: e
- & f- S" Q2 F& r6 E0 h
- /*禁止触发检测,使用软件触发*/" O, Y$ e4 v7 k h* Q: H! `
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
3 Q" j3 n( i) _2 A# Z) ?
) {) [6 h- ~; ?! h+ O% J e- /*ADC采集数据右对齐*/: ]$ l; g( m2 e7 K0 ?. h
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
1 l' S: g8 a0 ~* d2 x) C* B8 v% G6 ]
+ Y$ Z% K O+ E2 G. j$ U! T' Q- /*向上扫描*/
: l- _" n# p9 D' U - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
. I! r( z" r. b8 D r' `
, N' r! w8 Q; y; d! Y- /*ADC初始化*/. s) ~; N0 C$ H' q4 ?
- ADC_Init(ADC1, &ADC_InitStructure); * C) t+ k D) x& a1 p Z, q
-
3 ^7 W) g+ P: _8 z' o! u# a - /*配置采样通道及时间*/
9 m! P, J4 N- D3 H3 S9 g/ l - ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); . ]) n2 @/ J, { _
- + h; p. R! u2 T6 K% a* U1 p! M9 n
- /* ADC 校准 */
4 O$ R6 | \' q/ U; c9 c2 F - ADC_GetCalibrationFactor(ADC1);! y; S" U* @5 M" s
% ]7 k6 J7 i, Q* X2 ]/ s, R- /* 循环模式下的 ADC DMA 请求 */
6 |$ g1 i I% M! ^' [ - ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);3 J/ Y! y2 G4 a, I" [
+ j' M7 ~, Z* w, _; w- /* 使能 ADC_DMA */5 n. @# P! B V; Y. w
- ADC_DMACmd(ADC1, ENABLE); - j5 o7 F9 k5 ^# D+ K6 s
- 0 q6 |0 G# j0 [* Z! g3 ]/ r+ }7 T- }
- /* 使能 ADC1 */9 H- m* h: B; N* u) A
- ADC_Cmd(ADC1, ENABLE); / a5 c/ M3 p' t0 N
# L$ @. O1 ]5 Z6 f% e- /* 等待 ADCEN 标志 */8 j' B# }4 }+ s6 J! S' t8 U9 M K
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
: \0 A9 e3 }! T3 v6 ]1 }, `% [' a
4 h4 [% Z; B1 c% O. m) d. n0 P$ g3 ?- /* ADC1 常规软件启动转换 */ 8 }8 t, G/ z* d6 q2 Q) X+ r
- ADC_StartOfConversion(ADC1); l% ^, R/ j7 ]4 J
- 1 e0 w- `8 T3 f
- }
复制代码 " L' U+ u2 E; y, e
3 R4 h% ^$ W+ A( l
|
* @brief Configures the ADC clock (ADCCLK).! l. c, \9 k7 ^/ D
* @note This function is obsolete.
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver
* @param RCC_ADCCLK: defines the ADC clock source. This clock is derived
* from the HSI14 or APB clock (PCLK).* F+ g. b) p4 R# o6 \7 G- s
* This parameter can be one of the following values:1 Y$ K1 d$ u8 L
* @arg RCC_ADCCLK_HSI14: ADC clock = HSI14 (14MHz)
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None
*/
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void), I( C# V$ p6 k; i6 [
{: M8 N0 F& s2 L
ADC_InitTypeDef ADC_InitStructure;
; e) R1 V- Y0 H& |9 D) E/ I
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);# [* I% D6 e5 t4 `) v% J
" p3 A( T" F2 Y" E; t9 H
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
3 m) J9 U1 ?" U2 K0 r
另采集数据全0,还没看那里的问题..
5 J" N& k3 \/ M+ P* c2 D, r
滤波显然会影响速度的吧?# Y( F9 S( p+ [5 z8 G
滤波之后还能有多少bit?
你现在是内基准还是外基准?
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持