这个增益的的意思只是将输入信号放大五倍方便观察输入信号的波形,并实现可以展现出输入信号放大后的波形
时间: 2025-07-22 13:35:58 浏览: 4
<think>我们只需要将输入信号放大五倍,并在串口屏上显示放大后的波形。因此,我们不需要自动增益控制(AGC),只需要固定增益放大。
由于之前已经实现了固定增益模式,现在需要简化代码,专注于放大和波形显示。
主要任务:
1. 使用固定增益(5倍)放大输入信号。
2. 通过ADC采集放大后的信号。
3. 将采集到的波形数据发送到串口屏显示。
注意:我们不需要测量增益、不需要记录测量数据、不需要复杂的命令控制,只需要显示波形。
修改点:
- 移除增益测量数据结构及相关命令。
- 移除卡尔曼滤波(可选,为了简化可以保留,但这里为了专注主要功能,移除)。
- 移除PID处理(因为固定增益,DAC值固定,不需要调整)。
- 简化串口命令,只保留必要的波形显示控制。
- 只显示波形,不需要显示RMS、DC等数据(或者根据需求保留一个波形显示)。
简化后的代码结构:
1. 初始化:硬件初始化,设置DAC固定值(用于控制AD603增益)。
2. 定时采集ADC数据(使用DMA)。
3. 将ADC数据转换为电压值(mV)并下采样到200点。
4. 定时(如10Hz)发送波形数据到串口屏。
代码实现:</think>根据您的要求,我将简化代码,专注于实现输入信号放大五倍并在串口屏上显示放大后的波形。以下是优化后的解决方案:
```c
#include "user\bsp_user.h"
#include <math.h>
// 系统配置
#define SAMPLE_RATE 10000 // 10kHz采样率
#define DISPLAY_POINTS 200 // 串口屏显示点数
#define FIXED_GAIN 5 // 固定增益倍数
// 定时变量
uint32_t waveform_send_Tick = 0;
// 串口变量
char user_text[150]; // 用于构建串口命令
// 全局变量
uint16_t dac_control = 1500; // DAC控制值(需校准)
// ADC变量
#define ADC_SAMPLES 1024 // ADC采样点数
uint16_t adc_arr[ADC_SAMPLES] = {0};
// 波形显示缓冲区
uint16_t waveform_buffer[DISPLAY_POINTS] = {0};
// 硬件初始化
void Hardware_Init(void) {
delay_init(72);
MX_USART2_UART_Init();
MX_TIM3_Init();
MX_DMA_Init(); // DMA初始化
MX_ADC1_Init();
MX_DAC_Init();
// 配置ADC采样率 (10kHz)
TIM3->ARR = (SystemCoreClock / SAMPLE_RATE) - 1;
HAL_TIM_Base_Start(&htim3);
// 启动ADC DMA采样
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_arr, ADC_SAMPLES);
// 设置固定增益DAC值 (5倍增益)
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_control);
// 初始化串口屏显示
HAL_UART_Transmit(&huart2, (uint8_t *)"page 0\xff\xff\xff", 10, 100);
HAL_Delay(100);
HAL_UART_Transmit(&huart2, (uint8_t *)"t0.txt=\"信号放大器\"\xff\xff\xff", 25, 100);
HAL_Delay(100);
HAL_UART_Transmit(&huart2, (uint8_t *)"t1.txt=\"放大倍数:5x\"\xff\xff\xff", 25, 100);
HAL_Delay(100);
}
// 波形数据发送到串口屏
void Send_Waveform_Data(void) {
// 构建波形数据命令
sprintf(user_text, "add 1,0,");
int len = strlen(user_text);
// 添加波形点数据
for (int i = 0; i < DISPLAY_POINTS; i++) {
len += sprintf(user_text + len, "%d", waveform_buffer[i]);
if (i < DISPLAY_POINTS - 1) {
len += sprintf(user_text + len, ",");
}
}
// 添加结束符
strcat(user_text, "\xff\xff\xff");
// 发送数据
HAL_UART_Transmit(&huart2, (uint8_t *)user_text, strlen(user_text), 1000);
}
// 波形显示处理
void waveform_display_proc(void) {
if (uwTick - waveform_send_Tick < 100) return; // 10Hz刷新率
waveform_send_Tick = uwTick;
// 更新波形缓冲区
for (int i = 0; i < DISPLAY_POINTS; i++) {
// 下采样显示 (从ADC_SAMPLES中选取DISPLAY_POINTS个点)
uint16_t idx = (i * ADC_SAMPLES) / DISPLAY_POINTS;
// 转换为电压值 (mV),并应用5倍增益显示
waveform_buffer[i] = (uint16_t)(adc_arr[idx] * 3.3f / 4095.0f * 1000 * FIXED_GAIN);
}
// 发送波形数据到串口屏
Send_Waveform_Data();
}
// ADC数据处理
void Process_ADC_Data(void) {
static uint32_t last_dma_flag = 0;
if (DMA_flag != last_dma_flag) {
last_dma_flag = DMA_flag;
// 重新启动ADC DMA
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)adc_arr, ADC_SAMPLES);
}
}
// 串口数据处理
void rx_proc(void) {
if (rx_pointer > 0) {
// 设置DAC值命令: "DAC 1500"
if (strncmp((char *)rx2_buffer, "DAC", 3) == 0) {
uint16_t new_dac;
sscanf((char *)rx2_buffer + 4, "%hu", &new_dac);
if (new_dac >= 300 && new_dac <= 2100) {
dac_control = new_dac;
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_control);
}
}
rx_pointer = 0;
memset(rx2_buffer, 0, sizeof(rx2_buffer));
}
}
// 主循环处理
void main_loop(void) {
Hardware_Init();
while (1) {
// 系统任务调度
rx_proc();
waveform_display_proc();
Process_ADC_Data();
// 系统延迟
HAL_Delay(1);
}
}
```
### 代码解释:
#### 1. 核心功能简化
```c
// 波形显示处理
void waveform_display_proc(void) {
// ...
for (int i = 0; i < DISPLAY_POINTS; i++) {
uint16_t idx = (i * ADC_SAMPLES) / DISPLAY_POINTS;
waveform_buffer[i] = (uint16_t)(adc_arr[idx] * 3.3f / 4095.0f * 1000 * FIXED_GAIN);
}
// ...
}
```
- **信号放大**:直接在波形处理中应用5倍增益 (`FIXED_GAIN`)
- **下采样**:从1024个采样点中选择200个点显示
- **单位转换**:将ADC值转换为毫伏(mV)
#### 2. 串口屏波形显示
```c
void Send_Waveform_Data(void) {
sprintf(user_text, "add 1,0,");
// 添加波形点数据
for (int i = 0; i < DISPLAY_POINTS; i++) {
// 构建数据点字符串
}
strcat(user_text, "\xff\xff\xff");
HAL_UART_Transmit(&huart2, (uint8_t *)user_text, strlen(user_text), 1000);
}
```
- 使用`add 1,0,<data>`命令向波形控件添加数据
- 每个点之间用逗号分隔
- 以`\xff\xff\xff`结束命令
#### 3. 串口屏初始化
```c
void Hardware_Init(void) {
// ...
HAL_UART_Transmit(&huart2, (uint8_t *)"page 0\xff\xff\xff", 10, 100);
HAL_UART_Transmit(&huart2, (uint8_t *)"t0.txt=\"信号放大器\"\xff\xff\xff", 25, 100);
HAL_UART_Transmit(&huart2, (uint8_t *)"t1.txt=\"放大倍数:5x\"\xff\xff\xff", 25, 100);
}
```
- 切换到页面0
- 设置标题文本为"信号放大器"
- 显示当前放大倍数
#### 4. DAC控制
```c
void rx_proc(void) {
if (strncmp((char *)rx2_buffer, "DAC", 3) == 0) {
// 解析并设置DAC值
HAL_DAC_SetValue(&hdac, DAC_CHANNEL_1, DAC_ALIGN_12B_R, dac_control);
}
}
```
- 保留DAC设置命令用于校准
- 设置AD603的增益控制电压
### 串口屏配置指南:
1. **创建波形显示控件**:
- 添加一个Waveform控件,ID设为1
- 设置背景色为黑色
- 设置波形颜色为绿色
- 设置Y轴范围0-3300(对应0-3.3V * 5倍增益)
2. **添加文本控件**:
- t0:标题文本(ID 0)
- t1:放大倍数显示(ID 1)
3. **串口屏命令参考**:
- 切换页面:`page 0\xff\xff\xff`
- 设置文本:`t0.txt="信号放大器"\xff\xff\xff`
- 添加波形点:`add 1,0,100,200,300,...\xff\xff\xff`
### 使用说明:
1. **硬件连接**:
- 输入信号 → AD603输入端
- AD603输出端 → STM32 ADC输入
- AD603增益控制 → STM32 DAC输出
- STM32 USART2 → 串口屏RX/TX
2. **校准步骤**:
```shell
# 通过串口设置DAC值
DAC 1500 # 初始值
# 输入300mV信号,观察输出应为1.5V
# 调整DAC值直到输出准确为1.5V
DAC 1520 # 示例调整
```
3. **波形显示**:
- 系统自动以10Hz刷新率发送波形数据
- 串口屏实时显示放大5倍后的信号波形
### 示例波形:
假设输入信号为1kHz正弦波(300mVpp):
```
原始输入: ▁▂▃▄▅▆▇█▇▆▅▄▃▂
放大5倍后: ▁▂▃▄▅▆▇████████▇▆▅▄▃▂ (1.5Vpp)
```
### 性能优化:
1. **降低刷新率**:修改`waveform_display_proc()`中的100ms延迟可调整刷新率
2. **增加点数**:修改`DISPLAY_POINTS`可增加显示点数
3. **自动缩放**:添加代码动态调整Y轴范围:
```c
// 计算最大值
uint16_t max_val = 0;
for (int i = 0; i < DISPLAY_POINTS; i++) {
if (waveform_buffer[i] > max_val) max_val = waveform_buffer[i];
}
// 设置Y轴范围 (增加20%余量)
uint16_t y_max = max_val * 1.2;
sprintf(user_text, "y0.max=%d\xff\xff\xff", y_max);
HAL_UART_Transmit(&huart2, (uint8_t *)user_text, strlen(user_text), 50);
```
阅读全文
相关推荐



















