DIY一个元器件特性测试仪 - 基于STM32G031最小系统模块”
硬禾学堂推出基于带ADC的MCU最小系统核心模块的元器件测试仪DIY套件。
这是本人第一次接触单片机,第一次上手32系列的板子,之前连更基础的51系列都没摸过。下文如有错误,欢迎批评指正。
已经实现功能:
-
- ADC模拟输入,可以进行对外置接口“1”、“2”、“3”脚电压的测量。(因为本人能力原因,暂未实现判断元器件的功能,故未开放ADC1_IN7,仅有ADC1_IN5,ADC1_IN6,供测量两脚元器件)。
- 使用软件IIC协议,用GPIO接口模拟,成功对4脚OLED进行控制,实现画面的显示。
- 6个GPIO输出口对应三组470k、680Ω电阻端口,实现对端口电平的置位。
- 实现GIPO输入,可以通过“Start”按键进行人机交互。每按下一次“Start”按键,就进行一次循环,进行元器件的测量。
- 已经内置常见元器件的图形点阵代码,可以实现图形化输出,有一定的观赏性。
附上相关配置图:
在这里展示一下元器件图形的点阵图库:
unsigned char BMP1[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x40,0x40,0x40,
0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xC0,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,
0x02,0x02,0x02,0x02,0x1F,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x1F,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*电阻*/
};
unsigned char BMP2[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0xF0,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x00,0x00,0x00,0x00,0x7F,0x02,
0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*电容*/
};
unsigned char BMP3[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x80,0x60,0x20,0x60,0x80,0x00,0x00,0x00,
0x80,0x60,0x20,0x60,0x80,0x00,0x00,0x00,0x80,0x60,0x20,0x60,0x80,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x02,0x02,
0x03,0x00,0x00,0x00,0x0F,0x30,0x20,0x30,0x0F,0x00,0x00,0x00,0x0F,0x30,0x20,0x30,
0x0F,0x00,0x00,0x00,0x0F,0x30,0x20,0x30,0x0E,0x02,0x02,0x02,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*电感*/
};
unsigned char BMP4[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0xE0,0x20,0x60,0xC0,0x80,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x04,0x04,0x04,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x80,0xC0,0x60,0x31,0x1B,0x0A,0xFF,
0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*二极管*/
};
unsigned char BMP5[] =
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0xF0,0x00,0x80,0x40,0x20,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFF,0x11,0x20,0xC0,0xC0,0x40,
0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x03,0x00,0x00,0x03,0x00,0x01,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*三极管*/
};
未实现功能:
- 快速判断元器件类型。暂未理解三脚通断次数与元器件的对应关系。
- 无法解决两脚元件测量时,一个ADC悬空读数对判断程序的影响。
选择这块板子的原因是在碰到一个半导体器件的时候,需要确认它的型号、功能以及管脚定义,才能够正确使用它。但当我们从一块印刷电路板上拆下一个器件,或者从元器件盒中拿出一个器件,除非能够正确辨认出上面的型号,找到对应数据手册文档,否则就需要手工确认它就是是那种类型的三极管、场效应管、晶闸管、二极管、电容、电感等。当然可以借助手边的万用表进行初步判断,但这费时、费力。
实现功能注意事项:
在这里就说说我遇到的坑吧。
- 空间不足。个人经验吧,主函数越简洁,占空间越小,其他函数最好写在其他C文件中。在主函数中声明变量特别占储存,不知道有没有依据。
- 每一次对OLED进行输出前,一定一定要先清屏,不然会有图像重叠的问题。
- 在进行实际测试时,最好不要用充电宝进行供电,有的充电宝有智能断电的功能,单片机的电流太小,可能会用着用着就被断电了。(至少我遇到了。)
几个对开发板的建议吧:
开发板总体质量不错也挺小巧。
- MPU的GPIO接口与OLED的IIC总线对接(额,活动内页面实际原理图和引脚测试结果错误,数据线SDA与时钟线SCL位置在原理图中是错误的!!!因为这个,电亮屏幕就废了不少功夫。)。
- 能不能换用其他数据供电接口,现如今Micro USB已经不是那么常见了,为了找根数据线费了点功夫。
实现思路:
说说实现的思路吧。原来的想法是很美好,但因为个人能力原因,仅完成一部分。
第一步是开机画面,这个已经实现了。接通电源,按下复位键RST,显示开机画面,输出一句欢迎语“欢迎”,居中偏上显示,输出一句问候语“按“Start”开始测量”居中偏下。
第二步是进行判断(if条件语句),判断“Start”按键是否被按下,用GPIO输入。若检测到输入进行第三步,否则是等待,不进行任何操作。这个目前也已经实现了。
第三步进行初步判断,原计划是先判断是两脚元器件还是三脚元器件,但遗憾的是,悬空的ADC接口电平不是唯一,是会变的,无法判断是悬空还是接通。后来,在网上又看到通过三组接口(假设为1,2,3),先给1置VCC,给2置0;再给2置VCC,给1置0;给1置VCC,给3置0,;给3置VCC,给1置0;给2置VCC,给3置0;给3置VCC,给2置0。通过读取6次的adc结果,分析通断,来判断元器件。但是由于本人电路分析不加,暂时未能理解其中的原理,无法按此思路编写相关代码。故此,本人的源程序中,暂时舍去了判断的功能,默认接入元器件为电阻,以电阻为基础编写代码。
第四步,根据第三步的判断结果(现在省略第三步,默认为电阻);现在相应的输出元器件名称(左上角),输出相应的元器件图形(中间偏上的位置),输出测试值(原计划是电阻值,电容值,电感值,二极管通断方向,三极管的类型:N或P。现在就输出电阻值,居中位置)。最后,在最下面输出一句问候语“按“Start”键继续”。
第五步,开始循环操作,等待下一次“Start”键被按下,重新执行第二步的代码。
主函数部分代码展示
while (1)
{
key=HAL_GPIO_ReadPin(GPIOC,GPIO_PIN_6);
if(key==0)
{
OLED_Clear();
OLED_ShowString(7,42,wait,12,1);
OLED_Refresh();
HAL_Delay(1500);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_0, 1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_4, 1);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_11, 0);
HAL_GPIO_WritePin(GPIOA, GPIO_PIN_12, 0);
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,0xff);
adc1= (double)HAL_ADC_GetValue(&hadc1)*3300/4096;
HAL_ADC_Start(&hadc1);
HAL_ADC_PollForConversion(&hadc1,0xff);
adc2= (double)HAL_ADC_GetValue(&hadc1)*3300/4096;
double r1=0,r2=0,r=0;
r1=(adc1-adc2)/adc2*680;
r2=(adc1-adc2)/(3300-adc1)*680;
r=(r1+r2)/2*1.05;//修正参数
OLED_Clear();
OLED_ShowNum(42,21,r,6,16,1);
OLED_ShowPicture(45,0,40,20,BMP1,1);
OLED_ShowString(10,0,r_en,16,1);
OLED_ShowString(7,42,BMPc,12,1);
OLED_Refresh();
key=1;
HAL_Delay(500);
}
}
达到的性能:
- 实现5K以内电阻的准确测量,基本控制误差在2%内。
- 实现10K以内电阻的准确测量,基本控制误差在5%内。
- (后期将实现1M以内电阻的准确测量,基本控制误差在5%内。)
- (后期将实现对五种基本元器件的分类判断与测量)
- (能够判断二极管的通断方向)
- (能够判断三极管的类型,N沟道还是P沟道)
- (能够判断电容和电感的大小)
源代码和以编译文件:
- 注意事项:
- 修改芯片配置时,请谨慎。本人设置系统时钟64MHz,ADC时钟16MHz。
- 已关闭ADC1_IN7端口,如有需要望启用。
- 使用STM32CubeIDE编写,非KEIL MDK版本,请对应版本打开。
- 设置ADC周期时,可适当放长一点,尤其是刚上电的时候,ADC测出的电压往往偏低。
- 百度网盘:
- HEX文件:
- HEX文件已经包含在源代码中了,在其文件夹Debug中。除此之外,还包含其他如bin、elf类型,供大家选用。
- 源代码:
- 链接:https://pan.baidu.com/s/1Hi2tj9Ai_y6O_2vk64O42w
- 提取码:0bbi
- 复制这段内容后打开百度网盘手机App,操作更方便哦
其他补充:
- 硬件方面的调试已经不是主要问题了,接下来的主攻方向是代码的修改,如何使其完成更多元器件的判断以及如何保证对大电阻测量的准确性是主要修改方向。
- 其次,进一步完善UI操作界面,合理利用OLED屏幕。
- 通过这次寒假期间的实践,线上教学讲解,还是有不少收获的,进一步了解与学习。
下面给大家附上实际操作图,仅供参考。