附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下
5 [$ D6 L: G: d2 o! b. y! Q! I! _4 \7 D8 |
- /**
% O* |% D9 x# y0 ?; R: o% S1 \- x; Z6 r( a - * @brief 配置ADC1的工作模式7 b' z* `; j+ t# Y2 U
- * @param 无& w& w# c3 X6 m6 m
- * @retval 无
0 d! }' k. I& Q5 E5 b9 o - */
) u: Q4 _) f$ S1 T9 w4 z" Q; t - static void ADC1_Mode_Init(void)
Z3 _: B' `8 d5 V* v( R' \- a- B - {* X4 `5 J- N5 f6 S9 [
- ADC_InitTypeDef ADC_InitStructure;
2 {' \, k3 G: _( ]0 e - 1 p. S" e& ?& R) A: V# J3 n
- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/3 C0 D: a' W D j# e
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
' q& h+ F/ D9 u( n, p2 s
4 ^* Y; s( X' I; q2 i. l: T- /* ADC1 Periph clock enable */
8 l% x/ E2 `3 |( q+ b& w - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);% _' A n- G: d
/ I8 K. x4 o' F' m& n- /* ADC1 DeInit */
1 ?; J- B6 G$ _ X4 l: u - ADC_DeInit(ADC1);0 x- N9 y$ C2 W) ]3 K. ?$ u% e2 A. W
-
5 I% B' Z u. @: `! u - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/) e; Z! [4 [& ?( d( d
- ADC_StructInit(&ADC_InitStructure);
; f, s- s) i r [; W - 3 w( R+ I$ S4 D/ M+ ^( f
- /*配置ADC分辨率为12位*/9 H1 C1 M. P) w2 |
- ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;; K4 J2 @5 i+ D* [5 L
8 f0 |2 n9 K, Y1 B! [# Q( p4 M- /*开启连续转换*/
1 P2 R' W7 h |, o9 O1 F6 e - ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
/ a) x: R' L5 m" [/ L - 4 Z% w0 P" g/ ?; h8 S1 ^3 ^
- /*禁止触发检测,使用软件触发*/
- v! ?" ^5 d( Z: F- W1 D - ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
$ }& `. y$ J: f% T - 5 | l2 r& }5 j& d- p! c y
- /*ADC采集数据右对齐*/
7 l: U& c# e% |6 Z- C! c% m - ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
) f( z+ N7 t& ~
1 i4 C) h0 `9 U" {' A) j- /*向上扫描*/8 \1 Y* O% b1 F, c- N( B
- ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
( I8 E) a) y9 } t
9 |+ v' r6 w% K! |7 }# m9 V" D- /*ADC初始化*/
j& A; E8 o/ E. C' A6 K$ U; ] - ADC_Init(ADC1, &ADC_InitStructure);
$ S; N/ ?# M3 l -
5 m# c7 Q8 ~$ @/ s- |6 C - /*配置采样通道及时间*/# b! Q( L2 i/ k1 C1 u1 h* E" y
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles);
% T+ g" A' j* W7 h - ; V8 N" I3 ?8 V! P
- /* ADC 校准 */
, I* M, b" r: M1 ]! {! a1 C, `7 g - ADC_GetCalibrationFactor(ADC1);
: i, O5 y$ h! c3 g& I A/ K - ' p. U. w% x W% I, T- T1 X
- /* 循环模式下的 ADC DMA 请求 */
" n7 f& \$ q; W% y, D5 G& { - ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);; b: ^/ ]- V! B j- C
& Z5 A7 l# i' A& w- /* 使能 ADC_DMA */8 {- }6 Z _- G
- ADC_DMACmd(ADC1, ENABLE); / l$ ?* L5 A8 L2 e$ _7 I/ S1 q/ @
- + P( e2 e" ~- K2 b* g
- /* 使能 ADC1 */
- l& F, z! D, P; C" c: M - ADC_Cmd(ADC1, ENABLE); 3 J' I- r" W* }3 l, |
8 @4 X3 E8 H* a8 D+ A- /* 等待 ADCEN 标志 */# z+ a9 M0 e5 X" H
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
5 V( w2 I7 T4 @ - . {% ]. u9 R: o9 e5 t3 w5 K2 H" `% L" Z
- /* ADC1 常规软件启动转换 */ 4 \' v: J# p3 u; d
- ADC_StartOfConversion(ADC1);2 |- \9 Q" w* b! W6 Y
- 3 ] \2 {0 `2 Y' ~- d
- }
复制代码
' t" ]; J: g" }- ?8 Q U7 ~% \$ ^5 E i7 f4 ^1 P
|
* @brief Configures the ADC clock (ADCCLK).7 @; p* Z2 _& b; X: c4 I# u
* @note This function is obsolete., k1 G% j; Y8 y
* For proper ADC clock selection, refer to ADC_ClockModeConfig() in the ADC driver& X/ d3 ~# c {
* @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)
* @arg RCC_ADCCLK_PCLK_Div2: ADC clock = PCLK/2
* @arg RCC_ADCCLK_PCLK_Div4: ADC clock = PCLK/4
* @retval None
*/; Y. @1 L( ~ o2 W+ p3 F4 _
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK)$ A, j9 E' W7 m- q9 E4 Y
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void)0 O+ `, h' S5 f& B; [
{& V+ P& I, o- j1 c0 J5 C4 ]
ADC_InitTypeDef ADC_InitStructure;
( d0 R% K; v+ S# K4 D% r
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);$ d1 x& o& _* ^" r" k
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
* D0 ~* u! d& v/ A2 ^% \1 \/ T
另采集数据全0,还没看那里的问题..; x4 [. @7 j% H x# B3 H/ v5 i' X9 O
; N m' D) Y7 I* R7 {) z( x
滤波显然会影响速度的吧?
滤波之后还能有多少bit?
你现在是内基准还是外基准?
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持