从历史上讲,它对于STM32F030系列来说对我来说不可行,大约5年前我尝试与他们合作,很长时间以来,对于大多数外围设备的笨拙工作感到惊讶,然后对其评分。 前几天,我仍然必须回到这个系列,有必要以最少的钱来测量铅蓄电池(或最多4个串联的组件)上8至60V的恒定电压,且精度不低于±0.1V(低轮询频率)。
解决“正面问题”后,才有可能仅在ADC输入的值大于1.5到1.6V,即仅在范围的后半部分时才准确测量电压,这对我来说意味着30到60V,而不是所需的8。 .60V。 主要问题是在0 ... 1.6V的范围内,这一切都好像我的分压器在“浮动”,或者ADC的参考电压(V
ref )极其不稳定。
尽管不是以最优雅的方式,但至少没有明显的拐杖,必须迅速解决问题。 为此,首先必须研究问题并了解“腿部成长”的根源,然后消除该问题。 如果无法解决问题,则至少要绕开它,以便最终获得可使用的设备并将其发送给客户。

任务的实质
总的来说,很长一段时间以来,我一直在努力解决这个小问题,但后来有一位亲戚走近我,并兼职一个好人,他也从事与我很接近的话题-他在莫斯科地区某处收集了小型SES。 我不想拒绝,即使在那一刻,这个任务在我看来还是“几个小时的铁+几个小时的代码”。 Altium Designer中的项目确实花了我几个小时,但与ADC的争斗整夜都吃尽了,所以我决定共享信息,以免其他人浪费时间。
设备本身非常简单,算法如下:- 测量1 ... 4个串联铅蓄电池组件上的电压;
- 如果电压小于“下限阈值”,则关闭继电器并打开发电机,为我们的电池充电;
- 如果电压上升到“下阈值+滞后”以上,即电池已充电至设定的阈值,则关闭发电机;
- 如果电压高于“上限阈值”,则我们禁止打开发电机,以防万一。
仅此而已! 示例:一个12V电池,逆变器由它供电。 如果电压下降到“下阈值”以下,则默认值为10.2V,然后打开发电机。 如果电池上的电压已增加到“较低的阈值+滞后”,则将其关闭。 默认情况下,将磁滞设置为2V,这是必需的,以便汽油发电机在将电池稍微充电到10.3V时不会立即关闭。 从恒定的开/关,发生器将简单地死掉。 好吧,以防万一,保护:如果电池上的电压高于14.4V,则不要完全打开发电机。
该算法简单明了;此外,有必要制作一个小菜单,以便可以更改三个变量:“下阈值”,“滞后”,“上阈值”。 没什么复杂的,但细节在于魔鬼。
最初,亲戚工作的公司使用功能相似的中文设备。 在次要缺点中-无法更改磁滞,因为电源需要额外的5V电源和仅为30V的测量值,也就是说,只能使用1或2个电池。
最大的缺点-中国装置有时会在其控制的汽油发电机启动时冻结并重新启动。 最后的“特征”刚成为试图放弃中国决定的原因。
他们想从我这里消除所有这些弊端,而且设备的价格就像中国人的价格一样,即10美元。 在这种情况下,“琐碎的琐事”是他们想从我这里以10美元的价格购买成品设备,每批20-30件,尽管它很稳定而且经常够用。 也就是说,我不得不小批量生产该设备,使其比中国人更好,更便宜,我将来也需要赚钱。 是的,我在开始的前十分钟也很有趣,但是当我意识到这种情况时,我已经说了“是”,也就是说,伏尔加河对我来说没有土地……
解决铁问题
就像我在上面写的,主要问题是在发电机启动期间设备的不稳定运行。 结果,购买了带有速卖通的中国设备进行测试和研究。 发生``磁头拆卸''的主要原因不是在发电机中,而是在继电器中:))在切换电源时,振幅约为25V的脉冲通过3.3V总线,这暗示了...干扰也流到了信号电路。 为了解决这一问题,在中国电路中,放置了LL4148二极管,它们阻塞了干扰路径。 事实证明,这足以使设备在桌面上正常工作,但在大量外部附加干扰(如发电机和其他设备)中却不足。 为了永久摆脱上述情况,我决定通过一堆“光耦合器+ dc / dc”使用
电流隔离 ,从而完全消除了电接触以及控制继电器线圈与电路其余部分之间的干扰路径。

该解决方案的替代方案是使用保护性TVS二极管以及共模扼流圈,以及电源滤波器的复杂性。 但是为什么要这样一个集体农场呢? 放置dc / dc更容易,但实际上却更便宜-中国模块Mornsun B0505S-1WR2的成本为0.4美元,每小批共模扼流圈的成本约为0.32美元。
结果,经过这样的决定和原型测试,该设备开始作为卡拉什尼科夫突击步枪工作,并且重新启动的问题消失了。 总的来说,我对继电器和发电机仍然被迫重新启动stm-ku感到有些惊讶,从原理上讲,中国的开发人员做得很好:10 kOhm + 0.1 uF复位,阻塞了电容器的电源,铁氧体磁珠,一切正常,但结果还是一样还不够
“中文”的第二个缺点是需要额外的电源,显然可以节省直流/直流电。 我解决了额头上的问题-我直接从一个连接器的输入信号中获取电源。 为此,您只需要放置dc / dc,它将消化至少4 * 14.4V,即57.6V。 我的选择落在LMR16010PDDAR上。 首先,这是德克萨斯州,仅此而已。 其次,亚洲同志建议我非常便宜地携带该芯片。
上一段全面确定了第三个减号-最多可串联连接4个电池的能力。 DC / DC容易吸收60V,仅尝试在72 ... 73V时烧尽,因此最大57.6V绝对对他来说并不可怕。 通常,分压器并不关心输入端有多少,因此,只需花费很少的精力即可决定所有事情。
您可以在此处的图表
-PDF中查看如何实现所有这些功能。 该方案足够大,所以我没有用图片填充它。 顺便说一句,在pdf中,您还可以看到印刷电路板的尺寸,但是没有什么超自然的。
结果,在第一批测试中订购了10个设备的组件,组装后结果如下:

并非没有意外-当我为dc / dc模块创建组件时,我将支脚1和2混合在一起,不得不做些小工作。 尽管我在随后的板上进行了更仔细的操作,以至于没有人注意到,但照片中的板仍然作为调试工具与我一起使用,以防万一或在客户在测试过程中提出某些建议时进行软件改进。
对抗ADC精度
现在,让我们继续本文的主要部分。 正如我在本文开头所写的那样,F030 ADC的结果是不准确的,即在设备输入端达到30 ... 32V的电压时,读数浮动的偏差最大为15 ... 20%,然后误差平稳地消失了。 一件令我高兴的事情-乍一看,偏差有一定规律性,这意味着这不是一个随机错误,您可以跟踪它并尝试对其进行纠正。
让我们对错误进行一些详细说明。转换之后,ADC将原始数据发送到
DR寄存器,该寄存器包含0到4095(2
12 )之间的值。 要将这个值转换为电压,您需要将其乘以量化步骤。 在我的情况下,ADC作为支撑的VDDA引脚上的电压为3.3072V,因此,步长为3.3072V / 4096 = 0.000807V,我将其舍入为0.0008。 为了获得设备输入端的电压,必须将获得的电压乘以分压器的系数,在我的情况下,上臂的电阻为100 kOhm,下臂的电阻为4.7 kOhm,分压器为22.2765。 基于此,可以使用以下公式找到设备输入端的电压,即电池电压:
float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = (float)adcData * voltageReference * voltageDivider;
事实证明,在读取数据
ADC1-> DR之后 ,它们被转换为
float类型,并简单地乘以系数(即常数),然后得到通常的伏特数。 在实践中,事实证明一切都非常糟糕。
记得汉隆的剃刀,我开始寻找我犯错的地方。 首先,我检查了VDDA脚上的电压,我认为它以某种方式浮动并取决于输入电压,例如LDO有故障。 他用台式万用表武装,监视VDDA上的电压并将输入电压从8V更改为60V,而VDDA脚上的电压保持在3.3072V不变,只有以下两个符号浮动,这对于10美分的线性仪表非常好。
潜在错误的下一个地方是分压器。 尽管对我来说奇怪的是,Bourns的电阻器浮动为±0.1%,所以数据的误差高达20%,并且该误差是非线性的。 我进行了相同的实验:我用万用表测量了分压器之后的电压,并以0.5V的步长改变了输入电压,结果,分压器系数也被固定为22.2768。
在那一刻,它开始变得有趣。 我只有一个组件值得怀疑-LMV611MFX运算放大器。 该运算放大器包含在电压跟随器中。 之前和之后的电压相同,直到小数点后四位。 奇怪...根据数据表,这还不错,并且与TI相同,我对此表示怀疑,但决定对其进行检查,因为 这是从未使用过的运算放大器。 以防万一,我最喜欢的并在大量的OPA320项目中进行了测试,我在线圈中焊接了他的位置,并且他显示了相同的结果。
最后一个组成部分-MK,即其ADC。 在使用STM的多年中,我习惯于信任他们的产品,尤其是因为我只拿原始照片,所以我最后想到了MK。 我想到的第一件事是我忘记校准或做错了。 他们在参考手册中很有用,不仅要求通过将0写入
ADEN位来降低ADC的
功耗 ,而且还要求将
ADDIS位设置为1并将
DMAEN位设置为0。 最后两个步骤尚未执行,通常我会关闭ADC并一切正常,结果,我通过校准纠正了一段代码:
if (ADC1->CR & ADC_CR_ADEN) { ADC1->CR |= ADC_CR_ADDIS; while (ADC1->CR & ADC_CR_ADEN) {} } ADC1->CR |= ADC_CR_ADCAL; while(ADC1->CR & ADC_CR_ADCAL) {} ADC1->CFGR2 = 0; ADC1->CR = ADC_CR_ADEN; while(!(ADC1->ISR & ADC_ISR_ADRDY));
不幸的是,它无济于事,决定进行以下实验……我已经检查了系数,并且它们都是100%正确,所以我将实验室电源上的电压施加到输入上,进行更改,并将ADC测量的原始结果显示在七段指示器上,然后将其与实际值进行比较与您真正测量的结果在一起。 结果,我收到了以下结果:

如您所见,理论图具有出色的线性度,因为 不附在铁上。 基于实际数据的图形也几乎是线性的,偏差很小。 实际上,具有实际数据的图可以通过并行传输到某个常数来与理论图组合。 用电子语言来说,
ADC有一个偏移量!根据构建图表的数据,我发现ADC在71 ... 73步长的不同点处具有偏移。 那就是问题所在,我认为这是“非线性”的,因为在10V时71步的偏移约为14%,而在30V时已经是4%。 就是说,如果您构建一个以%为单位的偏差图,则相关性将具有指数形式,但是这样的图并不有趣。
为了确定结果,决定尝试在公式中引入另一个变量,该变量会将我的值上移并具有以下形式:
uint16_t offsetVoltage = 72; float voltageReference = 0.0008; float voltageDivider = 22.2765; adcVoltageResult = ((float)(adcData+offsetVoltage))*voltageReference*voltageDivider;
经过这些简单的操作,我的设备开始准确测量电压,并且数据不再浮动。 在此之前,它处于
72 * 0.0008V * 22.2768 = 1.28V的水平 ,这对于控制一个电池非常关键。 铅电池当然不会像锂离子电池那样爆炸,但仍然会迅速崩溃,尤其是如果不是持续放电至10.2V,而是持续放电至8.92V。
这是关于一小块铁的小故事。 我希望有人会觉得这些材料有用或至少只是有趣的阅读。 注意所有这些ADC和其他讨厌的东西:))
UPD olartamonov非常热心地要求不要愚弄人,并使用参考手册中的校准代码-
轻松进行更改。 不幸的是,就我而言,这并没有改变局势,这种转移也没有任何进展。 问题可能出在芯片本身上。
国务院指示扔假冒产品比赛项目
PCBway同志
之间 正在进行 技术项目之间的 竞争 ,任何人都可以参加。 规则很简单。 您项目的印刷电路板将免费提供。 最重要的是奖品! 这些是与美国先生们一起使用的一些绿皮书,上面有您的贝宝+虚拟货币,您可以为此订购印刷电路板+荣誉和尊重+机会在CIS以外的地方获得工作机会:))我特别建议学生参加,那里的技术水平不太高,尽管从过去的比赛经验来看,有非常强大的项目,所以“强大”的DIY盒子可以轻松进入获胜者!