[液位传感器测评] LED液位指示
本帖最后由 jinglixixi 于 2021-9-8 23:48 编辑<p>除了以数码管来显示模拟量的值之外,更直观的是以LED模块来指示液位的状态。为此,我们可在前面的检测上再添加上LED指示液位的功能,使整体的结构如图1所示。</p>
<p>图1检测结构图</p>
<p>所添加的LED模块连接到RB4~RB7来控制,其指示范围则如下:</p>
<p>LED1: 0~1.25V</p>
<p>LED2: 1.25 ~2.5V</p>
<p>LED3: 2.5~3.75 V</p>
<p>LED3: 3.75~ 5V</p>
<p>因此,在MCC中是按图2所示来配置引脚,对应的引脚命名见图3所示。</p>
<p>图2 MCC引脚配置</p>
<p>图3 引脚命名</p>
<p>实现液位指示的主程序则为:</p>
<pre>
<code class="language-cpp">void main(void)
{
int v,d;
float s;
SYSTEM_Initialize();
DELAY_milliseconds(50);
Init_MAX7219();
DELAY_milliseconds(200);
Write_Max7219(0xff,0x00);
Write_Max7219(1,8);
Write_Max7219(2,7);
Write_Max7219(3,6);
Write_Max7219(4,5);
Write_Max7219(5,4);
Write_Max7219(6,3);
Write_Max7219(7,2);
Write_Max7219(8,1);
ADCC_Initialize();
ADCC_StartConversion(channel_ANC2);
LED1_SetHigh();
LED2_SetHigh();
LED3_SetHigh();
LED4_SetHigh();
while (1)
{
v=ADCC_GetSingleConversion(channel_ANC2); // A/D为12位
Write_Max7219(1,v%10);
if(v>10) Write_Max7219(2,v%100/10);
else Write_Max7219(2,0x0f);
if(v>100) Write_Max7219(3,v%1000/100);
else Write_Max7219(3,0x0f);
if(v>1000) Write_Max7219(4,v/1000);
else Write_Max7219(4,0x0f);
s=v*5.0/409.5;
d=s;
Write_Max7219(5,0x0f);
Write_Max7219(6,d%10);
Write_Max7219(7,(d%100/10)|0x80);
Write_Max7219(8,0x0f);
LED2_SetHigh();
LED3_SetHigh();
if((s>2)&&(s<12.5)) LED1_SetLow();
else LED1_SetHigh();
if((s>=12.5)&&(s<25.0)) LED2_SetLow();
if((s>=25.0)&&(s<37.5)) LED3_SetLow();
if(s>=37.5) LED4_SetLow();
else LED4_SetHigh();
DELAY_milliseconds(1000);
}
}</code></pre>
<p>经程序的编译下载,其运行效果如图4所示。</p>
<p>图4 运行效果</p>
<p>若将循环内的程序修改为下面的内容,则可实现图5所示的指示效果。</p>
<pre>
<code class="language-cpp"> while (1)
{
v=ADCC_GetSingleConversion(channel_ANC2); // A/D为12位
Write_Max7219(1,v%10);
if(v>10) Write_Max7219(2,v%100/10);
else Write_Max7219(2,0x0f);
if(v>100) Write_Max7219(3,v%1000/100);
else Write_Max7219(3,0x0f);
if(v>1000) Write_Max7219(4,v/1000);
else Write_Max7219(4,0x0f);
s=v*5.0/409.5;
d=s;
Write_Max7219(5,0x0f);
Write_Max7219(6,d%10);
Write_Max7219(7,(d%100/10)|0x80);
Write_Max7219(8,0x0f);
LED2_SetHigh();
LED3_SetHigh();
if(s<2) LED1_SetHigh();
else LED1_SetLow();
if(s>=12.5)
{
LED1_SetLow();
LED2_SetLow();
}
if(s>=25.0)
{
LED1_SetLow();
LED2_SetLow();
LED3_SetLow();
}
if(s>=37.5)
{
LED1_SetLow();
LED2_SetLow();
LED3_SetLow();
LED4_SetLow();
}
else LED4_SetHigh();
DELAY_milliseconds(1000);
}</code></pre>
<p>注:此时已将LED的共阴极接法,该为共阳极接法,以减弱驱动负担。</p>
<p>图5 指示效果</p>
<p>在接入传感器之后,其检测效果如图6所示。稍感遗憾的是似乎传感器出现了问题,无论是侵入水中还是放在空气中,其检测值变换的极小基本无法识别液位的差异性。若当初申请2个就好了,起码能做个比对呀!</p>
<p>此外,传感器的集成性还不够好,使得测试电路连线过多、易产生不稳定问题,不如电容-非接触式传感器好用。</p>
<p>图6 指示效果</p>
<p style="text-align:justify"> </p>
<p>应该是测试电路连线有点多,有干扰,是不稳定的原因</p>
Jacktang 发表于 2021-9-9 21:35
应该是测试电路连线有点多,有干扰,是不稳定的原因
<p>有道理</p>
<p>用万用表测试一下看看结果</p>
<p>另外传感器的供电电压是5V,不能使用3.3V供电。</p>
<p><em>“传感器的集成性还不够好,使得测试电路连线过多、易产生不稳定问题”</em></p>
<p>上边这个问题,光电版的使用4根线,实际接到板子的只有3根线,除了电流环应该不会有比3根线更少的方案了。</p>
littleshrimp 发表于 2021-9-11 17:37
另外传感器的供电电压是5V,不能使用3.3V供电。
“传感器的集成性还不够好,使得测试电路连线过多 ...
<p>我指的是周边的电阻应集成到内部,使连接真正成为3个引脚。</p>
jinglixixi 发表于 2021-9-12 00:56
我指的是周边的电阻应集成到内部,使连接真正成为3个引脚。
<p>电阻确实应该集成在传感器内部</p> littleshrimp 发表于 2021-9-12 02:20
电阻确实应该集成在传感器内部
<p>由其是在电流环的电阻,会起一定的保护作用,否则易产生受损。</p>
<p></p>
页:
[1]