STM32F030でジェネレーターまたはADCとの戦いを制御します

歴史的に、STM32F030ファミリではうまくいきませんでした。約5年前、私はそれらを使用しようとしましたが、ほとんどの周辺機器の不器用な作業に長い間驚いていました。 そして先日、私はまだこのシリーズに戻らなければなりませんでしたが、低いポーリング周波数で±0.1V以下の精度で8〜60Vの鉛電池(または直列で最大4個のアセンブリ)の定電圧を最小限のお金で測定する必要がありました。



「正面」問題の解決策により、ADC入力の値が1.5〜1.6Vを超える場合、つまり範囲の後半のみで電圧を正確に測定することができました。つまり、必要な8ではなく30〜60Vでした。 .60V。 主な問題は0〜1.6Vの範囲で、すべて分圧器が「フローティング」しているか、ADCの基準電圧(V ref )が非常に不安定であるように見えました。



最もエレガントな方法ではありませんが、少なくとも明白な松葉杖を使わずに、問題を迅速に解決する必要がありました。 これを行うには、まず問題を調査し、「脚が成長する場所」を理解してから、この問題を排除する必要がありました。 うまくいかない場合は、少なくとも動作するデバイスを入手して顧客に送信するために、少なくとも回避してください。







タスクの本質



一般に、私は長い間そのような些細なことをやろうとはしていませんでしたが、親relativeが私に近づき、パートタイムで私の近くのトピックにも取り組んでいます。 私は拒否したくありませんでしたが、その瞬間でさえ、このタスクは「鉄の数時間+コードの数時間」に思えました。 Altium Designerでのプロジェクトは本当に数時間かかりましたが、ADCとの戦いは一晩中食べられたので、他の人が時間を無駄にしないように情報を共有することにしました。



デバイス自体は非常にシンプルで、アルゴリズムは次のとおりです。





それだけです! 例:12V用のバッテリーが1つあり、インバーターから電力が供給されます。 電圧が「下限しきい値」を下回ると、デフォルトは10.2Vになり、発電機をオンにします。 バッテリーの電圧が「下限しきい値+ヒステリシス」まで上昇した場合は、オフにします。 デフォルトでは、ヒステリシスは2Vに設定されており、バッテリーをわずかに10.3Vに充電してもガソリンジェネレーターが停止しないように必要です。 一定のオン/オフから、発電機は単に死にます。 まあ、念のため、バッテリーの電圧が14.4Vを超えている場合は、発電機を正確にオンにしないでください。



アルゴリズムはシンプルで簡単です。さらに、「下限しきい値」、「ヒステリシス」、「上限しきい値」の3つの変数を変更できるように、小さなメニューを作成する必要がありました。 複雑なことは何もありませんが、悪魔は細部に宿っています。



当初、親relativeの会社は、同様の機能を持つ中国のデバイスを使用していました。 軽微な欠点のうち、ヒステリシスを変更することは不可能でした。これは、電源に5 Vの追加電源と30 Vの測定値が必要なため、つまり、1つまたは2つのバッテリーの場合です。 大きなマイナス点-中国のデバイスは、それが制御したガソリン発電機の起動時にフリーズして再起動することがあります。 後者の「機能」は、まさに中国のソリューションを放棄しようとする理由でした。



彼らは私からこれらすべての不利な点を取り除き、デバイスの価格が中国の価格、つまり10ドルであったことを望んでいました。 この場合の「悪魔のような些細なこと」とは、安定していて十分な場合もあるが、完成したデバイスを20〜30個のバッチで10ドルで購入したかったということです。 つまり、小さなシリーズでは、デバイスを中国人よりもはるかに優れたものにし、非常に安くしなければなりませんでしたが、将来的にお金を稼ぐ必要もあります。 ええ、私も最初の10分間は面白かったのですが、この状況に気づいたときには、すでに「はい」と言っていました。つまり、ヴォルガ以外に土地はありませんでした。



鉄の問題を解決する



上記で書いたように、主な問題は、発電機の起動中のデバイスの不安定な動作です。 その結果、aliexpressを搭載した中国製デバイスがテストおよび研究用に購入されました。 「ヘッドの解体」の主な理由は、発電機ではなくリレーにありました:))電源を切り替えたときに、約25Vの振幅のパルスが3.3Vバスを通過しました。これは一種のヒントになります...同じことが信号回路にも行きました。 中国のスキームでは、このような問題に対処するために、LL4148ダイオードが立っていました。このタイプは干渉の経路をブロックしました。 これは、デバイスがテーブル上で正常に動作するのに十分であることが判明しましたが、発電機やその他の機器などの外部の追加干渉の山ではありませんでした。 上記の問題を完全に取り除くために、私は「オプトカプラー+ dc / dc」の束を通してガルバニック絶縁を使用することにしました。







このソリューションの代替策は、保護TVSダイオードとコモンモードチョークの使用、およびパワーフィルターの複雑化でした。 しかし、なぜそのような集団農場なのでしょうか? DC / DCの配置は簡単ですが、実際にはさらに安くなりました-中国のモジュールMornsun B0505​​S-1WR2のコストは0.4ドルで、小さなバッチあたりのコモンモードチョークのコストは約0.32ドルでした。



その結果、そのようなソリューションとプロトタイプのテストの後、デバイスはカラシニコフ突撃ライフルとして機能し始め、再起動の問題はなくなりました。 一般に、リレー+ジェネレーターがまだstm-kuをリブートすることを余儀なくされたことに少し驚いています。中国の開発者は原則としてすべてをうまく行いました。十分ではありません。



「中国語」の2番目のマイナスは、追加の電力の必要性であり、明らかにDC / DCで節約されました。 私は額の問題を解決しました-1つのコネクタから直接、入力信号から電力を得ました。 これを行うには、少なくとも4 * 14.4V、つまり57.6Vを消化するdc / dcを配置する必要がありました。 私の選択はLMR16010PDDARでした。 まず、これはテキサス州であり、それだけです。 第二に、アジアの同志は、私がこのチップを非常に安く携帯することを提案しました。



前の段落では、3番目のマイナス(最大4個のバッテリーを直列に接続する能力)を包括的に決定しました。 DC / DCは60Vを簡単に消化し、72 ... 73Vでのみ燃え尽きるので、最大57.6Vは間違いなく彼にとって怖いものではありません。 一般に、分圧器は入力の大きさを気にしないため、すべてを最小限の労力で決定しました。



これらすべてがどのように実装されているかは、図PDFで確認できます。 スキームは十分に大きいので、私はそれを絵で埋めませんでした。 ちなみに、pdfではプリント基板の寸法も見ることができますが、超自然的なものは何もありません。



その結果、10個のデバイスのコンポーネントが最初のテストバッチ用に注文され、組み立て後に次のようになりました。







偶然ではありませんでした。DC/ DCモジュールのコンポーネントを作成したときに、レッグ1とレッグ2を所定の場所で混同した場合、小さな農場を利用する必要がありました。 誰も気付かないように後続のボードでより慎重に行いましたが、写真のボードは、お客様がテスト中に何かを思いついた場合に備えて、またはソフトウェアの改善のためにデバッグツールとして残っています。



ADC精度との戦い



それでは、記事の主要部分に移りましょう。 記事の冒頭で書いたように、F030 ADCは不正確であることが判明しました。つまり、デバイスの入力で最大30〜32Vの電圧まで、測定値は最大15〜20%の偏差で浮動し、その後エラーはスムーズに消えました。 一つのことは私を喜ばせました-一見すると、偏差には一定の規則性がありました。これはランダムなエラーではなく、追跡して修正を試みることができることを意味します。



エラーについてもう少し詳しく見てみましょう...変換後、ADCは0〜4095(2 12 )の値を含む生データをDRレジスタに送信します。 この値を電圧に変換するには、量子化ステップを乗算する必要があります。 私の場合、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の電圧を監視し、入力電圧を8から60 Vに変更しましたが、VDDAのレッグの電圧は3.3072 Vで停止したままで、次の2つの兆候だけが浮いており、10セントのリニアゲージに非常に適しています。



潜在的なエラーの次の場所は、分圧器でした。 Bourns抵抗器±0.1%がフロートし、データに最大20%の誤差があり、この誤差は非線形であるというのは奇妙に思えましたが。 同じ実験を行った。分圧器の後の電圧をマルチメーターで測定し、入力電圧を0.5Vステップで変更し、その結果、分圧係数も22.2768にしっかりと固定された。



その瞬間、それは面白くなり始めました。 疑わしいコンポーネントは1つだけでした-LMV611MFXオペアンプ。 このオペアンプは、電圧フォロワとして含まれています。 前後の電圧は、小数点以下4桁まで同じでした。 奇妙な...データシートによると、それは悪くなく、それでも同じTIです。私はそれを疑いましたが、それをチェックすることに決めました。 使用されていないこのオペアンプです。 念のため、私のお気に入りであり、コイルにあるOPA320プロジェクトのヒープでテストし、彼の代わりにはんだ付けし、彼は同じ結果を示しました。



最後のコンポーネント-MK、つまりそのADCが残りました。 STMを長年使用してきたので、私は彼らの製品を信頼することに慣れていました。 最初に考えたのは、キャリブレーションを忘れたか、間違ったことでした。 リファレンスマニュアルで役立ちますが、 ADENビットにゼロを書き込むことでADCをカットするだけでなく、 ADDISに 1を設定し、 DMAENに0を設定することを要求ました 。 最後の2つの手順は実行されていません。通常、ADCを削減し、すべてが正常に機能するため、キャリブレーションでコードを修正しました。



  /* disable ADC */ if (ADC1->CR & ADC_CR_ADEN) { ADC1->CR |= ADC_CR_ADDIS; while (ADC1->CR & ADC_CR_ADEN) {} } /* calibrate ADC */ ADC1->CR |= ADC_CR_ADCAL; while(ADC1->CR & ADC_CR_ADCAL) {} /* reset configuration */ ADC1->CFGR2 = 0; /* enable device */ ADC1->CR = ADC_CR_ADEN; while(!(ADC1->ISR & ADC_ISR_ADRDY));
      
      





残念ながら、それは役に立たず、次の実験を実施することに決めました...私はすでに係数をチェックしており、それらは100%正しいので、実験室の電源から入力に電圧を印加し、それを変更し、7セグメントインジケータで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であり、これは1つのバッテリーを制御する場合に非常に重要です。 鉛バッテリーは確かにリチウムイオンのように爆発することはありませんが、特に10.2Vではなく8.92Vに絶えず放電される場合は、依然として急速にクラッシュします。



これは小さな鉄片についてのそんな小さな話です。 誰かがこの資料が役に立つか、少なくとも読むだけで面白いと思うことを願っています。 これらすべてのADCと他の厄介なことに注意してください:))



UPD。 olartamonovは、人をだますことなく、リファレンスマニュアルのキャリブレーションコードを使用することを非常に熱心に求めています。喜んで変更を行いました。 残念ながら、私の場合、これは状況を変えず、シフトは消えませんでした。 おそらく、問題はチップ自体にあります。 国務省の指示通りに偽造品を投げた



競争



PCBwayの仲間同士で技術プロジェクト間競争が行われています。誰でも参加できます。 ルールは簡単です。 プロジェクトのプリント基板は無料で提供されます。 そして最も重要なのは賞品です! これらは、アメリカの紳士とあなたのペイパル+プリント回路基板を注文できる仮想通貨+名誉と尊敬+ CISの外のどこかで求人を得る機会があるグリーンペーパーです:))特に技術レベルは高くありません、過去のコンテストの経験からは非常に強力なプロジェクトがありますが、「強力な」DIYボックスは簡単に勝者になります!








All Articles