作者是一位不懂模数电学生,麻烦不用较劲,以下节选为报告内容,具体可以用网盘下载,并且qq咨询,这个是在学习stm32过程中第一个搭积木搭建而成的一个小小项目,主要乐于分享,热爱和高手们讨论。
- PWM+ADC+DMA搭配使用:
PWM:通过编程控制定时器内部时基单元输出宽度可调制的脉冲,可以选择脉冲宽度(基于多少个时钟周期),其定时器通道引脚需要查找定义
DMA:DMA用来提供在外设和存储器之间或者存储器和存储器之间的高速数据传输。无须CPU干预,数据可以通过DMA快速地移动,这就节省了CPU的资源来做其他操作。每个通道专门用来管理来自于一个或多个外设对存储器访问的请求。还有一个仲裁器(通过配置结构体参数)来协调各个DMA请求的优先权。 在此工作原理中,ADC采样完成结束后,可以形成一个采样完成标志位,产生DMA请求(所以ADC与DMA是同步运行的)
ADC:12位ADC是一种逐次逼近型模拟数字转换器。A/D转换可以单次、连续、扫描或间断模式执行。ADC的结果可以左对齐或右对齐方式存储在数据寄存器DR中,且ADC获取模拟信号转换为数字信号为0~4095;
2、TIM3输入捕获:输入捕获模式下,当通道引脚出现电平变化的时候(类似于外部中断,向CPU发送信号申请,控制相应电路),会让CNT计数值锁存到CCR寄存器中。可用于测量波形的频率,占空比。TIM_PWMIConfig函数可以快捷的把电路配置成PWMI模式的标准结构,
3、FFT算法(官方提供的dsp库):通过将ADC采样得来的数据进行左移16位,作为输入数组inbuf有1024个数据,经过fft变换,所出来的数组outbuf为512。是因为当信号通过采样过程从模拟域转换到数字域时,根据奈奎斯特采样定理,采样频率必须至少是信号最高频率的两倍,以避免混叠现象。这个要求确保了采样后的信号能够无歧义地代表原始信号。而且FFT得到的频谱是对称的,并且以采样频率的一半为中心,所以我的采样频率必须是外来信号频率的2倍以上才能保证数据精确。
4、TFT屏幕绘制波形逻辑:通过一次DMA中断,在中断函数里面,通过getpowermag函数(放在同一个for循环下面,以减少运算时间),在512个数组里面进行波形绘制并且反复比较大小,以获得电压最大值和最小值,之后再进行LCD_Shownum处理显示。
采用方案:
- 使用TIM-PWM+ADC+DMA循环模式可调采样频率进行采样,并且通过处理运算测出电压峰峰值、最大值、最小值。
- 利用输入捕获,获得低频率的频率以及测量占空比。
- 使用EXIT开启按键中断控制key_1控制降低采样频率,key_0控制升高采样频率,采样频率OSR范围781.25hz~1600Khz,且是2倍增长调控,key_up控制暂停,外部按键控制自动生成好看波形。
- 使用FFT算法将时域信号转化为频域信号,再利用求模值获取最大的频率所在1024 个数组的下标为多少.
在Free模式下,根据获取频率信息得到的采集频率值大约是3倍的外部输入频率
在Aoto模式下,我设置好看波形,调整Pre的值
舍弃方案:
与采用方案区别在于测频率方案不同
将测高低频率分开,使用ETR外部触发定时器时基单元。实际效果频繁进入DMA中断,开启四个定时器(TIM2:PWM,TIM4:ETR计数,TIM5:开启中断定时取用TIM4定时器cnt值,TIM3进行输入捕获测低频。)
未采用原因:1、定时器使用资源过多,被DMA占用时间过长,失能定时器误差过大,学 习能力不足,调配各个外设合理利用的能力不够。
- 定时器的计数器CNT取值不能大于65535,若使CNT大于65535,则
开起TIM4定时器中断加1*65535,又需要开启一个中断配置。
链接:https://pan.baidu.com/s/1irU51yWirk9tLYbxiBYniA
提取码:zcx6