LCR电桥@STC32G144K246,项目简介
使用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
复制代码 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驱动
实物图实物图
|