一、任务
设计并制作一个波形采集、存储与回放系统,示意图如图 1 所示。该系统能同时采集两路周期信号波形,要求系统断电恢复后,能连续回放已采集的信号,显示在示波器上。
二、要求
1.基本要求
(1)能完成对 A 通道单极性信号(高电平约 4V、低电平接近 0V)、频率约 1kHz 信号的采集、存储与连续回放。要求系统输入阻抗不小于 10 kΩ,输出阻抗不大于 1kΩ。
(2)采集、回放时能测量并显示信号的高电平、低电平和信号的周期。原信号与回放信号电平之差的绝对值≤50 mV,周期之差的绝对值≤5%。
(3)系统功耗≤50mW,尽量降低系统功耗,系统内不允许使用电池。
2. 发挥部分
(1)增加 B 通道对双极性、电压峰峰值为 100mV、频率为 10Hz~10kHz 信号的采集。可同时采集、存储与连续回放 A、B 两路信号,并分别测量和显示 A、B 两路信号的周期。B 通道原信号与回放信号幅度峰峰值之差的绝对值≤10 mV,周期之差的绝对值≤5%。
(2)A、B 两路信号的周期不相同时,以两信号最小公倍周期连续回放信号。
(3)可以存储两次采集的信号,回放时用按键或开关选择显示指定的信号波形。
(4)其他。
三、说明
1.本系统处理的正弦波信号频率范围限定在 10Hz~10kHz,三角波信号频率范围限定在10Hz ~2kHz,方波信号频率范围限定在10Hz~1kHz。
2.预留电源电流的测试点。
3.采集与回放时采用示波器监视。
4.采集、回放时显示的周期和幅度应是信号的实际测量值,规定采用十进制数字显示,周期以“ms”为单位,幅度以“mV”为单位。
GPT-4o给出的设计方案:
设计一个采集、存储与回放系统,该系统能够同时采集两路1kHz的周期性信号波形,并在回放时保持信号的高电平、低电平、及信号周期。该系统包括以下模块:
该系统首先通过输入电路对来自两条通道的信号进行调理,以匹配A/D转换器的输入要求。A/D转换器将这些模拟信号数字化并将其传送到存储单元进行存储。在需要回放时,存储单元将信号传送给D/A转换器,再将其转换回模拟信号并通过输出电路输出。
输入电路:
A/D转换器:
存储与控制装置:
D/A转换器:
输出电路:
运算放大器(如OPA2211):
ADC(如ADS1256):
MCU(如STM32F407):
DAC(如DAC8568):
六、主要功能实现相关代码
主函数及框架
int main(void) {
HAL_Init();
SystemClock_Config();
ADC_Init();
DAC_Init();
DMA_Init();
Start_ADC();
Start_DAC();
while (1) {
HAL_Delay(100);
}
}
void ADC_Init(void) {
__HAL_RCC_ADC1_CLK_ENABLE();
ADC_ChannelConfTypeDef sConfig = {0};
hadc1.Instance = ADC1;
hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV2;
hadc1.Init.Resolution = ADC_RESOLUTION_12B;
hadc1.Init.ScanConvMode = DISABLE;
hadc1.Init.ContinuousConvMode = DISABLE;
hadc1.Init.DiscontinuousConvMode = DISABLE;
hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_NONE;
hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;
hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
hadc1.Init.NbrOfConversion = 1;
hadc1.Init.DMAContinuousRequests = ENABLE;
hadc1.Init.EOCSelection = ADC_EOC_SINGLE_CONV;
if (HAL_ADC_Init(&hadc1) != HAL_OK) {
Error_Handler();
}
sConfig.Channel = ADC_CHANNEL_0;
sConfig.Rank = 1;
sConfig.SamplingTime = ADC_SAMPLETIME_3CYCLES;
if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {
Error_Handler();
}
}
void DAC_Init(void) {
__HAL_RCC_DAC_CLK_ENABLE();
DAC_ChannelConfTypeDef sConfig = {0};
hdac.Instance = DAC;
if (HAL_DAC_Init(&hdac) != HAL_OK) {
Error_Handler();
}
sConfig.DAC_Trigger = DAC_TRIGGER_NONE;
sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;
if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK) {
Error_Handler();
}
}
void Start_ADC(void) {
if (HAL_ADC_Start_DMA(&hadc1, (uint32_t*)adcBuffer, 1024) != HAL_OK) {
Error_Handler();
}
}
void Start_DAC(void) {
if (HAL_DAC_Start_DMA(&hdac, DAC_CHANNEL_1, (uint32_t*)adcBuffer, 1024, DAC_ALIGN_12B_R) != HAL_OK) {
Error_Handler();
}
}
void Error_Handler(void) {
while (1) {
// 产生错误时进入死循环,用户可添加相应的错误处理代码
}
}
本题考察的主要知识点: