跳到主要内容

3.5.1 数据采集与显示

  1. ADC采集原理

STM32芯片内置的ADC用于将模拟信号转换为数字信号。ADC模块使用3.3V作为参考电压,分辨率为12位,这意味着它可以将0到3.3V的电压范围量化为从0到4095的数字值。

  1. 定时器中断触发ADC采集

为了实现周期性的数据采集,我们利用定时器TIM4的中断功能。每次定时器中断触发时,系统会启动一次ADC采样,并将结果存储在adc_data_raw数组中。该数组可以容纳240个数据点,代表一个完整的数据采集周期。当收集到240个数据点后,设置adc_finish标志为1,表示完成了一次完整的数据采集。

  1. 数据采集流程
  • 定时器TIM4:设置为20kHz的中断频率。
  • ADC采集:每次定时器中断触发时,采集一次模拟信号的值。
  • adc_data_raw数组:存储采集到的原始数据,数组长度为240,表示一次完整的数据采集周期。
  • adc_finish标志:当采集到240个数据点后,设置adc_finish为1,表明一次完整的数据采集已完成。

代码:

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
if (htim->Instance == TIM4)
{
static uint16_t adc_value = 0;
static uint16_t x = 0;

HAL_ADC_Start(&hadc1); // 启动ADC转换
HAL_ADC_PollForConversion(&hadc1, 1000); // 等待ADC转换完成
adc_value = HAL_ADC_GetValue(&hadc1); // 获取ADC转换结果

if (adc_finish == 0) // 如果未完成一次完整的数据采集
{
if (x < 240) // 限制采集点数为240
{
adc_data_raw[x] = adc_value; // 将采集到的值存储到数组
x++;
}
else
{
x = 0; // 重置索引
adc_finish = 1; // 标记采集完成
}
}
}
}
  1. 波形绘制

当adc_finish标志被设置为1时,处理adc_data_raw数组中的数据,将其映射到屏幕坐标上并在LCD屏幕上绘制波形。通过特定公式将ADC值转换为屏幕上的像素位置,确保波形能够正确显示。

代码:

if (adc_finish == 1)
{
for (uint16_t x = 0; x < 240; x++)
{
adc_data[x] = 105 - (adc_data_raw[x] - 2048) / 20; // 将ADC值映射到屏幕坐标,屏幕的垂直范围为10到200像素,通过这个公式将ADC值转换为屏幕上的像素位置。
if (adc_data[x] < 10)
{
adc_data[x] = 10;
}
if (adc_data[x] > 200)
{
adc_data[x] = 200;
}
}
根据处理后的adc_data数组,在LCD屏幕上绘制波形。更新adc_data_数组,用于下一次绘制旧波形。
if (zero_crossing_count < 40)
{
for (uint16_t x = 0; x < 190 - 1; x++)
{
LCD_DrawLine(x + 10, adc_data_[x], x + 10, adc_data_[x + 1], 0); // 绘制旧波形
LCD_DrawLine(x + 10, adc_data[zero_crossing_count + x], x + 10, adc_data[zero_crossing_count + x + 1], WHITE); // 绘制新波形
}
}
else
{
for (uint16_t x = 0; x < 190 - 1; x++)
{
LCD_DrawLine(x + 10, adc_data_[x], x + 10, adc_data_[x + 1], 0); // 绘制旧波形
LCD_DrawLine(x + 10, adc_data[x], x + 10, adc_data[x + 1], WHITE); // 绘制新波形
}
}
}