附件为STM32F0系列ADC的多通道采集,DMA中断方式,注释非常详细,分享给大家,部分代码如下) ^' o" a u( g
2 _+ n! N7 `. y% z( `- /**
/ V( k' C! K; G' \ - * @brief 配置ADC1的工作模式
# ~* ]) j N* H - * @param 无% _6 H- n. z# e2 G a- F3 ]3 G+ w
- * @retval 无
) y! Z# ?: t- O7 k" g - */
0 s* k* s" D0 {- \8 ^: p+ C7 S7 M - static void ADC1_Mode_Init(void)
( O# R+ p1 n9 v' J - {; [; d+ r2 ]" \3 ~2 b
- ADC_InitTypeDef ADC_InitStructure;
M( A" p3 g: q4 @- n
% `; }2 E- J& ^- /*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/! l% ~3 x4 ?- N. R2 N# e9 d
- RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4); 2 s1 z5 l A6 s% d3 `6 w
- G4 P/ x: v- @4 b' d- /* ADC1 Periph clock enable */
9 e4 w1 B* X: e' L* ^$ j - RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);0 V2 p1 \# ?" [# e
- ; p O" P4 r, x/ p A
- /* ADC1 DeInit */ % }- I2 m, Q, r9 ?; V8 D- _
- ADC_DeInit(ADC1);/ c! o- ?, y2 `2 \. f7 ~, \
-
* z( S) F3 P' p0 H' j: T* ^) V - /*初始化ADC结构体,此句必须加,不加的话多路ADC数据会交换*/) I9 Y$ f" X% t9 A
- ADC_StructInit(&ADC_InitStructure);
; d' O" s; \1 V( |0 M. @9 y/ |5 R
0 i4 j* c. U7 t- /*配置ADC分辨率为12位*/
) G6 W0 C6 `) Y1 O8 N - ADC_InitStructure.ADC_Resolution = ADC_Resolution_12b;% s' y) o( l& f
2 d' k9 t3 k/ Z# V) n1 m- /*开启连续转换*/, I9 x2 o, U. B# z/ U+ n
- ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
5 R5 g U% h. ^ o% X% {# S
0 `7 ^( e4 ~* r! W: X, w1 i- /*禁止触发检测,使用软件触发*/7 U% c0 j) l- m5 X* _
- ADC_InitStructure.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;* b0 ]& `) X! T% K# }9 V% m! i2 s
- ) r" m6 O! U. o: R- K& {* r/ [" G
- /*ADC采集数据右对齐*/4 ~3 {- F: m0 P2 k
- ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;% p7 F: N5 C* f9 Z2 z5 q
- % C' i) I2 ?8 Q0 t% Y; M4 p
- /*向上扫描*/
4 }# @0 m0 Q f4 k! d5 d - ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;. Q* U& u. S& w' A
- 0 G+ ^5 k9 m0 _( _' ~* d
- /*ADC初始化*/: a v1 }7 m5 u4 U" B) E
- ADC_Init(ADC1, &ADC_InitStructure); 3 D" e- D- N& Z
-
& `! b6 K& f' L - /*配置采样通道及时间*/+ f( Y8 h5 F$ r2 Q1 p5 {" E
- ADC_ChannelConfig(ADC1, ADC_Channel_0 | ADC_Channel_1, ADC_SampleTime_239_5Cycles); y% Q; Z: J5 b" \! X2 W2 o1 Y
0 ~0 A' l) r, @! j+ o# F) K) X8 l7 k6 ]- /* ADC 校准 */" A. J* B7 B6 e
- ADC_GetCalibrationFactor(ADC1);0 ]; E' N& Y1 t
- ~3 t' Q3 k& V0 C% {+ k" K/ J$ ^- /* 循环模式下的 ADC DMA 请求 */
8 q* O/ d9 W: |* z' P7 | - ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
! C$ I: p+ K# y5 Z( p' U7 v9 }+ c! h8 p
c) [5 f$ m0 F: `3 k& b" o7 A' K- D5 c- /* 使能 ADC_DMA */
: X0 Z, I! s" V# h0 t$ y - ADC_DMACmd(ADC1, ENABLE);
/ R+ N& u) l4 ^3 r - " m* m7 i- N& o6 v/ F/ O
- /* 使能 ADC1 */
; C y6 t+ e; @" X; C - ADC_Cmd(ADC1, ENABLE); 8 I$ {4 I0 k( T- }7 r* {3 Z
: l' A, l) n/ a) ]" H3 P' A- /* 等待 ADCEN 标志 */5 _' H6 `; h+ U h
- while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));
& B7 u( L+ X; Y& f6 v! L$ e3 |
8 k9 z# a) `& x& z! n" t" l: g- /* ADC1 常规软件启动转换 */
0 T7 F9 d+ c$ j - ADC_StartOfConversion(ADC1);- U+ g; S9 H! V& t( B% a1 b) u
- 0 A3 k8 ~* K2 v8 F5 g6 B ]/ m
- }
复制代码 . J4 O" p- q+ b/ g2 Z
) d- D+ f/ e* m# n; `( c, T |
* @brief Configures the ADC clock (ADCCLK).. k, ]3 |4 ?9 F
* @note This function is obsolete./ ^5 \8 H# _; _! B/ z
* 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 0 _* c- _3 @, c" P
* 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 8 R4 J( ` Q' n) R. N
* @retval None2 r8 {. r# u. N* P" _% A6 Q
*/" w( B2 p/ h; ? ?+ }
void RCC_ADCCLKConfig(uint32_t RCC_ADCCLK). `% D% n/ F6 K' I* t0 ^( ]* `# t
此函数已废弃,正确ADC时钟选择,请用函数ADC_ClockModeConfig()
void ADC1_Mode_Init(void). R7 s/ r9 [- a) C1 {% O" _; l6 `
{
ADC_InitTypeDef ADC_InitStructure;
/*设置ADC分频因子为4 ,ADC最大时间不能超过14M*/
RCC_ADCCLKConfig(RCC_HCLK_Div4);5 G2 t4 z9 d: \1 g" Q$ D
RCC_ADCCLKConfig(RCC_ADCCLK_PCLK_Div4);$ y- i8 v, R& D1 p% ~0 e& l
源码为红字,正确的应该为蓝字,当然影响不大,但起码会影响串口速率.
另采集数据全0,还没看那里的问题..
滤波显然会影响速度的吧?
滤波之后还能有多少bit?# n. o4 e+ c/ u. Z- ~6 H: c
你现在是内基准还是外基准?, K% Y4 _% j5 H! H) M# T( ?7 ~
内部adc毕竟还是和外部adc有差距,一个单adc芯片都能顶上还几个stm32了 呵呵。
能帮到你就好
能给你提供有用信息就行
我用串口打印了,我用的是dma中断,在主循环检测dma中断是否完成
多谢版主支持