一、来源:凡亿教育
第一场:硬币检测装置原理分析、电路设计以及器件选型_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1Zh4y1V7Px/?p=1&vd_source=43eb1cb50ad3175d7f3b9385905cd88f
二、开发软件:KEIL MDK
三、主控芯片:STM32F103C8T6
四、电路原理图设计、PCB绘制:立创EDA
五、涉及成品模块:0.96 inch OLED , STM32F103C8T6最小系统板
六、实物测试视频:
硬币检测电路测试视频
电路上有三个按键,第一个是进入校正模式(进入后功能变为切换要校正的硬币),第二个为更新硬币电压值(更新时需要将硬币放到线圈上),第三个按键为跳出校正(掉电不保护)
七、程序开源地址:
硬币检测电路/程序 · lovefoolnotme/开源项目 - 码云 - 开源中国 (gitee.com)https://gitee.com/lovefoolnotme/open-source-projects/tree/master/%E7%A1%AC%E5%B8%81%E6%A3%80%E6%B5%8B%E7%94%B5%E8%B7%AF/%E7%A8%8B%E5%BA%8F
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "oled.h"
#include "bmp.h"
#include "ADC.h"
#include "key.h"
#include "IR2104.h"
extern uint8_t DMAEndFlag; //0:DMA结束
extern uint8_t MeasUpdateFlag; //测量更新标志,大约1s更新一次
extern uint16_t voltage; //电压值,3位小数
uint8_t key_value=0;
uint8_t jiaozheng=0;
//1角,5角,1元
uint16_t nomoney =1190 ;
uint16_t yj =1044 ;
uint16_t wj =936 ;
uint16_t yy =577 ;
//uint16_t wj_yy =650 ;
//uint16_t wj_yj =886 ;
//uint16_t yj_yy =677 ;
uint16_t gap =50 ;
int main(void)
{
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
delay_init(); //延时函数初始化
Key_Configuration();
ADC_Config();
IR2104_Config();
//加这个延时是等待OLED屏幕启动
delay_ms(100);
OLED_Init();
OLED_ColorTurn(0);//0正常显示,1 反色显示
OLED_DisplayTurn(0);//0正常显示 1 屏幕翻转显示
OLED_Clear();
OLED_Refresh();
ADC_SoftwareStartConvCmd(ADC1, ENABLE);
while(1)
{
//判断ADC的DMA传输是否完成
ADC_DMA_End_Detection();
if(!DMAEndFlag) VI_Seperation();
if(!MeasUpdateFlag)
{
//计算电压,单位mv
VI_Calc();
//显示电压,单位mv
OLED_ShowNum(88,10,voltage,5,8,1);
}
//扫描按键
key_value=Key_Scan();
/*******************************************************校正开始*******************************************************/
//校正电压值
if(key_value==1)
{
while(Key_Scan()==1); //等待松开按键
key_value=0;
//开始校正电压值
OLED_Clear();
while(1)
{
key_value=Key_Scan();
while(Key_Scan()!=0); //等待松开按键
ADC_DMA_End_Detection();
if(!DMAEndFlag) VI_Seperation();
if(!MeasUpdateFlag)
{
VI_Calc();
}
//校正yijiao
if(jiaozheng==0)
{
OLED_ShowString(0,0,"jiaozheng!",8,1);
OLED_ShowString(0,30,"yijiao:",8,1);
OLED_ShowNum(80,30,yj,4,8,1);
OLED_ShowString(0,50,"voltage:",8,1);
OLED_ShowNum(80,50,voltage,4,8,1);
OLED_Refresh();
}
//校正wujiao
else if(jiaozheng==1)
{
OLED_ShowString(0,0,"jiaozheng!",8,1);
OLED_ShowString(0,30,"wujiao:",8,1);
OLED_ShowNum(80,30,wj,4,8,1);
OLED_ShowString(0,50,"voltage:",8,1);
OLED_ShowNum(80,50,voltage,4,8,1);
OLED_Refresh();
}
//校正yiyuan
else if(jiaozheng==2)
{
OLED_ShowString(0,0,"jiaozheng!",8,1);
OLED_ShowString(0,30,"yiyuan:",8,1);
OLED_ShowNum(80,30,yy,4,8,1);
OLED_ShowString(0,50,"voltage:",8,1);
OLED_ShowNum(80,50,voltage,4,8,1);
OLED_Refresh();
}
switch(key_value)
{
case 0: break;
//进入下一校正前清除屏幕
case 1: jiaozheng++;if(jiaozheng>2) jiaozheng=0; OLED_Clear();break;
//校正值保存
case 2: {
if(jiaozheng==0) yj=voltage;
else if(jiaozheng==1) wj=voltage;
else if(jiaozheng==2) yy=voltage;
else ;
};break;
case 3: break;
default:break;
}
//退出
if(key_value==3)
{
jiaozheng=0;
key_value=0;
OLED_Clear();
break;
}
}
}
/*******************************************************校正结束*******************************************************/
//1. 1角硬币放在线圈上
if(((yj-gap)<voltage)&&(voltage<(yj+gap)))
OLED_ShowPicture(0,0,64,64,yijiao,1);
//2. 5角硬币放在线圈上
else if(((wj-gap)<voltage)&&(voltage<(wj+gap)))
OLED_ShowPicture(0,0,64,64,wujiao,1);
//3. 1元硬币放在线圈上
else if(((yy-gap)<voltage)&&(voltage<(yy+gap)))
OLED_ShowPicture(0,0,64,64,yiyuan,1);
//4. 没有硬币放在线圈上
else
OLED_ShowPicture(0,0,64,64,college_logo,1);
//刷新屏幕
OLED_Refresh();
}
}
八、原理图、PCB开源地址:
硬币检测电路/原理图、PCB · lovefoolnotme/开源项目 - 码云 - 开源中国 (gitee.com)https://gitee.com/lovefoolnotme/open-source-projects/tree/master/%E7%A1%AC%E5%B8%81%E6%A3%80%E6%B5%8B%E7%94%B5%E8%B7%AF/%E5%8E%9F%E7%90%86%E5%9B%BE%E3%80%81PCB
九、部分踩坑:购买的LDO,AMS1117 12V-5V存在质量问题,输入12V直接损坏,后面发现是质量问题后使用10V输入电路也可正常工作。
十、原理图设计讲解与经验(凡亿教育):
10.1 检测的原理:涡流效应
在图中,可以看到,线圈中加入交变电流时,可以产生涡流效应,类似于变压器,硬币类似于负载,当硬币加入时相当于负载接入,电流会增大,这个时候后边的电流增大前边的电流也会变大,检测前边电路的电压即可知道是否有负载接入,主要是看电压值,所以其实这个电路不仅可以检测硬币,还可以检测其他金属物品,但是需要自己指定。我们将1角、5角、1元硬币分别放上线圈查看前边电路的电压检测值即可知道不同硬币在电路中对应的电压值,并且修改程序来判别电压达到判别硬币的功能。
10.2 检测电路的设计
先从后面开始看,并联的C1、C2合计为2UF,然后我们会在线圈接口接一个14UH的线圈(相当于电感),此时C1、C2和线圈构成一个LC并联,R1焊接1R电阻,C3电容是用来隔离直流(到C3的型号是一个交流和直流叠加的型号),C5焊接470NF电容,L3焊接68UH电感,C5和L3构成一个LC串联,R23焊接75R3W的金属膜电阻。为什么这么设计:
(1)为了节能。(LC并联)当LC并联谐振时,电感(线圈)中的电流和电容(C1、C2)中电流几乎相等,其他部分的阻抗变化几乎对能量消耗没有影响。
谐振频率计算公式(并联和串联都是这样):
(2)提高灵敏度。(LC串联电路)
LC串联谐振时等效电阻最小,LC并联谐振时等效电阻最大。
我们输入的交变信号频率是取LC串联电路的谐振频率,当硬币接入时,后边电路前边电路电流增大,电感L减小,在上面的公式可以看出谐振频率会增大(下图为LC并联的f与r的关系图),相当于放入硬币前我们的等效电阻与频率曲线为红色曲线,放入硬币之后为绿色曲线。我们输入的频率没有变,而谐振频率后移,等效电阻减小了,我们要检测的就是LC并联处TP5测试点的电压,这里的等效电阻减小,则电压会减小。这是第一处灵敏度增加。电流增大,则TP4处的电压减小(功率守恒),TP4的电压为R1电阻和后面LC并联的电压之和,电流增大,R1上的电压增大,而TP4点的电压减小,只能在LC并联上减少更多的电压来形成整体电压下降。这是第二处灵敏度增加。