
2021年A题-信号失真度测量装置(国二)
简介
该装置基于 TI 的 Tiva C 系列微处理器 TM4C123 实现,能够测量 1kHz ∼ 100kHz、5mV ∼4V 的信号失真度和谐波分量并·在手机界面上显示·。
简介:该装置基于 TI 的 Tiva C 系列微处理器 TM4C123 实现,能够测量 1kHz ∼ 100kHz、5mV ∼4V 的信号失真度和谐波分量并·在手机界面上显示·。开源协议
:GPL 3.0
描述
目录
1.前言
2.团队介绍
3.题目要求
4.题目分析
5.原理图设计说明
6.PCB设计说明
7.软件说明
8.实物展示说明
9.注意事项
10.测试结果
1.前言
本作品是2021年全国电子设计大赛A题的参赛作品,完成度较好,最终获得陕西省赛区一等奖,全国二等奖。
2.团队介绍
本团队是由西安交通大学电气工程学院的三名同学组成的,其中作者本人是负责模拟电路设计和制作,团队中的周伟同学负责数字程序的编写。安卓APP是使用App inventor平台编写。
3.题目要求
设计制作信号失真度测量装置,对来自函数/任意波形发生器的周期信号(以下简称为输入信号)进行采集分析,测得输入信号的总谐波失真 THD(以下简称为失
真度),并可在手机上显示测量信息。
1.基本要求:
(1)输入信号的峰峰值电压范围:300mV~600mV;
(2)输入信号基频:1kHz;
(3)输入信号失真度范围:5% ~ 50%;
(4)要求输入信号失真度测量误差绝对值小于5%;
(5)显示失真度测量值THD;
(6)失真度测量与显示用时不超过 10 秒。
2.发挥部分:
(1)输入信号的峰峰值电压范围:30mV ~ 600mV;
(2)输入信号基频范围:1kHz ~100kHz;
(3)测量并显示输入信号失真度THD值,要求误差 ≤3%;
(4)测量并显示输入信号的一个周期波形;
(5)显示输入信号基波与谐波的归一化幅值,只显示到 5 次谐波;
(6)在手机上显示测量装置测得并显示的输入信号THD值、一个周期波形、基波与谐波的归一化幅值。
4.题目分析
按照题目所述,设计时应该按照信号采集到数字处理,最后显示结果的流程来。
所以设计应该包含三个部分:
(1)信号调理及其他必要的模拟电路;
(2)控制器的数字控制方案;
(3)蓝牙以及蓝牙app。
对模拟电路设计进行分析:
信号失真度计算需要波形和信号频率两种数据。因而模拟电路应该包含信号调理电路和整形电路两个部分。
其中信号调理电路的作用是把题目要求的30-600mV双极性信号变换为片内ADC能接受的电压信号(0-3.3V)。可以采用固定增益放大器+直流偏置的方案,结构简单,不耗时间,但缺点是小信号输入时ADC采样的误差大,测量精度有限且测量幅度范围难以提升。所以我们采用了AGC(自动增益控制放大器)+直流偏置的方案,可以把输入信号以恒定幅度大小输出,测量信号幅度范围大大提升,但缺点是制作耗时长且调试复杂。
整形电路的作用则是得到与输入信号基波频率相同的方波。
对数字处理方案进行分析:
前级模拟电路提供了基波同频方波,单片机就可以使用定时器的输入捕获测量其输入基波频率。之后根据基波频率确定采样率,使用片内ADC采样波形信号。最后得到周期电压数据后使用FFT计算谐波分量和THD。
有一点值得注意,受到片内ADC采样率(TI的处理器大部分在1M左右)的限制,直接采样得到的100KHz波形信号和实际波形差距较大,所以直接采样的方案是不可取的。所以我们组的方案是使用欠采样,即在多个周期内顺延采取一个周期的数据,比如一个周期需采集1024个点,在第一个周期采样第一个点,第二个周期采样第二个点.....
对蓝牙显示方案进行分析:
题目对此部分的要求不高,能使用蓝牙发送数据到手机并显示就可以。所以最好使用较为成熟的蓝牙模块(如HC05),APP设计也一切从简,推荐使用app inventor(可视化模块编程)。
提示:总体设计方案框图

5.原理图设计说明
作品总共有五个部分:
(1)电源总线(实物图正中间):使用万能板焊接了一个包含正负电源线和地线的多端接口,这样使系统的供电变得更为方便,排查供电故障也更快;
(2)基波整形电路(实物图左上角):包含前级放大滤波模块(蓝色)和后级整形电路(红色),从AGC接受信号,经过固定增益、滤波然后再整形为同基频方波;
(3)信号调理电路-AGC(实物图右上角):蓝色PCB中有基于VCA821的自动增益控制电路,且配有直流偏置电路,可以为0-3.3V的片内ADC提供恒定的波形信号;
(4)TI微处理器和配套显示屏(实物图右下角):Tiva C 系列 TM4C123和2.2寸液晶屏;
(5)蓝牙模块(实物图右侧):HC05模块。
一、模拟电路设计:

结构分两路:
第一路:AGC+直流偏置,输出波形信号;
第二路:整形前级(放大滤波)+方波整形,输出频率信号;
性能介绍:
1.幅度范围:输入5mVpp-4Vpp信号波,恒定输出3Vpp相同波形信号和相同频率方波,匹 配单片机ADC的输入范围。不过幅度太低时,输出幅度也会下降,因为增益有极限;
2.频率范围:1KHz—100KHz(上限受制于整形前级电路中的AD620和电路中的滤波环节, 下限受制于AGC反馈支路中积分器的积分时间);
(1)信号调理电路设计:

模块是我赛前训练时制作的,所以该PCB有未使用的压控移相电路,本题目仅使用AGC和信号偏置电路。

上图为VCA821(压控放大器芯片)参考手册中给出的闭环增益控制电路,本次比赛中使用的AGC主电路结构和上面相同。不同的是运放的选择并非完全和上图相同,上图中的opa695用opa843代替,opa820用opa842代替。opa695(电流型运放)使用会造成自激和各种噪声问题,这点已经在调试过程中验证,比较不好用。
最后,积分器的电容要并联1M欧电阻,防止放大器零漂导致输出异常,积分器时间常数选择要看实际情况而定,时间常数越小,AGC的频率下限就越高。比赛中的PCB上的积分常数仅能满足800Hz以上信号的控制。
VCA821性能非常先进,频率上限很高,所以10MHz的信号都能够被处理。
直流偏置电路采用了减法器,反相输入信号,同相输入直流信号,所以注意: 最终波形信号和输入信号之间是反相的!
(2)整形电路设计:
为了实现小幅度信号测频方波稳定,再将信号整形前,需提前放大并滤波。

放大电路采用AD620的典型电路,可通过区域上方的电位器调节增益。选择AD620的好处是它的共模抑制比很高。且仪表放大器输入电阻极高,对AGC的影响较小。但缺点就是频率范围不高,且增益越高,频率范围越小。这也是后期我们组无法扩展频率范围的原因之一。
滤波电路设计的是二阶有源滤波器,截止频率100KHz,可以通过更换阻容来改变。

也是因为模块是训练时做好的缘故,所以并不只是TLV3501整形电路。整个模块有四个部分,全是检波所用。
输入有一级opa843做缓冲级,加以二极管做输入限幅,所以后级损坏的可能性较小。
包括:
(1)LM339低频整形电路;
(2)TLV3501高频整形电路;
(3)以TLV3501和三级运放为核心的峰值检测电路,测量频率上限可至数十兆赫兹,但下限也受积分器积分常数限制;
(4)基于AD637的有效值检测电路,可控制工作与否,上限频率8MHz。
本次比赛使用的是TLV3501高频整形电路。
TLV3501构成的迟滞比较电路:

二、数字电路设计:
采用了Tiva C的开发板并用SPI接口连接了2.2寸液晶屏做显示。利用的处理器资源有:
1.一个定时器输入捕获端口(PB6),用于频率测量;
2.一个ADC采样端口,用于采集波形信号;
3.一个SPI接口,用于连接显示屏;
4.一个串口,用于连接蓝牙HC05。
6.PCB设计说明
AGC:


整形前级电路:


TLV3501整形电路:


设计要点:
(1)电源线设置:粗细符合电流需求,流向上先通过滤波电容再到器件等;
(2)电源滤波电容放置:一般用一大一小放在器件的电源端,可参考相关器件手册的layout;
(3)信号线布置:走圆弧角且不走锐角,线宽适量大一些,拒绝平行布线,尽可能少走通孔等;
(4)器件放置:尽量使器件均匀分散且主芯片的输入引脚应该靠近输入sma,避免引入额外干扰;
(5)铺铜:在芯片下面的底层PCB应该掏空,避免杂散电容影响高频芯片工作。
7.软件说明
**关键是欠采样和FFT计算,具体有以下内容:**
1. 频率测量:配置 Timer1 定时 1s、Timer0 为输入捕获模式,计算 1s 时间内上升沿的数量,由此得出输入信号频率;
2. ADC 采样:根据不同的输入信号基波频率确定采样率,定时器触发 ADC 采样;
3. 总谐波失真 (THD) 和基波与谐波归一化幅值的测量:调用 DSP 库的 FFT 函数,对 ADC 采集到的数据进行 1024 点 FFT 运算,并由此计算出THD 和各次谐波归一化幅值。
代码块:
#define FFT_LENGTH 1024 //FFT点数
//uint32_t FFT_LENGTH = 1024;
extern _lcd_dev lcddev;
extern uint16_t pointcolor;
extern uint16_t backcolor;
extern uint8_t pressedKey;
uint8_t key;
uint16_t y_z[FFT_LENGTH];
uint8_t pui8ControlTable[1024];
arm_cfft_radix4_instance_f32 cfft;
float input[FFT_LENGTH*2];
float output[FFT_LENGTH];
uint8_t timeout;
uint32_t Data[FFT_LENGTH];
uint32_t pui32ADC0Value[1];
uint16_t Index = 0,flag = 0, flag_com = 1;
float freq_fund; //基波频率
uint16_t freq_seq[5]; //五个频率分量索引
float32_t Uo[5]; //五个频率分量幅值
float THD;
float norm_am[4];
uint16_t x_start;
double freq = 0;
uint32_t count=0, mycount=0;
uint32_t Rate = 64000;
void ADC0Sequence3Handler()
{
uint32_t ui32Mode;
uint16_t i = 0;
flag=0;
for(i=0;iAIN11
ADCSequenceConfigure(ADC0_BASE,3,ADC_TRIGGER_TIMER,0);
ADCSequenceStepConfigure(ADC0_BASE, 3, 0, ADC_CTL_CH11 | ADC_CTL_IE | ADC_CTL_END);
ADCSequenceDMAEnable(ADC0_BASE,3);
ADCIntRegister(ADC0_BASE, 3,ADC0Sequence3Handler);
TimerControlTrigger(TIMER0_BASE,TIMER_A,true);
TimerConfigure(TIMER0_BASE,TIMER_CFG_PERIODIC);
TimerLoadSet(TIMER0_BASE,TIMER_A,SysCtlClockGet()/Samp_rate-1);
TimerADCEventSet(TIMER0_BASE,TIMER_ADC_TIMEOUT_A);
TimerEnable(TIMER0_BASE,TIMER_A);
ADCSequenceEnable(ADC0_BASE,3);
ADCIntClear(ADC0_BASE, 3);
}
void InituDMA(void)
{
SysCtlPeripheralClockGating(true);
SysCtlPeripheralEnable(SYSCTL_PERIPH_UDMA);
SysCtlPeripheralSleepEnable(SYSCTL_PERIPH_UDMA);
IntEnable(INT_UDMAERR);
uDMAEnable();
uDMAControlBaseSet(pui8ControlTable);
uDMAChannelAssign(UDMA_CH17_ADC0_3);
uDMAChannelAttributeDisable(UDMA_CHANNEL_ADC3,UDMA_ATTR_ALL);
uDMAChannelControlSet(UDMA_CHANNEL_ADC3 | UDMA_PRI_SELECT,UDMA_SIZE_32 | UDMA_SRC_INC_NONE | UDMA_DST_INC_32 |UDMA_ARB_1);
uDMAChannelTransferSet(UDMA_CHANNEL_ADC3 | UDMA_PRI_SELECT,UDMA_MODE_BASIC , (void *)(ADC0_BASE+ADC_O_SSFIFO3),Data,FFT_LENGTH);
uDMAChannelAttributeEnable(UDMA_CHANNEL_ADC3,UDMA_ATTR_USEBURST);
uDMAChannelEnable(UDMA_CHANNEL_ADC3);
}
void freq_measure()
{
uint16_t i, flag_1 = 1;
float max = output[1];
for(i=1; i max)
{
max = output[i];
flag_1 = i;
}
}
freq_fund = flag_1*((float)Rate/FFT_LENGTH);
}
float32_t THD_COMP()
{
uint8_t i = 0;
float32_t sum = 0;
float32_t Uo[4];
for(i=0;i<4;i++)
{
Uo[i] = output[4*i+8]/output[4];
sum += Uo[i]*Uo[i];
}
return 100.0*sqrt(sum);
}
float32_t my_THD_COMP()
{
uint16_t i, j, flag_1 = 1;;
float max = output[1];
float max2, max3, max4, max5;
for(i=1; i max)
{
max = output[i];
freq_seq[0] = i;
}
}
Uo[0] = output[freq_seq[0]];
for(i=1;i<5;i++)
{
uint16_t hh;
Uo[i] = output[freq_seq[0]*(i+1)];
hh = freq_seq[0]*(i+1);
freq_seq[i] = freq_seq[0]*(i+1);
for(j=1;j<8;j++)
{
if(output[hh-4+j]>Uo[i])
{
Uo[i] = output[hh-4+j];
freq_seq[i] = hh-4+j;
}
}
}
for(i=0;i<5;i++)
{
UARTprintf("index = %d, U = %dn",freq_seq[i],(int)(Uo[i]));
UARTprintf("index = %d, U = %dn",freq_seq[i]-1,(int)(output[freq_seq[i]-1]));
UARTprintf("index = %d, U = %dn",freq_seq[i]+1,(int)(output[freq_seq[i]+1]));
}
for(i=0;i<5;i++)
{
if(Uo[i]/Uo[0] > 0.05f)
{
Uo[i] = sqrt(output[freq_seq[i]-1]*output[freq_seq[i]-1] + output[freq_seq[i]+1]*output[freq_seq[i]+1] + output[freq_seq[i]]*output[freq_seq[i]]);
}
}
for(i=0;i<4;i++)
{
norm_am[i] = Uo[i+1]/Uo[0];
}
float32_t sum=0.0f,thd1;
for(i=0;i<4;i++)
{
sum+=Uo[i+1]*Uo[i+1];
}
thd1 = sqrt(sum)/Uo[0]*100;
return thd1;
}

蓝牙和手机间的通讯规定:
通信协议方面,每次测量后,MCU 使用串口循环 5 次向蓝牙发送 75 个字节的字符串(直接使用 ASCII 码的对应字符)。

8.实物展示说明

说明:还需要准备双极性电源和智能安卓手机一部。
9.注意事项
**特别注意ADC的输入电压限制,做好保护,否则功亏一篑。**
10.测试结果
**测试方案**:准备十组数据,规定每组数据的四个谐波的归一化幅值、频率及原始信号峰峰值,使用信号源输出到本系统中,通过屏幕显示数据,并进行误差分析。




完
设计图
BOM
ID | Name | Designator | Footprint | Quantity |
---|---|---|---|---|
1 | Header-Female-2.54_1x2 | AGND1,DGND1 | HDR-TH_2P-P2.54-V-F | 2 |
2 | opa842 | AMP4 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | 1 |
3 | OPA695 | AMP5 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | 1 |
4 | opa843 | AMP6 | SOP-8_L4.9-W3.9-P1.27-LS6.0-BL | 1 |
5 | 0.1uF | C3,C21,C22,C25,C26,C29,C30,C35,C36,C43,C44 | C0805 | 11 |

评论