站内搜索
发作品签到
基于STC32G144K246的lcr电桥
专业版

基于STC32G144K246的lcr电桥

3.5k
0
0
12

简介

一款基于STC32G144K246的LCR电桥

简介:一款基于STC32G144K246的LCR电桥
STC单片机开源创意电子设计大赛
复刻成本:85

开源协议

GPL 3.0

创建时间:2025-12-03 19:43:28更新时间:2026-01-26 11:57:02

描述

项目简介

使用STC32G144K246作为主控,以许老师LCR电桥为参考,制作的一款LCR电桥,通过此对此电路的学习,学到了STC32G的简单易用易上手,烧录容易,仿真容易,电路简单,学到许多关于运放的知识,包括最简单的跟随器,当然也有同相比例放大,反相比例放大,可编程比例放大,跨阻放大,仪表放大,差分放大等,也会学到模拟开关的简单应用,包括可编程滤波,信号切换等

项目功能

此处可填写项目的相关功能及应用场景,示例:
可以比较精确的测量电阻,电容,电感。

项目参数

此处可填写项目的相关功能参数介绍,示例:
无参数。

原理解析(硬件说明)

此处可填写项目的设计原理,将设计的原理拆分解析,示例:
1,主控及其数字部分,由于STC32G支持USB下载,所以很简单

主控数字部分.png

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

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

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

激励信号产生.png
激励正弦波信号,可以通过PWM多级RC滤波后得到,也可以用单片机自带DAC产生,硬件电路已设计切换0欧电阻。
信号采集.png
对被测lcr的电流和端电压进行采集放大,后经4053切换,给后级滤波放大电路,分时放大
放大滤波.png
可编程带通滤波器,有效抑制杂波
鉴相及输出.png
对前级信号进行鉴相,给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驱动

实物图

微信图片_20260125145959_16_43.jpg

微信图片_20260125150000_17_43.jpg

实物图

微信图片_20260125150001_18_43.jpg

微信图片_20260125150002_19_43.jpg

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

3D模型

序号文件名称下载次数
1
3DShell_PCB1.zip
46

附件

序号文件名称下载次数
1
BLINK.rar
94
2
LCR-XLS-2011-程序.rar
127
克隆工程
添加到专辑
0
0
分享
Logo GIF0
侵权投诉
知识产权声明&复刻说明

本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。

请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。

底部导航