
开源协议
:CC BY-NC-SA 3.0
描述
项目说明
本篇论文介绍了一种基于MCU、DDS和RF检波器的幅频特性测试装置的设计。
该装置采用了STM32F407作为控制核心,AD9833函数发生器和滤波器实现了信号的产生和过滤,AD8361检波器则用于测量幅度响应,示波器和4.3寸屏幕用于显示幅频特性曲线。
经过测试和验证,该装置已经成功地实现了对被测对象的幅频特性曲线的测量。
开源协议
CC-BY-NC-SA 3.0,知识共享许可协议-署名-非商业使用-相同方式共享
CC:知识共享许可协议(英语:Creative Commons license)的缩写
BY:署名,您必须给出适当的署名,提供指向本许可协议的链接,同时标明是否(对原始作品)作了修改。
SA:相同方式共享,如果您 再混合、转换或者基于本作品进行创作,您必须基于与原先许可协议相同的许可协议分享发布您贡献的作品。
NC:非商业使用,您不得将本作品用于商业目的。
更多信息详见:
Creative Commons — Attribution-NonCommercial-ShareAlike 3.0 Unported — CC BY-NC-SA 3.0
软件编写
详细资料见附件
Cube MX配置
System Core
(1)单击“RCC”,配置“HSE”为“Crystal/Ceramic Resonator”。
(2)在“input frequency”处输入“8”。单击“Clock Configuration”,在“HCLK”处输入“168”,并按回车键,有提示点击“OK”即可,稍等片刻。
(3)返回“Pinout & Configuration”,单击“SYS”,将“Debug”改为“JTAG(5Pins)”。
其余采用默认配置,完成后如图4.2、图4.3、图4.4所示。
图4.2 Cube MX配置
图4.3
图4.4 Cube MX配置
Analog
(1)单击“ADC1”,勾选“IN14”与“IN15”。
(2)修改“Clock Prescaler”为“PCLK2 divided by 8”。
(3)修改“Number of Conversion”为“2”。
(4)单击“Rank 1”修改“Channel”为“Channel 14”,“Sampling Time”为“480 Cycles”。
(5)单击“Rank 2”修改“Channel”为“Channel 15”,“Sampling Time”为“480 Cycles”。
(6)单击“NVIC Settings”并勾选“ADC1,ADC2 and ADC3 global interrupts”。
(7)单击“DMA Settings”,单击“Add”,选择“ADC 1 ”。
(8)单击“DAC”,勾选“OUT 1 Configuration”与“OUT 2 Configuration”并将二者的“Trigger”修改为“Timer 6 Trigger Out enevt”。
(9)单击“DMA Settings”,单击“Add”,选择“DAC 1”,“Mode”修改为“Circular”,同理添加DAC 2。
其余采用默认配置,完成后如图4.5、图4.6、图4.7、图4.8、图4.9所示。
图4.5 Cube MX配置
图4.6 Cube MX配置
图4.7 Cube MX配置
图4.8 Cube MX配置
图4.9 Cube MX配置
Timers
(1)选择“Timer 6”,勾选“Activated”。
(2)修改“Counter Period”为“83”。
(3)修改“auto-reload preload”为“Enable”。
(4)修改“Trigger Event Selection”为“Update Event”。
其余采用默认配置,完成后如图4.10所示。
图4.10 Cube MX配置
Connectivity
(1)选择“FSMC”中的“NOR Flash/PSRAM/SRAM/ROM/LCD 1”。
(2)修改“Chip Select”为“NE4”。
(3)修改“Memory type”为“LCD interface”。
(4)修改“LCD Register Select”为“A6”。
(5)修改“Data”为“16bits”。
(6)修改“Extended mode”为“Enable”。
(7)依次修改“NOR/PSRAM timing”的四个参数为“15”、“60”、“0”、“A”。
(8)修改“NOR/PSRAM timing for wait accesses”的四个参数为“9”、“9”、“0”、“A”。
(9)将“USART1”的“Mode”选择为“Asynchronous”。
(10)单击“NVIC Settings”,勾选“USART1 global interrupt”
(11)修改“Data”为“16bits”。
(12)修改“Data”为“16bits”。
其余采用默认配置,完成后如图4.11、图4.12所示。
图4.11 Cube MX配置
图4.12 Cube MX配置
GPIO
本节中的GPIO以引脚排列顺序依次介绍。下面先详细介绍1个GPIO的配置(以1号引脚PE2为例),随后给出表格由读者自行配置。
(1)单击1号引脚“PE2”,我们可以看到有许多可供配置的模式,如图4.13所示。
图4.13 Cube MX配置
(2)选择“GPIO_EXTI2”,该引脚变绿并被自动分配“GPIO_EXTI2”的名称,如图4.14所示。
图4.14 Cube MX配置
(3)我们回到“System Core”-“GPIO”-“GPIO”,单击“PE2”,修改“GPIO mode”为“External Interrupt Mode with Falling edge trigger detection”
(4)修改“User Label”为“KEY2”。
其余采用默认配置,完成后如图4.15所示。
图4.15 Cube MX配置
其他GPIO及PE2的配置如表4.1所示:
表4.1 GPIO配置
Pin Name |
GPIO output level |
GPIO mode |
GPIO Pull-up/Pull-down |
Maximum output speed |
User Label |
PA0 |
n/a |
Rising |
No |
n/a |
KEYUP |
PA11 |
Low |
OOD |
Pull-up |
Very High |
T_SCK |
PA12 |
Low |
OPP |
Pull-up |
Low |
T_CS |
PB12 |
Low |
OPP |
No |
Low |
AD_FSYNC |
PB13 |
Low |
OPP |
No |
Low |
AD_SCLK |
PB15 |
Low |
OPP |
No |
Low |
AD_SDA |
PC9 |
Low |
OPP |
Pull-up |
Very High |
LCD_BL |
PC10 |
n/a |
Input |
No |
n/a |
T_PEN |
PC11 |
n/a |
Analog |
No |
n/a |
T_MISO |
PC12 |
Low |
OOD |
Pull-up |
Very High |
T_MOSI |
PE2 |
n/a |
Falling |
No |
n/a |
KEY2 |
PE3 |
n/a |
Falling |
No |
n/a |
KEY1 |
PE4 |
n/a |
Falling |
No |
n/a |
KEY0 |
*“External Interrupt Mode with Falling edge trigger detection”简记为“Falling”
*“External Interrupt Mode with Rising edge trigger detection”简记为“Rising”
*“Output Open Drain”简记为“OOD”
*“Output Push Pull”简记为“OPP”
*“Input mode”简记为“Input”
*“Analog mode”简记为“Analog”
*“No pull-up and no pull-down”简记为“No”
(5)检查“System Core”中的“NVIC Settings”,请按图4.16配置。
图4.16 Cube MX配置
Project Manager
在“Project Manager”选项中,大多为个性化的内容,以下内容仅供参考。
(1)“Project Name”是工程文件名,这里我们填“STM32F407ZET6”。这里注意,名称中最好不含非数字、字母、下划线内容,以免出程序出错。
(2)“Project Location”是工程存放目录,这里选为“D:\User\time\Desktop\FPTX\”。
(3)“Tool Chain / IDE”是集成开发环境选项,这里选择“MDK-ARM”,“Min Version”选择“V5”。
(4)左侧选择“Code Generator”里选择“Copy all used libraries into the project folder”,再勾选“Generate peripheral initialization as a pair of '.c/.h' files per peripheral”。
其余采用默认配置,完成后如图4.17、图4.18所示。
图4.17 Cube MX配置
图4.18 Cube MX配置
程序代码
初始化程序设计
为了更快开发,我们借鉴了正点原子的程序,由于文本量较大,烦请读者自行至正点原子官网下载STM32F407探索者资料。
(1)在“Drivers”文件夹中新建“BSP”文件夹,并加入“ctiic.c”、“ctiic.h”、“delay.c”、“delay.h”、“gt9xx.c”、“gt9xx.h”、“lcd.c”、“lcd.h”、“lcdfont.h”、“touch.c”、“touch.h”。
(2)在“Drivers”所在文件夹新建“User”文件夹,并加入“AD9833.c”、“AD9833.h”。
1. 4.3寸电容屏初始化代码
在“fsmc.c”文件的“/* USER CODE BEGIN FSMC_Init 2 */”与“/* USER CODE END FSMC_Init 2 */”之间加入如下代码:
HAL_Delay(50);
/* 发送密钥(厂家提供) */
lcd_write_reg(0xF000, 0x0055);
lcd_write_reg(0xF001, 0x00AA);
lcd_write_reg(0xF002, 0x0052);
lcd_write_reg(0xF003, 0x0008);
lcd_write_reg(0xF004, 0x0001);
lcd_wr_regno(0xC500); /* 读取ID低八位 */
lcddev.id = lcd_rd_data(); /* 读回0x80 */
lcddev.id <<= 8;
lcd_wr_regno(0xC501); /* 读取ID高八位 */
lcddev.id |= lcd_rd_data(); /* 读回0x00 */
HAL_Delay(5); /* 等待5ms, 因为0XC501指令对1963来说就是软件复位指令, 等待5ms让1963复位完成再操作 */
lcd_ex_nt35510_reginit(); /* 执行NT35510初始化 */
/* 初始化完成以后,提速 */
ExtTiming.AddressSetupTime = 2;
ExtTiming.DataSetupTime = 2;
FSMC_NORSRAM_Extended_Timing_Init(hsram1.Extended, &ExtTiming, hsram1.Init.NSBank, hsram1.Init.ExtendedMode);
lcd_display_dir(1); /* 默认为竖屏 */
LCD_BL(1); /* 点亮背光 */
lcd_clear(WHITE);
2. USART初始化代码
在“usart.h”的“/* USER CODE BEGIN Includes */”与“/* USER CODE END Includes */”之间加入“#include "stdio.h"”。
在“usart.c”的“/* USER CODE BEGIN 1 */”与“/* USER CODE END 1 */”之间加入如下代码:
#pragma import(__use_no_semihosting)
struct __FILE
{
int handle;
/* Whatever you require here. If the only file you are using is */
/* is required. */
};
int _ttywrch(int ch)
{
ch = ch;
return ch;
}
/* 定义_sys_exit()以避免使用半主机模式 */
void _sys_exit(int x)
{
x = x;
}
char *_sys_command_string(char *cmd, int len)
{
return NULL;
}
/* FILE 在 stdio.h里面定义. */
FILE __stdout;
/* 重定义fputc函数, printf函数最终会通过调用fputc输出字符串到串口 */
int fputc(int ch, FILE *f)
{
while ((USART1->SR & 0X40) == 0); /* 等待上一个字符发送完成 */
USART1->DR = (uint8_t)ch; /* 将要发送的字符 ch 写入到DR寄存器 */
return ch;
}
3. 屏幕UI初始化代码
初始化代码要完成绘制一个基本的幅频特性曲线界面,在本程序中增加了线性坐标和指数坐标两种模式,具体代码如下:
/*
*UI初始化
*/
void ui_init(void)
{
lcd_show_string(80, 8, 640, 32, 32, "Amplitude-Frequency Characteristic Curve", BLUE);
lcd_show_string(8, 48, 32, 32, 32, "dB", BLUE);
lcd_draw_line(48,48,48,432,BLUE);
lcd_show_string(760, 440, 32, 32, 32, "Hz", BLUE);
lcd_draw_line(48,432,784,432,BLUE);
lcd_show_string(16, 96, 24, 16, 16, " 0", BLUE);
lcd_draw_line (43, 96, 47, 96,RED);
lcd_show_string(16, 128, 24, 16, 16, "- 4", BLUE);
lcd_draw_line (43, 128, 47, 128,RED);
lcd_show_string(16, 160, 24, 16, 16, "- 8", BLUE);
lcd_draw_line (43, 160, 47, 160,RED);
lcd_show_string(16, 192, 24, 16, 16, "-12", BLUE);
lcd_draw_line (43, 192, 47, 192,RED);
lcd_show_string(16, 224, 24, 16, 16, "-16", BLUE);
lcd_draw_line (43, 224, 47, 224,RED);
lcd_show_string(16, 264, 24, 16, 16, "-21", BLUE);
lcd_draw_line (43, 264, 47, 264,RED);
lcd_show_string(16, 296, 24, 16, 16, "-25", BLUE);
lcd_draw_line (43, 296, 47, 296,RED);
lcd_show_string(16, 336, 24, 16, 16, "-30", BLUE);
lcd_draw_line (43, 336, 47, 336,RED);
lcd_show_string(16, 368, 24, 16, 16, "-34", BLUE);
lcd_draw_line (43, 368, 47, 368,RED);
lcd_show_string(16, 400, 24, 16, 16, "-38", BLUE);
lcd_draw_line (43, 400, 47, 400,RED);
lcd_show_string(16, 432, 24, 16, 16, "-42", BLUE);
lcd_draw_line (43, 432, 47, 432,RED);
if(linear)
{
/////////////////////////////////////////////////////////////////////////////////
lcd_show_string(48, 448, 16, 16, 16, "1k", BLUE);
lcd_draw_line (48, 432, 48, 436,RED);
lcd_show_string(115, 448, 16, 16, 16, "1M", BLUE);
lcd_draw_line (115, 432, 115, 436,RED);
lcd_show_string(183, 448, 16, 16, 16, "2M", BLUE);
lcd_draw_line (183, 432, 183, 436,RED);
lcd_show_string(250, 448, 16, 16, 16, "3M", BLUE);
lcd_draw_line (250, 432, 250, 436,RED);
lcd_show_string(318, 448, 16, 16, 16, "4M", BLUE);
lcd_draw_line (318, 432, 318, 436,RED);
lcd_show_string(385, 448, 16, 16, 16, "5M", BLUE);
lcd_draw_line (385, 432, 385, 436,RED);
lcd_show_string(453, 448, 16, 16, 16, "6M", BLUE);
lcd_draw_line (453, 432, 453, 436,RED);
lcd_show_string(520, 448, 16, 16, 16, "7M", BLUE);
lcd_draw_line (520, 432, 520, 436,RED);
lcd_show_string(588, 448, 16, 16, 16, "8M", BLUE);
lcd_draw_line (588, 432, 588, 436,RED);
lcd_show_string(655, 448, 16, 16, 16, "9M", BLUE);
lcd_draw_line (655, 432, 655, 436,RED);
lcd_show_string(723, 448, 24, 16, 16, "10M", BLUE);
lcd_draw_line (723, 432, 723, 436,RED);
/////////////////////////////////////////////////////////////////////////////////
lcd_show_string(736, 48, 48, 16, 16, "linear", RED);
}
else
{
/////////////////////////////////////////////////////////////////////////////////
lcd_show_string(48, 448, 16, 16, 16, "1k", BLUE);
lcd_draw_line (48, 432, 48, 436,RED);
lcd_show_string(99, 448, 16, 16, 16, "2k", BLUE);
lcd_draw_line (99, 432, 99, 436,RED);
lcd_show_string(166, 448, 16, 16, 16, "5k", BLUE);
lcd_draw_line (166, 432, 166, 436,RED);
lcd_show_string(217, 448, 24, 16, 16, "10k", BLUE);
lcd_draw_line (217, 432, 217, 436,RED);
lcd_show_string(268, 448, 24, 16, 16, "20k", BLUE);
lcd_draw_line (268, 432, 268, 436,RED);
lcd_show_string(335, 448, 24, 16, 16, "50k", BLUE);
lcd_draw_line (335, 432, 335, 436,RED);
lcd_show_string(386, 448, 32, 16, 16, "100k", BLUE);
lcd_draw_line (386, 432, 386, 436,RED);
lcd_show_string(437, 448, 32, 16, 16, "200k", BLUE);
lcd_draw_line (437, 432, 437, 436,RED);
lcd_show_string(503, 448, 32, 16, 16, "500k", BLUE);
lcd_draw_line (503, 432, 503, 436,RED);
lcd_show_string(554, 448, 16, 16, 16, "1M", BLUE);
lcd_draw_line (554, 432, 554, 436,RED);
lcd_show_string(605, 448, 16, 16, 16, "2M", BLUE);
lcd_draw_line (605, 432, 605, 436,RED);
lcd_show_string(672, 448, 16, 16, 16, "5M", BLUE);
lcd_draw_line (672, 432, 672, 436,RED);
lcd_show_string(723, 448, 24, 16, 16, "10M", BLUE);
lcd_draw_line (723, 432, 723, 436,RED);
/////////////////////////////////////////////////////////////////////////////////
lcd_show_string(736, 48, 48, 16, 16, " index", RED);
}
}
开启FPU功能
(1) 开启FPU可以大大加快浮点数运算速度,在Keil界面中选择“Options for Target…”,在“C/C++”的“Define”栏中加入“,__FPU_PRESENT = 1U, ARM_MATH_CM4, __CC_ARM, __TARGET_FPU_VFP”。
(2) 加入“arm_cortexM4lf_math.lib”文件,目录为“..\Drivers\CMSIS\Lib\ARM”,并加入头文件路径“..\Drivers\CMSIS\DSP\Include”
(3) 在“main.h”加入“#include "arm_math.h"”。
我们随便写一个带有浮点运算的语句并编译,开启Debug模式,若看到开头是“V”的指令(例如:VMOV.F32 s1,#30)则证明成功开启FPU。具体情况如图4.19所示。
图4.19 结果举例
AD9833程序设计
首先,需要了解AD9833芯片的寄存器结构和工作原理。然后,可以参考AD9833的数据手册,编写驱动程序以控制其寄存器来生成所需的波形信号。在C语言中,可以使用SPI协议与芯片进行通信,并使用相应的算法计算出要加载到寄存器中的数值。最后,可以通过调用适当的函数,将这些数值加载到AD9833寄存器中,从而生成特定频率和幅度的波形信号。
具体代码如下:
/************************************************************
* 函 数 名: AD9833_WaveSeting
* 功能说明: SPIsend 16 bit
* 形 参: 1.Freq: 频率值, 0.1 hz - 12Mhz
2.Freq_SFR: 0 或 1
* 返 回 值: 无
*******************************************************/
void AD9833_WaveSeting(double Freq,unsigned int Freq_SFR)
{
int frequence_LSB,frequence_MSB,Phs_data;
double frequence_mid,frequence_DATA;
long int frequence_hex;
/*********计算频率的16进制值***********/
frequence_mid=268435456/25;//适合25M晶振
frequence_DATA=Freq;
frequence_DATA=frequence_DATA/1000000;
frequence_DATA=frequence_DATA*frequence_mid;
frequence_hex=frequence_DATA;
frequence_LSB=frequence_hex;
frequence_LSB=frequence_LSB&0x3fff;
frequence_MSB=frequence_hex>>14;
frequence_MSB=frequence_MSB&0x3fff;
Phs_data=0xC000; //相位值
AD9833_Write(0x0100);
AD9833_Write(0x2100); //选择数据一次写入,B28位和RESET位为1
if(Freq_SFR==0)
{
frequence_LSB=frequence_LSB|0x4000;
frequence_MSB=frequence_MSB|0x4000;
//使用频率寄存器0输出波形
AD9833_Write(frequence_LSB);
AD9833_Write(frequence_MSB);
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2000);
}
if(Freq_SFR==1)
{
frequence_LSB=frequence_LSB|0x8000;
frequence_MSB=frequence_MSB|0x8000;
//使用频率寄存器1输出波形
AD9833_Write(frequence_LSB);
AD9833_Write(frequence_MSB);
AD9833_Write(Phs_data); //设置相位
//AD9833_Write(0x2800);
}
AD9833_Write(0x2000); //输出正弦波形
}
测量幅频特性曲线程序设计
扫频法是一种广泛应用于电路测试的方法,通过逐一发出特定频率的正弦波,测量待测网络对这些频率信号的幅度响应和相位响应,从而绘制出其幅频特性曲线。使用DDS芯片发出的正弦波经过待测网络后,需要进行转换以将其转换为数字信号,常见的转换方式是使用带有模数转换器(ADC)的采样电路。采集到的信号由微控制器单元(MCU)计算处理,最终绘制出幅频特性曲线。在本程序中增加了线性测量和指数测量两种模式,具体程序如下:
/*
*测量幅频特性曲线
*/
void getval_AF_curve(void)
{
uint16_t i = 0;
uint16_t j = 0;
uint16_t k = 0;
for(i=0;i<676;i++)
{
if(linear)
{
AD9833_WaveSeting(1000.0f + ((float)i * 9999000.0f / 675.0f),0);
}
else
{
AD9833_WaveSeting(x_lable[i],0);
}
//HAL_Delay(1);
ADC_av();
ADC_buf_4096_add[0] = 0; //清空缓存
ADC_buf_4096_add[1] = 0; //清空缓存
j = ADC_buf_3V3[0] / 5; //有多少个5mV,因为量化精度5mV
k = ADC_buf_3V3[1] / 5; //有多少个5mV,因为量化精度5mV
ADC_buf_Vpp[0] = (ADC_to_Vpp[j] + ADC_to_Vpp[j + 1]) / 2.0f;
ADC_buf_Vpp[1] = (ADC_to_Vpp[k] + ADC_to_Vpp[k + 1]) / 2.0f;
y_vari[i] = 20.0f * log10f(ADC_buf_Vpp[1] / ADC_buf_Vpp[0]);
//printf("%f\r\n",y_vari[i]);
pro_bar(i);
}
lcd_fill(150, 184, 650, 260, WHITE);
}
/*
*ADC16次取平均
*/
void ADC_av(void)
{
uint8_t i = 0;
for(i=0;i<16;i++)
{
HAL_ADC_Start_DMA(&hadc1, (uint32_t *)ADC_buf_4096, 2);//在DMA中断中累加
delay_us(48);
}
ADC_buf_4096_add[0] = ADC_buf_4096_add[0] / 16;
ADC_buf_4096_add[1] = ADC_buf_4096_add[1] / 16;
ADC_buf_3V3[0] = (float)ADC_buf_4096_add[0] * 3300.0f / 4096.0f;
ADC_buf_3V3[1] = (float)ADC_buf_4096_add[1] * 3300.0f / 4096.0f;
}
/*
*绘制进度条
*/
void pro_bar(uint16_t i)
{
if(i==0)
{
lcd_draw_rectangle(150, 220, 650, 260, BLACK);
lcd_show_string(424, 184, 16, 32, 32, "%", BLACK);
}
lcd_fill(160, 230, (uint16_t)(160 + i * 480 / 675), 250, 0x67A0);
lcd_show_num(376, 184, (uint16_t)(i * 100 / 675), 3, 32, BLACK);
}
绘制幅频特性曲线程序设计
若要在屏幕的676×337像素区域内绘制幅频特性曲线,则需要进行数据处理以适应该显示区域。首先,将从待测网络中测得的分贝数据转化为像素值,使其范围适合于显示区域。接着,需要根据横轴和纵轴的刻度尺度将这些归一化的数值映射到相应的像素坐标上。然后,在相邻两个点之间画直线,以连接各点并呈现出平滑的幅频特性曲线。最终,通过对幅频特性曲线的可视化呈现。详细程序如下:
for(time=723;time>48;time--)//应该是time<47,这里扔掉一个数据
{
lcd_draw_line(time, (uint16_t)(96 + y_vari[time-48] * 8.0f),//336/42
time - 1, (uint16_t)(96 + y_vari[time-49] * 8.0f), RED);
printf("%f,\r\n",y_vari[time-48]);
}
而在示波器上绘制幅频特性曲线则需要用到DAC+DMA+TIM6,由于MCU硬件电路有临时加装的ZMM3V6和SMF5.0A,不能达到3.3V、使用输出缓冲,最低电压不得低于200mV,这里设置为最低256mV,综上选择输出幅度2047,并且需要对数据进行简单的预处理。详细程序如下:
for(time=0;time<676;time++)
{
y_vari_c[time] = 3001 - 61 * (uint16_t)(y_vari[time] + 3);
y_vari_c[1350-time] = 3001 - 61 * (uint16_t)(y_vari[time] + 3);
}
HAL_TIM_Base_Start(&htim6);
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_1,(uint32_t*)x_lable_c,1351,DAC_ALIGN_12B_R);
HAL_DAC_Start(&hdac,DAC_CHANNEL_1);//开启DAC通道
HAL_DAC_Start_DMA(&hdac,DAC_CHANNEL_2,(uint32_t*)y_vari_c,1351,DAC_ALIGN_12B_R);
HAL_DAC_Start(&hdac,DAC_CHANNEL_2);//开启DAC通道
系统性能测试
在进行硬件系统开发的过程中,为确保系统符合设计要求,系统性能测试是至关重要且不可或缺的一步。本章主要展示了该设计所取得的成果。
请参见图5.1、图5.2。
图5.1 展示图
图5.2 展示图
测量幅频特性曲线硬件测试
信号发生部分测试
1.AD9833输出波形测试,如图5.3所示
2.主板ADA4807输出波形测试,如图5.4所示。
图5.3 展示图 图5.4 展示图
绘制测试曲线
1. 677个正弦点位由电脑生成(C语言),用于测试屏幕绘制曲线功能在屏幕上绘制测试曲线,详细情况如图5.5所示。
2. 用DMA+定时器触发绘制测试曲线,6560个正弦点位和6560个三角波点位由电脑生成(C语言),用于测试示波器绘制曲线功能,详细情况如图5.6所示。
图5.5 展示图 图5.6 展示图
硬件系统总体性能测试
绘制幅频特性曲线软件测试
在示波器绘制
采用DMA+DAC+Timer触发绘制幅频特性曲线是一个非常好的选择,这可以提供良好的波形同步,如果用MCU内置的波形发生器,在两波形之间则会发生持续的相移,使幅频特性曲线失真。
由于系统精度问题存在底噪,此问题可由读者进一步提高解决,这里把底噪图片也一并给出。
1.指数坐标,低通滤波器,如图5.8所示。
2.指数坐标,高通滤波器,如图5.9所示。
图5.8 展示图 图5.9 展示图
3.指数坐标,带通滤波器,如图5.10所示。
4.线性坐标,低通滤波器,如图5.11所示。
图5.10 展示图 图5.11 展示图
5.线性坐标,高通滤波器,如图5.12所示。
6.线性坐标,带通滤波器,如图5.13所示。
图5.12 展示图 图5.13 展示图
在屏幕绘制
1.指数坐标,低通滤波器,如图5.14所示。
2.指数坐标,高通滤波器,如图5.15所示。
图5.14 展示图 图5.15 展示图
3.指数坐标,带通滤波器,如图5.16所示。
4.线性坐标,低通滤波器,如图5.17所示。
图5.16 展示图 图5.17 展示图
5.线性坐标,高通滤波器,如图5.18所示。
6.线性坐标,带通滤波器,如图5.19所示。
图5.18 展示图 图5.19 展示图
设计图

BOM


评论