1设计需求
通过stm32f103c8t6实现一个简易示波器功能,该示波器可以检测0-3.6khz频率范围内的波形。
也可以输出波形,输出方波、三角波、正弦波。
2技术方案
通过stm32的ADC功能,采集输入信号,最后由oled屏进行显示。
采样频率通过定时器控制,定时器触发ADC采样,然后通过DMA搬运数据,从而达到最大效率。
通过测试,ADC功能正常,可以采集波形,但是DAC输出波形异常,无法输出波形,查阅资料,发现stm32f103c8t6是小容量的单片机,没有DAC功能,所以无法直接通过dac配置输出。
3代码实现
直接看demo
https://download.csdn.net/download/weixin_51248645/88707820
4stm32f103zet6示波器
没有DAC的示波器叫什么示波器,换平台,采用stm32f103zet6进行配置。
参数:
ADC输入:
单路输入,采样频段:847Khz.(72000/85/1=847K) 到1000HZ (pre=500)
输入电压:-15V ~ +15V.
DAC输出电压: 0 ~ 3.3V.
4.1ADC配置
ADC最大频率计算:
由于stm32f103外部时钟频率最大为14M,所以配置定时器触发时,也不能超出这个值。
ADC最大频率:ADCCLK=14MHz,采样时间=1.5周期。
则:TCONV = 1.5 + 12.5 = 14 周期 = 1μs,采样频率为1Mhz。
1Mhz ?真的是极限吗?
当然不是,有两个方法提升。
1.正规方法:采用4通道ADC,分别在1/4周期进行采样,通过拼接的方式,实现1*4=4M频率的采样。
2.瞎整方法:外部时钟频率最大14M,这不能突破吗?
这次先弄个1M的进行测试。
ADC采用6分频,12M的时钟。采样时间=1.5周期。频率为0.86Mhz。
通过定时器配置,系统时钟是72M,定时器触发时间应大于1/0.86Mhz,则
TIM2_PWM_Init(T-1,pre-1);
T*pre/72M>1/0.86M 取pre=1,得T>83.7。
取T=84,PWM的Pulse取12。
4.2DAC配置
这个和STM32F103C8T6一样。
5功能调试
5.1ADC采集功能
将DAC输出的正弦波接到ADC采集端口,检测采样值,采样正常。如下图。
5.2频率和伏值测量
通过FFT,算出频率,电压直接算出。
FFT原理是将时域数据转换到频域,然后去检测幅度,借用别人一个128个采样点的统计图,如下图,可以看出其实就是对频率递增175,然后统计幅度,找出最大的既是频率值,其他则是杂波。
点数 频率 幅值 实部 虚部
0 0 4 0 -4
1 175 14 -6 -4
2 350 1500 -380 647
3 525 11 -5 -3
4 700 10 -4 -3
5 875 8 -4 -2
6 1050 8 -4 -1
7 1225 6 -3 0
8 1400 8 -3 -3
9 1575 8 -4 -1
10 1750 8 -4 -1
11 1925 8 -4 0
12 2100 5 -2 -2
13 2275 6 -3 -1
14 2450 8 -3 -3
15 2625 7 -3 -2
16 2800 5 -2 -2
17 2975 6 -3 -1
18 3150 6 -3 0
19 3325 6 -3 0
20 3500 6 -3 -1
21 3675 6 -3 0
22 3850 6 -3 0
23 4025 2 -1 0
24 4200 6 -3 -1
25 4375 6 -3 0
26 4550 4 -2 0
27 4725 4 -2 0
28 4900 2 -1 -1
29 5075 4 -2 0
30 5250 2 -1 0
31 5425 4 -2 0
32 5600 2 -1 0
33 5775 6 -3 -1
34 5950 6 -3 0
35 6125 6 -3 -1
36 6300 4 -2 -1
37 6475 6 -3 0
38 6650 4 -2 0
39 6825 6 -3 0
40 7000 5 -2 -2
41 7175 6 -3 0
42 7350 2 0 -1
43 7525 6 -3 0
44 7700 2 -1 -1
45 7875 4 -2 0
46 8050 6 -3 -1
47 8225 2 -1 0
48 8400 2704 -676 -1171
49 8575 4 -2 0
50 8750 2 -1 0
51 8925 4 -2 -1
52 9100 2 -1 -1
53 9275 4 -2 0
54 9450 2 -1 0
55 9625 2 -1 -1
56 9800 2 -1 -1
57 9975 4 -2 0
58 10150 2 0 -1
59 10325 4 -2 0
60 10500 2 -1 -1
61 10675 2 -1 -1
62 10850 4 -2 -1
63 11025 2 -1 -1
64 11200 0 0 0
65 11375 2 -1 0
66 11550 4 -2 0
67 11725 2 0 -1
68 11900 2 -1 -1
69 12075 2 -1 1
70 12250 2 -1 1
71 12425 4 -2 1
72 12600 4 -2 -1
73 12775 2 -1 1
74 12950 2 -1 -1
75 13125 4 -2 1
76 13300 2 -1 -1
77 13475 4 -2 1
78 13650 2 -1 -1
79 13825 4 -2 0
80 14000 2 -1 0
81 14175 4 -2 0
82 14350 4 -2 1
83 14525 4 -2 1
84 14700 2 -1 0
85 14875 2 -1 1
86 15050 4 -2 0
87 15225 4 -2 0
88 15400 2 -1 -1
89 15575 4 -2 1
90 15750 2 -1 1
91 15925 2 -1 1
92 16100 0 0 0
93 16275 4 -2 1
94 16450 2 -1 1
95 16625 4 -2 1
96 16800 2 -1 0
97 16975 4 -2 0
98 17150 4 -2 1
99 17325 4 -2 0
100 17500 2 -1 0
101 17675 4 -2 0
102 17850 2 -1 0
103 18025 4 -2 0
104 18200 4 -2 -1
105 18375 4 -2 1
106 18550 2 -1 -1
107 18725 3996 1998 1
108 18900 2 -1 0
109 19075 2 -1 1
110 19250 4 -2 0
111 19425 4 -2 1
112 19600 2 -1 0
113 19775 2 -1 1
114 19950 2 -1 1
115 20125 4 -2 1
116 20300 0 0 0
117 20475 4 -2 1
118 20650 2 -1 1
119 20825 2 0 1
120 21000 2 -1 0
121 21175 2 -1 1
122 21350 2 -1 0
123 21525 4 -1 2
124 21700 2 -1 0
125 21875 2 0 1
126 22050 2 -1 0
127 22225 2 0 1
由以上的实验数据,我们可以看出,在频率为350Hz,8400Hz和18725Hz时,幅值出现峰值,分别为1500、2696和3996,这与我们所预期的结果正好相符,从而验证了实验结果的正确性。
5.3按键功能
共4个按键,暂停键,测试正常。采样频率+和减少,测试正常。autoset按键,按下时,会自动将寻找波形,在屏幕上显示出来。
auto原理是,在屏幕上显示4个周期的图像,这样就可以很清除观察。然后计算pre值。
pre=72000000/450/(F*T)*4;
测试效果也还是很理想。
还有一个旋转电阻,用来微调pre。
5.4拓展功能
1双通道(tim3 端口触发ADC失败,卡死在init中,还未找到原因)
2测量AC220v DC 310V
采用将-400~+400V降压到15V内,选用31:1。通过一个滑动开关控制。电路如下: