乐于分享
好东西不私藏

【新手向】地文星CW32电压电流表——软件设计

【新手向】地文星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不同:

    1. HCLK用于SYStick、FLASH、GPIO功能;
    1. PCLK用于BTIM、ADC功能。
2. GPIO配置
  • 以下模块需要通过GPIO配置实现初始化:
  1. LED、BUTTON、数码管等外设设备;
  2. 电压电流测量引脚 PB0/PB1/PB10/PB11 需要开启ADC模数转换功能。
3. ADC模块

要点提示

  • 启动GPIO后配置对应引脚为ADC模式,同时对ADC时钟、结构体、序列通道等进行初始化配置(参考用户手册);
  • 使用ADC_GetSqrXResult获取对应通道寄存器储存的数据;
  • 为保证ADC获取电压电流值较为稳定,此处采用均值滤波方法,通过处理100次取样,对数据剔除最大最小值后计算取样均值,获得某一时段内(根据时钟频率应该是100ms,此处存疑)的稳定数值,有效稳定了数据显示,消除数据跳动干扰;
  • 数据处理模块DATA_process作为初始采样均值化后的原始数据处理,依据电路设计原理进行相应计算:
  1. 电压值为实际采样电压×100,数据单位为10mV(与数码管驱动有关,详本章5. 数码管驱动模块|动态显示);
  2. 电流值为实际采样电流,数据单位为10mA(与数码管驱动有关,详本章5. 数码管驱动模块 | 动态显示);
  3. 电压电流值的计算引入标定参数计算;
  4. 具体原理应用和参数引入详见附件工程代码。
  • 【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. 本部分内容已在1.2使用说明 中更新,以下为初版原文不再调整。更新内容查看1.2章节。
  2. 另外,为提升电流标定精度,需要考虑R0阻值的误差度,因此建议焊接R0后进行真实值标定而非模拟标定。
1. 模拟电压标定
  • 5V电压标定
  1. 模拟标定方法:
    1. 接线原则:与电压模拟测量接线相同,注意短接JP1;
    2. 在正常测量模式下按【模式】按键一下,红色数码管显示【V.05】,蓝色LED灯保持闪硕,此时进入5V电压标定模式,蓝色数码管显示当前测得电压;
    3. 调整RP1值,直到万用表电压值显示5V;
    4. 按下【标定】按键,蓝色LED灯变为常亮,系统切换为普通测量模式,红色数码管恢复显示电压值5V,标定完成。
  1. 普通场景标定实现:
    1. 接线原则:与普通场景外接万用表接线方式相同;
    2. 操作方式同上面第二步骤;
    3. 调整外接电压值到5V,直到万用表电压值显示5V;
    4. 按下【标定】按键,蓝色LED灯变为常亮,系统切换为普通测量模式,红色数码管恢复显示电压值5V,标定完成。

15V标定不再赘述。

2. 模拟电流标定
  • 0.5A电压标定
  1. 模拟标定方法:
    1. 接线原则:与电流模拟测量接线相同(注意不焊接R0、短接JP2);
    2. 在正常测量模式下按【模式】按键三下,红色数码管显示【A.0.5】,蓝色LED灯保持闪硕,此时进入0.5A电流标定模式,蓝色数码管显示当前测得电流;
    3. 调整RP2值,直到万用表电压值显示0.050V
    4. 按下【标定】按键,蓝色LED灯变为常亮,系统切换为普通测量模式,蓝色数码管显示电流值0.5A,标定完成。
  1. 普通场景标定实现:
    1. 接线原则:与普通场景外接万用表接线方式相同(注意要焊接R0);
    2. 操作方式同上面第二步骤;
    3. 调整外接电流值到0.5A,直到万用表电流值显示0.5A(此时因焊接R0已经可以按照电流测量方式校核);
    4. 按下【标定】按键,蓝色LED灯变为常亮,系统切换为普通测量模式,红色数码管恢复显示电压值5V,标定完成。

1.5A标定不再赘述。

往期推荐:

【产品应用】基于CW32的智能充电宝(方案开源)

【产品方案】基于CW32L010低成本电动工具方案

【产品方案】CW32L010低成本工业仪表

【产品方案】基于CW32F003E4P7的数字电压电流表产品方案

【产品方案】基于CW32的无刷直流空心杯电机无感方波控制驱动方案

【产品方案】基于CW32L010的低成本USB充电检测仪产品方案

【产品方案】基于CW32的无刷直流空心杯电机有感控制驱动方案

【产品方案】基于CW32F030C8的低压无刷风机无感控制器

【产品应用】基于CW32的角磨机控制器产品方案

CW32生态社区微信交流群

扫码加入QQ群
3群| 610403240

获取资料及“开发者扶持计划”第一手资讯

求点赞

求分享

求喜欢