在家居环境的测评中,采光质量是一项重要指标。单凭人介绍,显然是缺乏数据支撑的。
使用CH32V103开发板,结合相应的光照强度传感器及OLED显示屏等即可自行设计一个实用的光照强度记录仪,其构成情况如图1所示。
图1 光照强度记录仪构成
在该设计过程中,主要涉及以下问题的处理:
1. 数据写入文本文件
在原U盘读写的例程中,已提供了将字符串写入文本文件的方式,但记录仪要求的则是将动态变化的数据写入文件。解决此问题的办法是使用如下语句:
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;
这样就将多个变量的数据转换为可供存储的字符串,且统计出了其字节长度,并据此来写入文件中。
2.添加RTC计时功能和光照强度采集功能
作为RTC计时功能和光照强度采集功能,均已在前面的帖子中介绍过,但由于是对功能进行集成,所以要对引脚的使用进行重新地调节,比如此前的光照强度采集是使用PA11和PA12,但U盘读写所用的恰恰也是这两个引脚,为此便把其所用的引脚迁移到PA0和PA1上。
图2 USB接口原理图
将2个功能混合后,其实时检测的输出效果如图3所示。
图3 实时输出效果
3.添加OLED屏实时数显
为了便于实时观察光照强度的变换,将实时数显功能串入整体的功能处理中,其显示效果如图4所示。
图4 实时数显效果
4.精准地控制采集间隔
在通常情况下,使用延时函数即可准确地控制采集的间隔。但在处理任务量比较重的情况下,会导致积累性的间隔差异。
此问题的解决方法是按计时值来控制采集间隔,所用的语句为:
Get_Sunlight_Value();
//Delay_Ms(1000);
x=calendar.sec;
while(y==x)
{
x=calendar.sec;
}
y=x;
图5 采用延时的记录内容
图6 按计时值的记录内容
5.采用时长的控制
为了完整地记录一个采集周期的数据,为此将采集时长定为一天,采用间隔为1秒,其控制程序为:
for(c=0; c<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;
}
结束语:通过对光照强度记录仪的设计,可以发现尽管CH32V103开发板的体积很小,可其性能是很出色的,基于其串口通讯和U盘读写芯片的基地,其出品MCU是独具特色,且十分便于小型应用产品的开发。该设计所用到的U盘读写性能就大大地简化了设计难度并起到了提高设计效率的功效,CH32V103值得在设计中广泛采用。
本帖最后由 jennyzhaojie 于 2021-3-20 18:21 编辑和哪个“【RISC-V MCU CH32V103测评】光照强度记录仪的设计 (兼结题报告) ”贴是一样的哦
引用: Jacktang 发表于 2021-3-20 21:04 和哪个“【RISC-V MCU CH32V103测评】光照强度记录仪的设计 (兼结题报告) ”贴是一样的哦 ...
嗐,先是发错版块了,也没法去除就稍改一点放着吧,管管看是重复的可能就给清除了。