
CW32电压电流表
简介
基于CW32F030C8T6地文星开发板的体积小巧的电压电流表
简介:基于CW32F030C8T6地文星开发板的体积小巧的电压电流表开源协议
:GPL 3.0
(未经作者授权,禁止转载)描述
一、简介
1、外观
基于CW32F030C8T6地文星开发板的体积小巧的电压电流表,长2100mil(53.34mm),宽900mil(22.86mm),厚度约2cm(不算boot0排针)

2、功能
- 无需独立给开发板供电即可亮屏(使用MP2456GJ-Z),也可单独给开发板供电
- 以10次每秒的频率采样当前的电流电压值,并计算功率,由于功率总是不太准,就没有统计电能
- 支持屏幕亮度调节,电压电流的标定,采样率没有太大必要改,固定了
- 电压电流的标定共选取5个点,首(0)尾(65535/电流电压最大值)及中间的三个点,依次调节至目标值后确认,保存到FLASH中

3、按键
中键(-):非调节模式,长按切换主界面和设置界面,短按进入调节模式;调节模式,长按取消操作,短按确定或下一步
左键(↑)右键(↓):非调节模式,长按切换设置页面,短按主界面电压换挡;调节模式,长按短按均为调节,调节内容不同
二、硬件部分
1、双Type-C母座输入输出
- 同时使用FFC连接线连接D+、D-、CC1、CC2六个引脚,使支持快充

2、SSP9451 DC-DC降压电路(推荐使用MP2456GJ-Z)
- 4.2-40V输入,3.3V输出,给CW32开发板供电,原理图参考MP2451数据手册绘制
- 反馈电压0.794V,由电阻分压可得输出电压为0.794/R1*(R1+R2),取R1=40.2k,R2=124k,得输出电压3.243V≈3.3V
- D2防止独立供电时电压漏到VBUS(参考iDKMeter02C)

3、电压采样电路
- 使用单刀三掷开关进行换挡,三档可调节,量程、12位分辨率如图,D5稳压二极管保护芯片引脚

4、电流采样电路
- 使用4mΩ采样电阻,两端连接INA138高侧测量电流分流监视器
- INA138共模电压最大36V,可检测单向电流大小(双向的型号太贵),反向接入不会造成损伤,增益通过R10+R11配置,公式如图,本电路增益50V/V
- INA138 5号引脚V+ 可接 2.7 ~ 36 V,这里独立3V3供电

5、纹波测量电路(参考iDKMeter02C)
- C8与R14构成高通滤波器,截止频率≈319Hz,R12与R13提供0.794V偏置电压

6、SPI TFT屏幕&SPI FLASH电路


7、按键电路
- 使用100nF电容进行硬件消抖

8、开发板引脚分配
- 先将上述电路在PCB上大致分配好位置,然后参考CW32数据手册(P26-27)分配合适的引脚
- 硬件SPI:PB03、PB04、PB05(SPI1)
- SPI片选及屏幕DC/RES:PA15、PB06、PA10、PA11
- PWM输出(BLK屏幕背光):PA09(GTIM3)
- ADC:PA00(IN0)、PA07(IN7)、PB01(IN9)
- 按键:PB07、PB08、PB09

9、PCB绘制
- 尽量小体积,板框与CW32板大小一致,容阻尽量使用0402封装,部分排母剪断
- Type-C母座一正一反,FFC连接D+D-CC1CC2,降低拉线难度
- 保证VBUS和GND的线宽足够(以前GND都铺铜的,这次没铺,画忘了,后来飞了跟铜线)




10、焊接&组装
- 焊接还是有点难度的,先焊屏幕背面的Type-C,四个固定脚不要焊,再焊两个FFC连接座,然后点锡浆,元件贴片,加热台加热,由于屏幕面有彩色丝印,所以只能烤一次,且时间要短,背面焊完后焊正面Type-C,加固Type-C四个固定脚,然后焊按键及旁边电容,屏幕部分电路的nmos和限流电阻
- CW32开发板正常焊接排针,调试接口排针可不焊,电压电流表板滑动开关侧排母需连塑料壳剪断,对侧排母只需剪断引脚
- 最后焊接屏幕,铁框屏幕需要使用透明胶包住,防短路,背面使用胶粘到OCB上
- 购买5cm长的FFC连接线,两头剪短,插入连接器扣紧,CW32开发板电源输入与电压电流表输入Type-C位于同一侧,排针排母对上即可
- (地线太细,飞一根粗点的铜线)

三、软件部分
1、环境配置
采用CLion开发CW32,CLion界面美观,功能强大,先参考配置CLion用于STM32开发【优雅の嵌入式开发】-- 稚晖君配置出一个STM32的开发环境,CW32F030x8的模板工程放到附件,也可跟随以下步骤配置(步骤会跳步的,细节可百度,也可以对照模板工程的内容理解)
1、按上面贴的链接配置好环境后创建一个STM32工程,进入项目目录,备份.idea文件夹内内容,再在工程把中芯片改为STM32G030C8T6(规格功能类似的芯片),再进入项目目录,还原.idea文件夹,并且删除大部分文件,只保留 [.\.idea\] [.\Core\Startup\] [.\Drivers\CMSIS\Core\] 这三个文件夹中的文件和 [CMakeLists.txt] [STM32xxx_FLASH.ld] 文件
2、然后去CW32官网,下载CW32F030固件库,把其中的 【Libraries】 文件夹里的内容复制到 [.\Drivers\CMSIS\CW32F030_standard_peripheral\] 文件夹中(文件夹名称随意) ,把 【Examples\Template\USER\】 里的内容复制到 [.\Core\] 文件夹 ,把【IdeSupport\MDK\WHXY.CW32F030_DFE.1.0.4.pack】和 【IdeSupport\EWARM\arm\config\debugger\CW\CW32F030.svd】文件复制到工程目录
3、找到 [.\Core\Startup\]中的.s文件,将其改名为startup_cw32f030.s然后打开,对照固件库中的【IdeSupport\MDK\startup_cw32f030.s】进行修改,对比两个文件,修改那些带_Handler的字符串,除了注释为Top of Stack的那一行,其他的按照固件库中的.s文件一一对应
4、找到 [.\STM32xxxx_FLASH.ld]文件,将其改名为CW32F030x8_FLASH.ld然后打开,参考数据手册(P28),修改RAM起始地址0x20000000,长度8K,FLASH起始地址0x00000000,长度64K

5、打开 [.\CMakeLists.txt] 文件,找到 include_directories(xxx) 把STM32库的地址改成CW32的,使前面步骤添加的.h文件都包含在内;下一行是 add_definitions(-DDEBUG xxxx),添加#号将该行注释掉;下一行 file(xxx) 同样修改路径,将前面步骤添加的.c文件都包含在内;下一行set(LINER_SCRIPT xxx)将后面的ld文件名称修改为前面步骤4的名称;下一行在add_link_options后添加一行 add_link_options(--specs=nosys.specs)
6、项目栏右键,重新加载Cmake项目,再点构建,无报错则编译部分成功,下面是下载及调试
7、有miniconda可新建一个python环境,下载pyocd,没有的话也不想折腾可直接下一个python3.7,进行安装
8、在Clion运行/调试配置中,添加 原生应用程序,可执行文件选择pyocd.exe,实参为(可适当修改) flash --target CW32F030C8 --pack=$ProjectFileDir$\WHXY.CW32F030_DFP.1.0.4.pack $ProjectFileDir$\cmake-build-debug\$ProjectName$.hex
9、添加嵌入式GDB服务器,targer remote 为(可适当修改) localhost:65533,GDB服务器为pyocd.exe,GDB服务器实参为 gdbserver -p 65533 --pack=$ProjectFileDir$\WHXY.CW32F030_DFP.1.0.4.pack --target CW32F030C8 -f 10M
10、使用下载或调试功能(需连接下载器),无报错则成功,调试可在外设栏中选择前面步骤的 [CW32F030.svd] 文件(但是看不到寄存器的值,暂时不知道为啥)
2、程序
写程序时,需要参考 CW32F030数据手册,CW32F030用户手册,CW32F030固件库中的例程,各种器件的数据手册,以及问搜索引擎和AI
固件库用起来似乎不如对着手册操作寄存器¿写的时间不同我用的也不一样,代码比较乱
Memory region Used Size Region Size %age Used
RAM: 4440 B 8 KB 54.20%
FLASH: 60792 B 64 KB 92.76%
1、RCC
- 配置PLL为系统时钟,PLL输入参考时钟为HSE(8Mhz),8倍频到64Mhz ,PCLK、HCLK不分频
- 参考用户手册P61,系统时钟切换时需要同步配置FLASH控制寄存器FLASH_CR2.WAIT读等待周期参数:系统时钟频率不大于
24MHz 则应设置FLASH控制寄存器FLASH_CR2.WAIT为0;系统时钟频率大于24MHz 则应设置FLASH
控制寄存器FLASH_CR2.WAIT为1;系统时钟频率大于48MHz 则应设置FLASH控制寄存器FLASH_CR2.
WAIT 为2。
2、ADC
- 参考用户手册(P435-P437),CW32F030的ADC精度为12位,ADC采样 5/6/8/10 个ADCCLK周期,本项目配置为10,逐次比较阶段19 个ADCCLK周期,一次完整转换需要10+19=29个 ADCCLK周期,ADCCLK最大频率在内部1.5V参考电压,3.3V VDDA电压下为4Mhz,设置为最大即PCLK 16分频
- 参考用户手册(P438),CW32F030有多种ADC工作模式,其中单通道多次转换模式可以实现过采样到16位精度,虽然实际达不到,就当作均值滤波了
- 参考用户手册(P441和P458),配置好后启动转换,多次转换成成功后ADC_ISR.EOA自动变为1,可在ADC中断读取累加值,清除累加值,切换通道后可开启下一次转换,为了达到16位,需要采样256次,并将结果除16,计算下来单通道完整转换频率最大可达4Mhz/29/256=538.8Hz,采电压电流则对半,对于本电压电流表来说,应该足够了,代码过长不贴了(工程里还有纹波的采样,但是频率太低了感觉也没太大作用,也不想改代码了就留着了)
3、TIMER
- 总共用到了3个定时器,BTIM1用以外部触发ADC采样,周期100ms,BTIM2用以按键检测,周期10ms,GTIM3用以PWM输出,调节屏幕背光亮度
4、FLASH
- 原本计划使用SPI FLASH,但是似乎能读不能写,不知道哪里出了问题,于是使用CW32的FLASH存储参数
- 参考用户手册(P111-)及数据手册,使用Page127 (0x0000FE00-0x0000FFFF 512Byte) 来存储参数,支持8、16、32bit访问,为了方便直接获取参数结构体的起始地址,每次写32bit,读取参数更简单



5、SPI
- SPI配置不多说了过于简单,由于SPI FLASH没用上,屏幕的CS引脚保持下拉,FLASH的CS引脚保持上拉
- ST7735S屏幕驱动十分简单,基本就是把商家提供的驱动代码改改,可能需要关注一下的命令就是0x36,可以看到这个命令控制了屏幕的显示方向,刷新顺序以及色彩RGB还是BGR

- 基本的显示先使用 Address_Set函数 发送0x2a和0x2b命令 确定显示的区域(,此区域对于不同厂家生产的屏幕可能会有偏移,可以通过加减调节),再发送0x2c储存器写,然后只需要将16位的颜色代码依次发送出去即可按照0x36命令规定的顺序色彩来显示
6、标定功能
- 由4个数组,两个记录ADC转换的值,两个记录对应的电流电压,每个数组有5个元素,首尾是0和65535/电流电压最大值,获取到ADC转换值后进行换算,value小于第一个元素的都为0

7、按键和UI
- 全都是各种if switch 一堆标志变量实现的,乱的不行,好歹是能用
四、问题
1、地线太细、且拉的也有点抽象
2、SSP9451启动电压有点高?不知道是不是设计问题,IN脚4.73V就不能输出3.3V了
3、INA138偏移电压 ±0.2-1mV,小于50mA(大概,没有东西去测量)测不出来
4、电阻设计完全按照1.5V内部参考电压设计的,ADCCLK频率上不去
5、电压测量分三档没太大必要,用不上,分档的话,应该存三组标定数据
6、SPI FLASH写入失败
7、纹波没空写了
8、标定功能,0起始点应多采样一点取最大值
五、项目属性
首次公开,原创,未获奖,未参加过答辩
开源协议:GPL3.0
六、更新
[v1.0]-20240822
- 第一版
设计图
未生成预览图,请在编辑器重新保存一次BOM
暂无BOM
克隆工程知识产权声明&复刻说明
本项目为开源硬件项目,其相关的知识产权归创作者所有。创作者在本平台上传该硬件项目仅供平台用户用于学习交流及研究,不包括任何商业性使用,请勿用于商业售卖或其他盈利性的用途;如您认为本项目涉嫌侵犯了您的相关权益,请点击上方“侵权投诉”按钮,我们将按照嘉立创《侵权投诉与申诉规则》进行处理。
请在进行项目复刻时自行验证电路的可行性,并自行辨别该项目是否对您适用。您对复刻项目的任何后果负责,无论何种情况,本平台将不对您在复刻项目时,遇到的任何因开源项目电路设计问题所导致的直接、间接等损害负责。




评论