jennyzhaojie 发表于 2021-3-20 15:34

【RISC-V MCU CH32V103测评】光照强度记录仪的设计 (兼结题报告)

本帖最后由 jennyzhaojie 于 2021-3-20 17:58 编辑

<p>在家居环境的测评中,采光质量是一项重要指标。单凭人介绍,显然是缺乏数据支撑的。</p>

<p>使用CH32V103开发板,结合相应的光照强度传感器及OLED显示屏等即可自行设计一个实用的光照强度记录仪,其构成情况如图1所示。<br />
</p>

<p>图1 光照强度记录仪构成</p>

<p>&nbsp;</p>

<p>在该设计过程中,主要涉及以下问题的处理:</p>

<p>1. 数据写入文本文件</p>

<p>在原U盘读写的例程中,已提供了将字符串写入文本文件的方式,但记录仪要求的则是将动态变化的数据写入文件。解决此问题的办法是使用如下语句:</p>

<p>i = sprintf( (PCHAR)buf,&quot;%d %d:%d:%d %d\r\n&quot;,c+1,calendar.hour,calendar.min,calendar.sec,sd);</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mCmdParam.ByteWrite.mByteCount = i;</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mCmdParam.ByteWrite.mByteBuffer = buf;</p>

<p>这样就将多个变量的数据转换为可供存储的字符串,且统计出了其字节长度,并据此来写入文件中。</p>

<p>2.添加RTC计时功能和光照强度采集功能</p>

<p>作为RTC计时功能和光照强度采集功能,均已在前面的帖子中介绍过,但由于是对功能进行集成,所以要对引脚的使用进行重新地调节,比如此前的光照强度采集是使用PA11和PA12,但U盘读写所用的恰恰也是这两个引脚,为此便把其所用的引脚迁移到PA0和PA1上。</p>

<p></p>

<p>图2&nbsp; USB接口原理图</p>

<p>&nbsp;</p>

<p>将2个功能混合后,其实时检测的输出效果如图3所示。</p>

<p></p>

<p>图3 实时输出效果</p>

<p>&nbsp;</p>

<p>3.添加OLED屏实时数显</p>

<p>为了便于实时观察光照强度的变换,将实时数显功能串入整体的功能处理中,其显示效果如图4所示。</p>

<p></p>

<p>图4 实时数显效果</p>

<p>&nbsp;</p>

<p>4.精准地控制采集间隔</p>

<p>在通常情况下,使用延时函数即可准确地控制采集的间隔。但在处理任务量比较重的情况下,会导致积累性的间隔差异。</p>

<p>此问题的解决方法是按计时值来控制采集间隔,所用的语句为:</p>

<p>Get_Sunlight_Value();</p>

<p>//Delay_Ms(1000);</p>

<p>x=calendar.sec;</p>

<p>while(y==x)</p>

<p>{</p>

<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x=calendar.sec;</p>

<p>}</p>

<p>y=x;</p>

<p>&nbsp;</p>

<p></p>

<p>图5 采用延时的记录内容</p>

<p>&nbsp;</p>

<p></p>

<p></p>

<p>图6 按计时值的记录内容</p>

<p>&nbsp;</p>

<p>5.采样时长的控制</p>

<p>为了完整地记录一个采集周期的数据,为此将采集时长定为一天,采用间隔为1秒,其控制程序为:</p>

<pre>
<code class="language-cpp">for(c=0; c&lt;86400; c++)     //   60*60*24=86400
{
i = sprintf( (PCHAR)buf,"%d %d:%d:%d %d\r\n",c+1,calendar.hour,calendar.min,calendar.sec,sd);
mCmdParam.ByteWrite.mByteCount = i;                /* 指定本次写入的字节数 */
mCmdParam.ByteWrite.mByteBuffer = buf;            /* 指向缓冲区 */
s = CHRV3ByteWrite( );                               /* 以字节为单位向文件写入数据 */
mStopIfError( s );
//printf("成功写入 %02X次\r\n",(UINT16)c);
Get_Sunlight_Value();
//Delay_Ms(1000);
x=calendar.sec;
while(y==x)
{
          x=calendar.sec;
}
y=x;
}</code></pre>

<p>结束语:通过对光照强度记录仪的设计,可以发现尽管CH32V103开发板的体积很小,可其性能是很出色的,基于其串口通讯和U盘读写芯片的基地,其出品MCU是独具特色,且十分便于小型应用产品的开发。该设计所用到的U盘读写性能就大大地简化了设计难度并起到了提高设计效率的功效,CH32V103值得在设计中广泛采用,在此再对测评活动的组织者及产品的提供者表示感谢!</p>

Jacktang 发表于 2021-3-20 18:39

<p>这种间隔差异</p>

<p>除了按计时值来控制采集间隔方法还有什么更好的方法么</p>

jennyzhaojie 发表于 2021-3-21 00:47

Jacktang 发表于 2021-3-20 18:39
这种间隔差异

除了按计时值来控制采集间隔方法还有什么更好的方法么

<p>除了用时标,暂时也没更好的了,因为在处理其他处理时时间长短难预测就难去补偿。</p>

littleshrimp 发表于 2021-3-21 19:11

<p>@jinglixixi你们认识吗?</p>

Jacktang 发表于 2021-3-21 20:57

jennyzhaojie 发表于 2021-3-21 00:47
除了用时标,暂时也没更好的了,因为在处理其他处理时时间长短难预测就难去补偿。

<p>明白了</p>

jennyzhaojie 发表于 2021-3-22 00:07

本帖最后由 jennyzhaojie 于 2021-3-22 00:10 编辑

<div class="quote">
<blockquote><font size="2"><a href="forum.php?mod=redirect&amp;goto=findpost&amp;pid=3049649&amp;ptid=1159932" target="_blank"><font color="#999999">littleshrimp 发表于 2021-3-21 19:11</font></a></font> @jinglixixi你们认识吗?</blockquote>
</div>

<p>&nbsp;?</p>

dwdsp 发表于 2021-3-23 06:38

<p>光照度值这么小?我用MAX44009白天的数值一般都很大啊!</p>

jennyzhaojie 发表于 2021-3-24 00:07

dwdsp 发表于 2021-3-23 06:38
光照度值这么小?我用MAX44009白天的数值一般都很大啊!

<p>所处的光照情况比较差吧,手机照时也是上千的级别。</p>
页: [1]
查看完整版本: 【RISC-V MCU CH32V103测评】光照强度记录仪的设计 (兼结题报告)