ATtiny13上の3チャンネルUART ADC





こんにちはHabr。 ATtiny13でアナログデジタルコンバーターのUARTを作成するために既にalready化していますが、たとえばATmega8にはマルチプレクサを使用してADCを測定できるポートが6つ(DIPの場合)あるため、なぜATtiny13でUARTを作成するのですか?

いくつかの理由があります。



-ATtiny13は安価です。

-ATtiny13は、マイクロコントローラーリソースをより最適に使用します。

-寸法;

-消費電力

「私はそのように感じました。」



もちろん、私の議論には多くの反論を見つけることができます。たとえば、ATmega8は、 V-USBを使用すると、UARTからUSBへのアダプタを必要としない入力/出力ボードになりますが、後者とは別に、おそらく議論することはできません



ATtiny13でソフトウェアUARTの経験を積むことを目標に設定しましたが、彼らが言うように、その経験は非常に貴重です。 いずれにせよ、将来のプロジェクトに役立ちます。

まあ、私はそれが鉄でどのように機能するかを引き出して示しません:







スキームによるいくつかの単語は、ところで、ここにあります:



プロテウスのスキーム




すぐにパワーフィルターに注意を払うといいと思います。2つのコンデンサC1-できれば「セラミック」と、MKの脚にできるだけ近く、C2-電解、2つ目は100マイクロファラッドに設定できますが、そのようなコンデンサはありませんでした手で470 uFで10Vを見つけました。各ADCポートに、できるだけMKの近くにコンデンサを配置するのもいいでしょう。 R1は基本的なものではありませんが、「良い形」の規則に従って-存在しなければなりません。



ご覧のとおり、データは1023、666、10の形式で提供されます。少なくともデータを取得し、このデータを受信するコンピューターまたはその他のデバイスにCSV形式で保存します。

ちなみに、私の場合はデータを受信します。安価なUSB-UARTコンバーターはPL2303HXチップに基づいています。 コンバーターで動作するオンボード3.3 VからATtiny13にマルチメーターで3.4 Vの記事に電力を供給しようとしましたが、最初は電源をこのような高い値に変更すると、データ送信に何らかの影響が出ると考えました。 、涼しい、すべて、さようなら十分なデータ...氷で冷やされた軽いもので少し暖められた種類はありません(狂信なし)-すべてが正常に動作し、損失は観察されませんでした。



コードに関するいくつかの言葉-コードはBasicのBASCOM-AVR環境で記述されています。ここでは、Basicに出会ったことがないので、コードの記述に4〜5時間を費やしました。コードを書くだけでなく、BASCOM-AVRの機能、デバッグなどすべてを処理することもできます。



コード
Samples Alias 64 '   #define   '    $regfile = "attiny13.dat" '    $crystal = 1200000 $hwstack = 16 $swstack = 16 $framesize = 16 '$noramclear Open "comb.0:9600,8,n,1" For Output As #1 '   UART,  9600  '  PB0   TXD,   RXD  Config Adc = Single , Prescaler = Auto , Reference = Avcc ' ,   Vcc Start Adc '   '  Adc -   : Single -  , '    Free (   ) ' Prescaler = 128 -      '      (   2,4,8,16,32,64  Auto). '   Auto,         ' Reference –    . Aref –  , ' Avcc –   , Internal –    1,1 . Declare Function Adc_get(byval Adc_port As Byte) As Word '         '     "Samples"    Do '     Print #1 , Adc_get(1) ; "," ; Adc_get(2) ; "," ; Adc_get(3) '     *,*,* Loop '   Function Adc_get(byval Adc_port As Byte ) As Word '   Word   .  65535 Dim Temp_result As Word '     Dim Adc_cycles As Byte '     Temp_result = 0 For Adc_cycles = 1 To Samples Temp_result = Temp_result + Getadc(adc_port) Next Temp_result = Temp_result / Samples Adc_get = Temp_result '    Temp_result End Function
      
      





コードは、最初にソフトウェアUARTを作成します。ここでは非常に簡単です。必要なパラメーター、ポート、速度などを設定し、ADCを構成し、関数を宣言し、理解し、その後、線が形成され、ADCサンプルのサンプルからの平均数の結果が形成されます。 42や108ではなく64を選択したのはなぜですか? さて、1023 * 64は65 472であり、バッファに使用したWordタイプの場合、変数が取ることができる最大値は65 535であるため、この数値は、もう1つのサンプルを追加すると、符号なし2バイトワードとして表すことができる最大の数値ですADCが1023を返すと、変数は単純にゼロにリセットされます。何らかの理由で、Long型に問題がありましたが、個人的には、64個のサンプルがあります。 さて、その後UARTで結果が表示されます。







ご覧のとおり、ノイズは確かに存在します。64サンプルの平均値が表示されているにもかかわらず、 データシートから判断すると、±2 LSBのノイズは正常で、1 LSBのノイズがあります。



スクリーンソフト








ご覧のとおり、ATtiny13は1秒あたり15〜16回値を送信しますが、これはソフトウェアUARTであり、ポートごとに64の測定を行うことを考えると悪くないと思います。



MKは次の電流を消費します。



電源5 V-2.71 mA

電源3.3 V 1.75 mA



プログラミングに関するいくつかの言葉-ビデオで述べたように、MK周波数は1.2 MHzであり、以前のトピック「スターウォーズスタイルの音楽の呼び鈴」のように、すべてのヒューズはデフォルトで設定されています。

融合計算機のヒューズは次とおりです。



フジ
画像








最後に、さまざまな角度からの写真を2、3枚:



小さな写真撮影










参照:



Arduinoの代替配線-BASCOM-AVR

グラフィックを作成したソフトウェア-シリアルオシロスコープ

Proteus 7 Professionalのソース、hexファイル、および図を使用したアーカイブ

すべての出版物



All Articles