进阶功能的实现,接下我们通过ADC的采集实现波形采集,我们都知道波形相对来说需要一些密集的采集,在通过这些点来绘制出采集到的波形,为了能够观察比较方便,这里实用串口工具进行查看,我们将ADC采集到的数据通过串口发送出来,然后在串口调试窗口的绘图工具进行查看,那么如何产生波形呢?$ N: A! W! k2 h) V
这里准备用一种原始的方式进行,就是使用arduino去生成一个波形然后连接到开发板的采集口,咱们看一下生成的波形和串口绘制的波形是否一致。
) `9 a+ t" {( \ 下面是我们通过arduino R4生成的DAC的波形:( w6 }- Y: S. q9 n! T
( E. }3 k& P) ]; f# e r& H9 j
* J0 p8 a+ |& |$ Q4 O; Y" t* W 接下来进行一下开发板的配置,这里还需要用到定时器和串口,我们在前面都已经体验了,主要进行一下ADC的配置:
2 e6 Y7 _; @5 A6 C+ S- o
, n7 d: m' W6 J( S! z0 `2 o + M) \3 g% _+ u
前面的外设我们用到了一些引脚,接下来只能用没有变红的通道,这里我们选择了IN4,可以查看对应的引脚是PA4:$ p5 r) e+ `* { Y$ D; v
7 d- i1 Q! X5 b% v8 v0 f6 |4 E; n" y
% t' R& t3 T4 N" c7 m6 u! a0 T 对应的硬件连接是如下:
% U; Q0 |5 o) y; m' ~% P/ q9 E
& _$ s2 U h, G% ~
O- T' S& y% p' O, I* L& U$ R' v 硬件连接如下:9 h. S; O) o, ?
0 S* M' x% K% M3 q) Q
7 L& w! B, {4 u8 w. Z 下面配置ADC参数,支持12位分辨率,不过本次测试选择8位,主要为了串口图形显示方便,肯定是分辨率越高越精细,本次准备用定时1ms打印一个数据,8位也是能够支持的:
( e9 ~( O. z) s% f! P0 Z# L
1 G" d1 O+ x# F+ g; ?4 w- T
+ X! t6 Z( Q ~4 p1 g8 |5 H8 V 采用的是ADC+DMA的方式进行采集,不连续方式,所以整体的处理就在定时器中进行就可以:
! ^) p4 C- @) I+ ?8 H- void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
& _, }# d1 P9 i/ K7 l+ a- A2 P - {- |% C" |- j* K# q$ n# _
- if (htim->Instance == TIM14) {; s; e- r0 d. }, c" G' L
- HAL_IncTick();
% s) q1 }7 i) Y - HAL_ADC_Start_DMA(&hadc1,(uint32_t*)&ADC_data,1);
O" M+ g- ^* c+ y8 p* Z! D* G" `& D - // HAL_UART_Transmit(&huart2, (uint8_t *)&ADC_data, 1, 0xFFFF);- N8 _; }5 J/ H/ _5 I! X4 i
- printf("%d\r\n", ADC_data);6 h x, g0 p% T( h
- $ L& u o! D) w+ G2 y
- }: L- A. d9 |- q* W9 G6 _; t0 q
- }
复制代码 串口数据绘图如下:- P' w6 \ q5 O. P0 F0 E/ J/ m
( s: }' \& V5 I- k' N+ j! T 7 b. m* S% y4 x8 k$ Z# [8 [
可以看到我们生成的波形是1V峰峰值,发送出来的数据是峰值大概是不到80,咱们采用的是8位的采集说以整体数据看着还是可以的。
3 n N1 P% F' S; i/ o
1 o3 f) y6 q! {: F. X1 r: ?. k |8 G) f2 ~" S' Y1 ~
( a2 G+ W+ @9 T7 Y+ z) ^$ G' {7 w
% Q+ C. B% D; V
. G# l# [/ B/ k1 c" }8 j' G' ?: v# q: n/ k# d- s
, N; w4 l+ } r* X% t- ^1 d: ]( w* m- t* v L; J, Z
2 j8 E/ @% ^% e0 @2 N+ [! F* X4 b; ]" g
|