泰安网站开发推广,关于阅读类网站的建设规划书,网上如何做网站,建筑行业培训一、前言 由于需要对ADC采样性能的评估#xff0c;重点在于对原波形的拟合性能。 考虑到数据的直观性#xff0c;本来计划采集后使用串口导出#xff0c;并用图形做数据拟合#xff0c;但是这样做的效率低下#xff0c;不符合实时观察的需要#xff0c;于是将开发板的屏幕…一、前言 由于需要对ADC采样性能的评估重点在于对原波形的拟合性能。 考虑到数据的直观性本来计划采集后使用串口导出并用图形做数据拟合但是这样做的效率低下不符合实时观察的需要于是将开发板的屏幕用作波形模拟展示虽然精度有所丢失但是波形没有太大变形有一定参考价值。 目前开发板的版本是V3.4主控STM32L496VET6。选择该主控的原因是adc部分的时钟是独立且可以调整的F1和F4系列的时钟频率相对较低最高36Mhz。 L496可以到80Mhz最大精度下采样率能够达到5.33Mhz可以很大程度提高实验要求的实时性。 二、设计思路 设计的关键在于ADC的采集方式和LCD的显示方式。
1、ADC配置 在官方例程的框架基础上做了一些修改 例程用的2倍分频所以ADC时钟为40MHz我改为了1分频达到80MHz。其他根据自己需要修改。 通道配置部分例程是放在了测量的时候配置由于实时采集需要高频调用于是我把这部分放到了初始化中只保留了必须的部分 例程为了可以实现任意通道的采样所以在测量时才配置对应通道。但是要注意初始化函数只对一个引脚做了配置如果要测量其他通道还需要自行配置其他引脚。 时钟源可以参考CubeMX生成的代码有多种组合方式这里我采用最简单的挂在系统时钟上 2、定时器配置 定时器就是正常配置为计数开启溢出中断没有使用其他功能。 这部分没有采用定时器内置的触发ADC检测我使用更为简单的标志位这样便于调试和查错 count是测量计数tim_flag是定时器溢出标志用于主函数启动ADC采样。 3、led显示配置
这部分参考另一位博主的设计思路在屏幕上建立坐标系建立网格线 所有用于显示的函数都是使用官方的LCD驱动代码要做的就是调整显示区域和颜色。 4、波形绘制 最重要的就是波形模拟这部分的主要思路是采集230次为一组就是要显示的像素宽度将每一次采集的数据保存然后暂停定时器处理数据将模拟量转为电压值找到最大最小值刷新到屏幕每两个相邻点之间连线最后将计数值清零开启定时器。 描述的比较硬核看代码就明白了
if(count LCD_Width - 10)//如果显示的个数达到要求
{HAL_TIM_Base_Stop_IT(TIM3_Handler);//定时器暂时关闭先处理数据Display_Voltage_Net(); max D_arr[0] * 3300 / 4096;min D_arr[0] * 3300 / 4096;for(count 0; count LCD_Width - 10; count)//进行最大值和最小值等处理{D_arr[count] D_arr[count] * 3300 / 4096;//模拟量换成数字量电压1mV为量度 if(D_arr[count] max){max D_arr[count];}if(D_arr[count] min){min D_arr[count];}}//最大值和最小值显示POINT_COLOR BLACK;//设置画笔为黑色LCD_ShowString(0, 15, 20, 12, 12, max);LCD_ShowNum(0, 27, max, 4, 12);LCD_ShowString(0, LCD_Height - 30 - 12, 20, 12, 12, min);LCD_ShowNum(0, LCD_Height - 30, min, 4, 12);//显示处理for(count 0; count LCD_Width - 10; count){D_arr[count] D_arr[count] / 3300 * (LCD_Height - 20);//显示范围}//数据显示在LCD上for(count 10; count LCD_Width - 11; count){//LCD_DrawLine(count 10, LCD_Height - 10 - D_arr[count], count 11, LCD_Height - 10 - D_arr[count 1]);LCD_DrawLine(count, LCD_Height - 10 - D_arr[count], count 1, LCD_Height - 10 - D_arr[count 1]);}count 0;//重新进行数据获取delay_ms(1000);HAL_TIM_Base_Start_IT(TIM3_Handler);//定时器重新启动
} 三、实验结果 根据本次实验的设计方式实测定时器最快只能设置10微妙定时更小的话会采样乱码目前还没找到原因。
TIM3_Init(10 - 1, 80 - 1);//定时器3初始化 10us 自动装载值为10预分频80。也就是屏幕每一帧显示范围10us * 220 2.2毫秒周期在该范围内的都能正常显示一帧在频率为10khz时波形较密集应该是能看清的最高频率。 读者可根据需要调整定时器的配置低于10khz的方波都可以较清晰的模拟出来。
源码已上传至Gitee
stm32: 一些stm32模块使用经验记录 - Gitee.comhttps://gitee.com/lrf1125962926/stm32/tree/Waveform_simulation/