网站开发与设计实训心得wordpress弹窗登录
网站开发与设计实训心得,wordpress弹窗登录,如何用dw做网站,档案馆网站安全建设基于立创地文星CW32F030的DIY数字电压电流表#xff1a;从硬件设计到软件滤波与标定的完整实现
最近有不少朋友问我#xff0c;想自己动手做一个实用的数字电压电流表#xff0c;既能学习嵌入式开发#xff0c;又能得到一个桌面上的实用工具。今天#xff0c;我就带大家从…基于立创·地文星CW32F030的DIY数字电压电流表从硬件设计到软件滤波与标定的完整实现最近有不少朋友问我想自己动手做一个实用的数字电压电流表既能学习嵌入式开发又能得到一个桌面上的实用工具。今天我就带大家从零开始用立创EDA和CW32F030C8T6核心板完整地走一遍这个项目。咱们不光要把它做出来还要搞清楚背后的原理比如怎么用ADC采样、怎么用软件滤波让读数更稳以及最关键的一步——如何通过标定让测量结果更准。这个项目非常适合电子爱好者和嵌入式初学者涵盖了电路设计、单片机编程、信号处理等多个知识点。跟着做下来你不仅能收获一个自己做的仪表更能掌握一套完整的嵌入式系统开发思路。1. 硬件设计从供电到采样一个都不能少做硬件供电是头等大事。咱们这个表头设计上要能适应工业场景比如24V甚至36V的供电环境所以电源部分得好好设计。1.1 稳定可靠的供电电路为了应对高输入电压我选择了SE8550K2这颗LDO低压差线性稳压器它能承受最高40V的输入电压输出稳定的5V给整个系统。为什么不用效率更高的DCDC呢主要是为了避免开关电源带来的纹波干扰影响我们ADC采样的精度而且LDO方案成本也更低。注意LDO在高输入电压、大压差时发热会比较严重需要在设计时考虑散热。为了防止电源接反烧坏板子我在电源入口串联了一个肖特基二极管D41N5819来做防反接。肖特基二极管的特点是正向压降低约0.2V在咱们这个通常高于5V供电的场景下这点压降可以忽略不计但如果你的供电电压本身就接近5V就得注意这0.2V的损耗了。电路里还有个10Ω的小电阻R8它的作用可不少分担压差减少发热在高电压输入时它和LDO分担压降避免LDO独自承受过大压差而过热。充当“保险丝”当过流或短路时这个小功率电阻会因发热而烧断开路从而保护后级电路。电阻的故障模式基本就是开路很安全。抑制上电冲击和谐振能减缓上电瞬间的电流冲击保护LDO。同时如果电路中有陶瓷电容ESR很小它与导线的电感可能形成谐振加入这个电阻可以提供阻尼抑制谐振。1.2 核心MCU为什么选CW32F030主控我用的是立创·地文星CW32F030C8T6开发板。对于初学者来说核心板比从头画最小系统要友好得多。选它不只是因为方便更是看中了它在测量应用上的优势宽电压工作1.65V~5.5V比一些只能3.3V工作的芯片更灵活。抗干扰能力强HBM ESD达到8KV可靠性高。ADC性能出色这是做电压电流表的关键CW32的12位ADC线性度好±1.0LSB INL有效位数高约11.3位。最厉害的是它内部有4路可选的参考电压源1.5V, 2.0V, 2.5V, 3.0V而很多同类芯片只能用电源电压VDD作参考这在测量精度和量程设计上给了我们很大的自由度。1.3 电压采样电路如何安全地测量高电压咱们要测的电压可能高达30V甚至更高但MCU的ADC引脚只能承受3.3V左右的电压。怎么办用电阻分压。如图所示我用了220KR6和10KR7两个电阻进行分压分压比是22:1。这样30V的输入电压经过分压后到ADC引脚ADC_IN11就变成了大约1.36V在ADC的测量范围内。分压电阻怎么选这里有个实用的选型思路确定最大测量电压比如咱们设计最大测30V。确定ADC参考电压CW32可以选比如用内部的1.5V基准。选择低侧电阻为了降低采样电路功耗通常选10K。计算高侧电阻分压比 Vref / Vmax 1.5V / 30V 0.05。高侧电阻 低侧电阻 / 分压比 10K / 0.05 200K。选择标准电阻计算值是200K在E24系列标准值里我们选最接近且略大的220K留点余量更安全。如果想提高某个量程内的测量精度可以调整电阻。比如你只测24V以内的电压可以把高侧电阻换成160K或180K这样ADC的输入电压更接近满量程分辨率利用率更高。保护措施二极管钳位为了防止调试时误接高压损坏芯片我在ADC输入引脚对地接了一个1N4148二极管D1。当输入电压超过VCC约3.3V加上二极管压降约0.7V时二极管会导通将电压钳位在安全范围就像给引脚加了个“安全阀”。1.4 电流采样电路测量电流的本质是测量电压电流不能直接测量我们通过测量一个已知电阻采样电阻两端的电压降再利用欧姆定律I V / R算出电流。这种方法叫“低侧采样”即采样电阻放在负载和地之间。我选择了一颗100mΩ0.1欧姆的金属绕线电阻R0作为采样电阻功率是1W。为什么选这个值测量范围设计最大测3A电流。压降计算3A * 0.1Ω 0.3V (300mV)。这个电压对于ADC来说信号幅度足够又不会产生过大的功耗和压降影响被测电路。功耗与温升电阻上的功耗 P I² * R 3A * 3A * 0.1Ω 0.9W。选用1W封装的电阻有足够的功率余量避免过热。1.5 人机交互数码管、LED和按键数码管显示用了两个0.28寸的三位共阴数码管。数码管在强光下比LCD更清晰也更皮实。限流电阻R1-R6我选的是300Ω实测亮度适中不刺眼。这里有个小技巧严格来说限流电阻应该加在每个段a, b, c...上但为了省元件我把电阻加在了位选COM端对显示效果影响不大。指示灯一个电源指示灯常亮一个IO工作指示灯闪烁。注意CW32的IO口灌电流电流流入芯片能力通常比拉电流电流从芯片流出强所以我把LED的阳极接VCC阴极通过电阻接IO。当IO输出低电平时LED点亮。按键电路得益于CW32的IO内部可以配置上拉电阻外围电路极其简单按键一端接IO一端接地。按键按下IO被拉低程序检测到这个低电平就知道按键被按下了。1.6 校准利器TL431基准电压源虽然CW32内部的ADC基准已经很准了但板子上我还是画了一个TL431电路输出一个非常稳定的2.5V基准电压。TL431是一个“精密可编程基准源”精度很高我用的型号是±0.5%。这个电路主要有两个用途学习了解基准源电路是如何工作的。备用如果你对精度要求极高或者想验证内部基准的稳定性可以切换到外部TL431基准进行测量。2. 软件设计让硬件“活”起来硬件搭好了接下来就是写程序让它工作。咱们从最简单的点灯开始一步步增加功能。2.1 基础实验驱动外设在进入核心的测量功能前需要先打好基础。原始资料提供了几个实验的代码链接在对应的小节建议大家按顺序学习实验一点亮LED- 学习GPIO输出控制。实验二按键测试- 学习GPIO输入和按键消抖。实验三 四数码管显示- 学习数码管的静态和动态扫描驱动。动态扫描是让多个数码管“轮流”点亮利用人眼视觉暂留形成稳定显示。2.2 核心实验五ADC采样这是电压电流表的核心。CW32的ADC配置起来不算复杂但有些关键点要注意// ADC初始化配置示例关键步骤 void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStruct {0}; // 1. 使能ADC时钟 RCC_AHBPeriphClk_Enable(RCC_AHB_PERIPH_ADC, ENABLE); // 2. 基本参数配置 ADC_InitStruct.ADC_ClkDiv ADC_ClkDiv_16; // ADC时钟分频 ADC_InitStruct.ADC_SampTime ADC_SampTime_10Cyc5; // 采样时间 ADC_InitStruct.ADC_Vref ADC_Vref_1500MV; // 选择1.5V内部参考电压 ADC_InitStruct.ADC_AccEn ADC_AccEn_Enable; // 使能累加器用于过采样或均值 ADC_InitStruct.ADC_Align ADC_Align_Right; // 数据右对齐 ADC_Init(ADC, ADC_InitStruct); // 3. 配置采样通道例如电压通道ADC_IN11 ADC_ChannelCfg(ADC, ADC_CHANNEL_11, ADC_SampTime_10Cyc5); // 4. 使能ADC ADC_Enable(ADC, ENABLE); // 5. 开始转换 ADC_Start(ADC); }配置好后在定时器中断里定期读取ADC值然后根据分压比换算成实际电压实际电压 (ADC原始值 / 4095) * 参考电压 * (分压电阻总和 / 低侧电阻)第一次采样显示的值可能不准这是因为还有系统误差需要后面的滤波和标定来修正。2.3 关键实验六均值滤波让读数更稳定直接从ADC读出来的值往往会跳动这是因为存在各种噪声干扰。我们需要用软件算法进行“滤波”。滤波算法有很多种原始资料里列举了9种咱们这个项目用的是“中位值平均滤波法”也叫“防脉冲干扰平均滤波法”。它的思想很简单连续采样N次去掉一个最大值和一个最小值然后对剩下的N-2个值求平均。这样既能平滑随机波动又能抵抗偶然的突发干扰脉冲。下面是具体的实现代码#define ADC_SAMPLE_SIZE (20) // 采样20次 uint16_t Volt_Buffer[ADC_SAMPLE_SIZE]; // 存储ADC值的数组 // 均值滤波函数 uint32_t Mean_Value_Filter(uint16_t *value, uint32_t size) { uint32_t sum 0; uint16_t max 0; uint16_t min 0xFFFF; // 先设为最大值 int i; // 遍历数组同时求和并找出最大、最小值 for(i 0; i size; i) { sum value[i]; if(value[i] max) { max value[i]; } if(value[i] min) { min value[i]; } } // 减去最大值和最小值后求剩余数据的平均值 sum - (max min); sum sum / (size - 2); return sum; }在主循环中我们每隔300ms调用一次这个滤波函数然后用滤波后的值去更新数码管显示。300ms的间隔既能保证显示稳定不闪烁又能及时反映测量值的变化。while(1) { if(GetTick() (Led_Dis_Time 300)) // 每300ms更新一次 { Led_Dis_Time GetTick(); // 1. 对原始ADC数组进行滤波 Cal_Buffer Mean_Value_Filter(Volt_Buffer, ADC_SAMPLE_SIZE); // 2. 将滤波后的ADC值转换为电压值这里省略了具体换算 // 3. 更新数码管显示 Dynamic_Display(Cal_Buffer); } }经过滤波处理后数码管上显示的数字就稳定多了不再乱跳。2.4 实验七 八双通道采集与显示实验七是练习用电流采样通道ADC_IN12来测量一个模拟的电压信号目的是验证ADC的性能。实验八则是将前面所有功能整合同时采集电压和电流并在两个数码管上分别显示这已经是一个简易电压电流表的雏形了。2.5 终极实验九带有标定功能的数字电压电流表滤波解决了读数“稳”的问题标定则是解决读数“准”的问题。由于电阻精度、运放偏移、ADC本身误差等因素我们计算出的理论值和实际值总有偏差。标定就是用已知的、准确的标准值去修正我们系统的测量值。2.5.1 标定原理两点确定一条直线ADC测量是一个将模拟量电压Y转换为数字量AD值X的过程。理想情况下它们应该是完美的线性关系Y k * X b。其中k是斜率b是零点偏移。标定就是通过测量两个已知的标准点来求出这条直线的k和b。零点标定输入0V或0A记录下此时的AD值X0。理论上对应的物理量Y0 0。满量程点标定输入一个已知的准确电压比如5.00V记录下此时的AD值X5。计算斜率kk (Y5 - Y0) / (X5 - X0) 5.00 / (X5 - X0)测量计算以后任何时刻测到一个AD值X对应的真实电压就是Y k * (X - X0)。为了提高精度我们可以做多点标定比如在0V、5V、15V三个点进行标定。这样在0-5V区间用一条直线5-15V区间用另一条直线斜率可能不同测量就更准了。2.5.2 代码实现与操作例程里实现了3点标定电压0V, 5V, 15V电流0A, 0.5A, 1.5A。关键函数是计算斜率ComputeK()和保存标定数据到Flash的save_calibration()。操作是通过板子上的三个按键完成的K1键循环切换5种工作模式。K2键在当前模式下将当前的ADC采样值经过滤波保存为标定点。K3键返回正常的测量显示模式模式0。具体标定操作步骤准备你需要一个精确的电压源/电流源或者一个高精度的万用表作为参考。进入标定模式按K1键切换到模式1显示5.05.表示准备标定5V电压点。施加标准信号给电压测量端输入精确的5.00V电压。保存标定点按下K2键MCU会读取当前的ADC值将其作为5V标定点存入Flash并自动计算新的斜率。重复用K1切换到模式215V标定、模式30.5A标定、模式41.5A标定重复步骤3-4。完成所有点标定完成后按K3键返回模式0。现在你的电压电流表就会根据新的标定参数显示精度大大提升。标定数据保存在MCU的Flash里断电也不会丢失。以后如果需要重新标定重复上述步骤即可。3. 动手与调试心得这个项目从画原理图、焊板子到写代码、调试涉及的知识点很全。这里分享几个我调试时遇到的“坑”ADC读数跳动大最开始没加滤波显示的数字总在跳。加上均值滤波后立刻稳定了。滤波次数ADC_SAMPLE_SIZE不是越大越好次数太多会导致响应变慢。20次对于这个仪表来说是个不错的平衡点。测量值始终有偏差这就是标定要解决的问题。即使你电阻选得再准理论计算和实际值也会有出入。一定要做标定这是提高测量精度的最关键一步。电流采样电阻发热如果长时间测量大电流100mΩ/1W的电阻也会发热电阻值会随温度变化引入误差。在实际产品中可能需要选用功率更大或温漂更小的采样电阻。CW32的ADC参考电压选择这是CW32的一大特色。在ADC_InitStruct.ADC_Vref里可以根据你的测量范围灵活选择1.5V、2V、2.5V或3V的内部参考。选择更接近你最大输入信号电压的参考源可以获得更好的分辨率。好了关于这个DIY数字电压电流表的全部内容就讲到这里。从硬件选型、电路设计到软件驱动、滤波算法再到最后的标定校准我们完成了一个完整的测量仪器开发流程。希望这个教程能帮你不仅做出一个工具更能理解背后的原理。剩下的就是拿起烙铁和代码编辑器开始你的创作吧