
开源协议
:GPL 3.0
描述
项目简介
使用STC32G144K246作为主控,以许老师LCR电桥为参考,制作的一款LCR电桥,通过此对此电路的学习,学到了STC32G的简单易用易上手,烧录容易,仿真容易,电路简单,学到许多关于运放的知识,包括最简单的跟随器,当然也有同相比例放大,反相比例放大,可编程比例放大,跨阻放大,仪表放大,差分放大等,也会学到模拟开关的简单应用,包括可编程滤波,信号切换等
项目功能
此处可填写项目的相关功能及应用场景,示例:
可以比较精确的测量电阻,电容,电感。
项目参数
此处可填写项目的相关功能参数介绍,示例:
无参数。
原理解析(硬件说明)
此处可填写项目的设计原理,将设计的原理拆分解析,示例:
1,主控及其数字部分,由于STC32G支持USB下载,所以很简单

2.从这里直接看出,外设在主控的哪个IO上,比较省时间

3.电源部分包含了升降压电路,以及反相电路,及充电电路和放电电路

4.难点,模拟部分
包含激励信号发生电路,电流电压放大电路,及带通滤波电路,和鉴相电路,通过4052和4053来切换各个参数

激励正弦波信号,可以通过PWM多级RC滤波后得到,也可以用单片机自带DAC产生,硬件电路已设计切换0欧电阻。

对被测lcr的电流和端电压进行采集放大,后经4053切换,给后级滤波放大电路,分时放大

可编程带通滤波器,有效抑制杂波

对前级信号进行鉴相,给ADC采集,软件计算相位差等各个参数
软件代码
DAC用TIMER17触发产生正弦激励,TIMER17初始化,及DAC初始化
void TIMER17_Init(void)
{
#define T17_PSCR (0)
#define T17_RELOAD (65536 - 186)
TIMER17_TimerMode(); //设置定时器17为定时模式
TIMER17_1TMode(); //设置定时器17为1T模式
TIMER17_SetIntPriority(2); //设置中断为较高优先级
TIMER17_EnableInt(); //使能定时器17中断
TIMER17_SetPrescale(T17_PSCR); //设置定时器17的8位预分频
TIMER17_SetReload16(T17_RELOAD); //设置定时器17的16位重载值
TIMER17_Run(); //定时器17开始运行
}
void DAC2_Init(void)
{
DAC2_SetClockDivider(0); //设置DAC2时钟
DAC2_T17Trigger(); //定时器17溢出时自动触发DAC2
DAC2_Enable(); //使能DAC2功能
DAC2_EnableDMA(); //使能DAC2的DMA模式
DMA_DAC2_SetAmount(255); //设置DAC2 DMA转换次数
DMA_DAC2_SetAddress(pu8DAC2DMABuffer); //设置DAC2 DMA缓冲区地址
DMA_DAC2_SetInterval(1); //设置DAC2 DMA转换间隔时间(系统时钟)
DMA_DAC2_ClearFlag(); //清除DAC2 DMA中断标志
DMA_DAC2_SetBusPriority(2); //设置总线访问为较高优先级
DMA_DAC2_SetIntPriority(2); //设置中断为较高优先级
DMA_DAC2_EnableInt(); //使能DAC2 DMA中断
DMA_DAC2_Enable(); //使能DAC2 DMA功能
// DMA_DAC2_Trigger(); //触发DAC2 DMA
参考方波有PWMB产生,用P0.1输出
void PWMB_Init(void)
{
PWMB_C6SwitchP01(); //设置PWMB通道6数据端口: PWMB6 (P0.1)
HSPWMB_Disable(); //关闭高速模式,使用同步方式进行初始化
PWMB_InternalClockMode(); //选择内部时钟模式
PWMB_SetClockDivider(16); //设置16位预分频
PWMB_SetReload16(2799); //设置16位重载值
PWMB_BufferARR(); //使能重载值寄存器预装载功能
PWMB_SetCounter(0); //初始化计数值
PWMB_CC6PDisable(); //关闭通道
PWMB_CC6Output(); //使能通道输出功能
PWMB_CC6PEnable(); //打开通道
PWM_UpdateDuty(PWMB_CH6, 1400); //设置通道的PWM占空比
PWMB_OC6REFPWMMode1(); //设置通道输出参考信号为PWM模式1信号
PWMB_BufferCCR6(); //使能CCRn预装载功能
PWMB_CC6PNonInverted(); //设置正极通道输出高电平有效
PWMB_EnablePWM6POutput(); //使能正极通道输出
PWMB_EnableMainOutput(); //使能PWM主输出
PWMB_SetIntPriority(1); //设置中断为较低优先级
PWMB_EnableUpdateInt(); //使能PWMB更新中断
LCR测试中,模拟开关高低电平切换的宏定义
//量程开关
#define Lc_4052_A_Clr() SetP6nInitLevelLow(PIN_3) // 00 40欧
#define Lc_4052_A_Set() SetP6nInitLevelHigh(PIN_3) //B0 A1 1K
#define Lc_4052_B_Clr() SetP8nInitLevelLow(PIN_0) //B1 A0 10K
#define Lc_4052_B_Set() SetP8nInitLevelHigh(PIN_0) //11 100K
//电流电压切换开关
#define VA_4053_A_Clr() SetP0nInitLevelLow(PIN_3) //0 电压
#define VA_4053_A_Set() SetP0nInitLevelHigh(PIN_3) // 1 电流
//带通输入端 放大倍数选择
#define DTQ_4053_C_Clr() SetP8nInitLevelLow(PIN_3)
#define DTQ_4053_C_Set() SetP8nInitLevelHigh(PIN_3) //电压跟随 还是9倍放大选择 , 0:跟随 ;1:9倍
//带通输出端 放大倍数选择
#define DTH_4053_B_Clr() SetP0nInitLevelLow(PIN_2)
#define DTH_4053_B_Set() SetP0nInitLevelHigh(PIN_2) // 0 : 1倍, 1 :10倍
/*******************************************************************************************************/
//带通中选择某频率进入下个运放 -------------------------------------------
#define DTZ_4053_A_Clr() SetP8nInitLevelLow(PIN_1) // 0 1 0
#define DTZ_4053_A_Set() SetP8nInitLevelHigh(PIN_1) //
//
#define DTZ_4053_B_Clr() SetP8nInitLevelLow(PIN_2) // 0 0 0
#define DTZ_4053_B_Set() SetP8nInitLevelHigh(PIN_2) //------------------------------------------
// 1KHZ 100HZ 7.8KHZ
/********************************************************************************************************/
//鉴相开关
#define JX_4053_C_Clr() SetP0nInitLevelLow(PIN_1)
#define JX_4053_C_Set() SetP0nInitLevelHigh(PIN_1)
//指示灯.........及固态继电器开关
#define QH_4052_A_Clr() SetP4nInitLevelLow(PIN_6)
#define QH_4052_A_Set() SetP4nInitLevelHigh(PIN_6)
#define QH_4052_B_Clr() SetP4nInitLevelLow(PIN_5)
#define QH_4052_B_Set() SetP4nInitLevelHigh(PIN_5)
//7.8KHZ滤波开关
#define K7K8HZ_LB_S_Clr() SetPBnInitLevelLow(PIN_6)
#define K7K8HZ_LB_S_Set() SetPBnInitLevelHigh(PIN_6)
//100HZ滤波开关
#define K100HZ_LB_S_Clr() SetPBnInitLevelLow(PIN_7)
#define K100HZ_LB_S_Set() SetPBnInitLevelHigh(PIN_7)
硬件SPI,没调通,一发送数据,就卡死(用AICUBE生成的),用软件SPI写了个发送函数,就正常了。(焊接了FLASH芯片,再测试另外的硬件SPI)
static void Software_Spi_WriteByte(uint8_t dat)
{
uint8_t i;
LCD_CS_Clr() ;
for(i=0; i<8; i++)
{
if( (dat&0x80)==0x80 )
LCD_MOSI_Set();
else
LCD_MOSI_Clr();
dat <<= 1;
LCD_CLK_Clr() ;
LCD_CLK_Set() ;
}
}
屏幕写数据和写命令函数
/******************************************************************************
函数说明:LCD写入数据
入口数据:dat 写入的数据
返回值: 无
******************************************************************************/
void LCD_WR_DATA(u8 dat)
{
LCD_DC_Set();//写数据
//SPI2_WriteByte(dat);
#ifdef Software_Spi
Software_Spi_WriteByte(dat);
#endif
}
/******************************************************************************
函数说明:LCD写入命令
入口数据:dat 写入的命令
返回值: 无
******************************************************************************/
void LCD_WR_REG(u8 dat)
{
LCD_DC_Clr();//写命令
// SPI2_WriteByte(dat);
#ifdef Software_Spi
Software_Spi_WriteByte(dat);
#endif
}
256点sin值(依据官方示例)
/************************************************************************************/
for(i=0; i<128; i++)
{
u16_sin_data.sin_data_16 = 2048 + (u16)((T_SIN[i] - 2048)*(u32)amp/256);
pu8DAC2DMABuffer[i*2] = u16_sin_data.byte_parts.sin_data_low8;
pu8DAC2DMABuffer[i*2+1] = u16_sin_data.byte_parts.sin_data_high8;
}
for(i=128; i<256; i++)
{
u16_sin_data.sin_data_16 = 2048 - (u16)((2048 - T_SIN[i])*(u32)amp/256);
pu8DAC2DMABuffer[i*2] = u16_sin_data.byte_parts.sin_data_low8;
pu8DAC2DMABuffer[i*2+1] = u16_sin_data.byte_parts.sin_data_high8;
}
注意事项
此处可填写在设计制作时需重点关注的点或是易错的地方,示例:
- 原理图中 红圈中的二极管,在焊接时,需要反向焊接(PCB标识错误)
(说明:为什么不重新导入,调换管脚呢,因为,LCEDA莫名奇妙的出现网表错误,当导入后,全部PCB元器件,会重新排列,需要重新布局,所以知道就好了,焊接注意下) - 原理图中,紫色框内的电阻,是低温漂的,最好是0.1%的。
- 正弦波有一点点变形,软件还没调好,不能确定影响大小,请悉知
- 还有个问题就是在使用USB进行串口printf时,会影响中断(DAC的Timer17和PWM的中断响应)。
- 外壳就是EDA里的外壳就已经导出来了,组装时 把航空插头与PCB之间的那个螺母去掉,不然外壳合不严实。
- FLASH 可有可无,我焊接了,但不知道做什么,测试下硬件SPI驱动
实物图


实物图


设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。








