【新手向】地文星CW32电压电流表——软件设计
本项目参加了由CW32生态社区与立创开发板组织的电压电流表训练营活动转发已征得原作者大道至简同意。本项目所有资料已经开源适合新手小白复刻学习。https://oshwhub.com/zk272761180/learning-gewenxing-cw32f030c8t6-产品展示视频https://www.bilibili.com/video/BV1T8W4erEXn/#reply112995304803317读前说明2024.11.24 更新说明本项目已于9月10日优化完成最终软件版本为V3.0后续将不再更新。三、软件设计前言软件设计实现了硬件电路中各模块的独立运行以及各模块之间的配合运行从而实现了产品功能。3.1 软件架构上图展示了CW32电流表实现功能所必备的模块和程序功能。主要包含如下部分基础模块RCC时钟模块、GPIO启动模块核心模块BTIM中断控制、ADC模数转换模块外围模块LED驱动、数码管驱动、按钮驱动辅助模块数据存取、数据处理。该架构实现电压电流表测量的主要逻辑为时钟和GPIO为各个功能模块提供tick基础和引脚初始化BTIM中断控制了数据获取、按键操作和显示更新ADC模数转换实现电路测量的数据获取按键实现功能切换、参数标定功能原始数据经由数据处理后由数码管更新显示配置存取实现了参数标定的开关机配置记忆使用两种循环机制图中带背景区域BTIM中断控制配合时钟实现数据获取、数据显示、读取按键的内部计算While循环实现外部数据处理和数码管显示更新。3.2 模块简要说明1. RCC时钟配置依据系统内部时钟树可以看到不同模块所依赖的CLK不同:HCLK用于SYStick、FLASH、GPIO功能PCLK用于BTIM、ADC功能。2. GPIO配置以下模块需要通过GPIO配置实现初始化LED、BUTTON、数码管等外设设备电压电流测量引脚 PB0/PB1/PB10/PB11 需要开启ADC模数转换功能。3. ADC模块要点提示启动GPIO后配置对应引脚为ADC模式同时对ADC时钟、结构体、序列通道等进行初始化配置参考用户手册使用ADC_GetSqrXResult获取对应通道寄存器储存的数据为保证ADC获取电压电流值较为稳定此处采用均值滤波方法通过处理100次取样对数据剔除最大最小值后计算取样均值获得某一时段内根据时钟频率应该是100ms此处存疑的稳定数值有效稳定了数据显示消除数据跳动干扰数据处理模块DATA_process作为初始采样均值化后的原始数据处理依据电路设计原理进行相应计算电压值为实际采样电压×100数据单位为10mV与数码管驱动有关详本章5. 数码管驱动模块|动态显示电流值为实际采样电流数据单位为10mA与数码管驱动有关详本章5. 数码管驱动模块 | 动态显示电压电流值的计算引入标定参数计算具体原理应用和参数引入详见附件工程代码。【2024.8.24 更新】有关ADC采样频率代码中设置分频系数为128课程附件设置分频系数为4实测当分频系数为4时电压电流为0时ADC采样不是0因此建议使用128分频系数。4. BTIM控制中断模块使用CW32内置的BTIM中断控制器结合时钟进行中断操作定时处理特定任务任务一获取ADC变量详见本章3. ADC模块)任务二数码管更新显示将数码管显示缓存区数据显示出来任务三读取按键控制按键一切换Mode同时依据不同模式读取不同数据并更新显示数码管内容按键二标定设置按下时将参数储存进FLASH并计算斜率、更新数码管按键三返回至Mode 0即普通测量模式更新数码管显示。另外BTIM中还配置有LED缓存区更新计数器timecount和LED闪烁计数器ledcount以配合实现相应功能。5. 数码管驱动模块数码管驱动模块实现了数据编码单位显示、动态显示三位显示、坏道检测等功能数据编码依据原理图编码了0-9/0.-9./A./V./-/.等数字、字符编码以显示特定信息动态显示结合数据编码实现数字和字符信息显示数字显示传入2-5位数字实意为2位小数点有效位数的数字乘以100依据数字位数判断显示XXX、XX.X、X.XX、0.XX字符信息配置Mode 1-4四种显示模式分别显示V05、V15、A.0.5、A.1.5其他信息如未接入数据时编码为“---”等坏道检测功能选择性开启或者设置按键开启用于从000切换显示至9.9.9以检测数码管坏道。6. FLASH存取模块依托Flash.c驱动实现标定数值的存取和计算标定参数配置包含X05/X15/IX05/IX15其表示对应电压/电流ADC引脚测得数据值其映射的Y轴分别为5V、15V、0.5A、1.5A。参数标定即将当前引脚测得参数储存在相应变量中配置存取每次开机时读取数据。读取数据开头不是0xaa则读取默认配置否则读取已存数据按下标定按钮时计算相应数值并写入Flash参数计算该部分涉及参数标定原理详情见第四章内容。7. 其他模块本工程还包含开发初期的调试模块方便开发者在调试初期配置环境和开发板电路验证。点灯模块LED_shine.c按钮控制LED模块BUTTON_LED_TEST四、调试测试电压电流表在开发过程中需要进行软硬件设计验证。通过模拟采样和标定电路以调试测试软件设计的合理性。本设备内置模拟采样和标定电路方便初学者在开发阶段缺少必要设备的时候进行开发减少学习成本。当然设备调试测试同样可以通过外接可调电源、示波器或是其他辅助开发板实现。本文只使用内置模拟采样和标定电路实现调试测试。模拟测量和模拟标定的操作均在视频中有所体现。4.1 模拟测量当模拟电路接入测量电路时即可实现模拟测量。1. 电压测量模拟测量实现接线规则接入DC或VP供电建议电压小于量程后短接JP1即可测量实现通过RP1调整输入电压测量电路测量该RP滑动电压测量验证万用表调至电压档红表笔接入T_V黑表笔接入TGND此时相当于万用表并联入被测电路。常规测量时万用表和红色数码管显示数值相同。普通场景应用实现一般测量不短接JP1测量电路并联入被测电路CH1黄色线V接入被测电路正极黑色线GND接被测电路负极当测量电路小于5V时需外接电源DC或接入CH1红色线VP。验证测量万用表接入方式不变。2. 电流测量模拟测量实现接线规则接入DC或VP供电后短接JP2同时不焊接检流电阻R0测量实现测量电流本质是测量电压因R0阻值为0.1欧故两端电压的10倍即为实际电流值所以仅测量电压。模拟电路接入5V电压经R17压降后可模拟出0-0.238V电压即可模拟出0-2.38A范围通过RP2调整实现动态电流测量测量验证万用表调至电压档红表笔接入T_I黑表笔接入TGND此时相当于万用表并联入被测电路测量I处电压。此时电压表显示数值比蓝色数码管显示数值小10倍说明模拟电流乘以10与数码管显示相同。普通场景应用实现:一般测量焊接R0后不短接JP2测量电路串联入被测电路CN1黄色线I接入被测电路正极黑色线I-接被测电路负极当测量电路小于5V时需外接电源DC供电。验证测量焊接R0后不短接JP2测量电路和万用表调至电流档串联入被测电路CN2的1号口接入被测电路正极T_A接万用表红表笔I接万用表黑表笔CN1的2号口黑色线I-接被测电路负极。该验证测量和模拟验证测量接线方式不同需要注意。4.2 模拟标定使用三点标定方法默认ADC为0V时的测量结果也为0V或0A。因此只需进行另外两个测量点标定即可。另外标定点数越多测的数据越准确即AD-电压/电流值映射曲线拟合越准确。读者可以自行优化标定算法。【2024.9.10 更新】本部分内容已在1.2使用说明 中更新以下为初版原文不再调整。更新内容查看1.2章节。另外为提升电流标定精度需要考虑R0阻值的误差度因此建议焊接R0后进行真实值标定而非模拟标定。1. 模拟电压标定5V电压标定模拟标定方法接线原则与电压模拟测量接线相同注意短接JP1在正常测量模式下按【模式】按键一下红色数码管显示【V.05】蓝色LED灯保持闪硕此时进入5V电压标定模式蓝色数码管显示当前测得电压调整RP1值直到万用表电压值显示5V按下【标定】按键蓝色LED灯变为常亮系统切换为普通测量模式红色数码管恢复显示电压值5V标定完成。普通场景标定实现接线原则与普通场景外接万用表接线方式相同操作方式同上面第二步骤调整外接电压值到5V直到万用表电压值显示5V按下【标定】按键蓝色LED灯变为常亮系统切换为普通测量模式红色数码管恢复显示电压值5V标定完成。15V标定不再赘述。2. 模拟电流标定0.5A电压标定模拟标定方法接线原则与电流模拟测量接线相同注意不焊接R0、短接JP2在正常测量模式下按【模式】按键三下红色数码管显示【A.0.5】蓝色LED灯保持闪硕此时进入0.5A电流标定模式蓝色数码管显示当前测得电流调整RP2值直到万用表电压值显示0.050V按下【标定】按键蓝色LED灯变为常亮系统切换为普通测量模式蓝色数码管显示电流值0.5A标定完成。普通场景标定实现接线原则与普通场景外接万用表接线方式相同注意要焊接R0操作方式同上面第二步骤调整外接电流值到0.5A直到万用表电流值显示0.5A此时因焊接R0已经可以按照电流测量方式校核按下【标定】按键蓝色LED灯变为常亮系统切换为普通测量模式红色数码管恢复显示电压值5V标定完成。1.5A标定不再赘述。