シンプルな電子レコーダー



最初にアイデアを持っていた


仕事中(私は医学で働いています)2台の電気機械式レコーダーが腫れ、苦しんでいます。私と彼ら:マスカラ、メカニック-あなたはそれが不快であることを知っています。 あるアイデアが頭に浮かんだ:古い時代に窒息する2つのレコーダーを、プリンターに出力する機能を備えた適切なソフトウェアを備えたADCコントローラーとPC(弱くて古いものも含む)で構成される単純なデータ収集システムに置き換えてみませんか? そして、それは私の頭で始まり、回転しました...



歌詞


回路や電子機器の経験も特別な知識もないというアイデア以外は何もなかったので、ネットワークの広大さをめぐってかなりの量の文献とかき回しをしなければなりませんでした。 また、プロジェクトは予算がかかると想定されていたため、LUTメソッドを習得し、ボードのエッチング、ドリル、はんだ付けの方法を学ばなければなりませんでした-後悔はありません。 したがって、私はいくつかの小さな道を試しました-試行錯誤の道、私はその過程で私が行ったいくつかの観察をもたらします、多分誰かがそれらを自分のものと比較して同意するか、同意しないかもしれません:





ADC理論と最初の試みについて


いくつかの研究の後、いくつかの方法でアイデアを実現することが可能であることが判明しました。 最も簡単な解決策はパトリック・ゲルの本に記載されており(地下室を参照)、アナログからデジタルへの信号変換の基本もそこで説明されています。 そこから取った典型的な図は次のとおりです。

この回路はADCチップに基づいています。 PCとの相互作用は、PCのRS-232インターフェイスのモデムライン上にパルスの制御シーケンスを形成することにより、ソフトウェアレベルで実装されます。 この状況は、データレートを制限し、伝送エラーの可能性を高めます。 測定精度は、ADCの分解能(この場合は8ビット)、ADCに供給される基準電圧の精度(ION LT 1009 CZを使用)によって決まります。 信号のデジタル化速度は、ADCの変換時間に依存し、また、開発者によるインターフェイス構成の精度に依存します。 実際、この実装は私の最初の戦闘経験でした(下の写真を参照)が、よりエレガントなソリューションの必要性を感じたため、すぐに失望しました。 制御プログラム(ドライバー)は、PascalのDOSで作成されました。

このようなスキームは、実行可能性にもかかわらず、示された欠点が実際に使用されないため、ADCマイクロ回路は通常、ハードウェアレベルでデータ転送を既に整理し、同時にいくつかの制御操作またはプリミティブデータ処理を実行するマイクロコントローラーと一緒に使用されます。 このようなソリューションの良い例は、AVRマイクロコントローラーに基づい回路です。



この回路は、Atmega8マイクロコントローラー、FT232BM USBインターフェイスチップ、AD7876 ADCチップ、およびREF195GP IONに基づいています。 入力では、オペアンプに基づく微分器が入力信号を0〜5V(ADC基準電圧)の範囲にします。 AD7876 ADCチップは、アナログからデジタルへの信号変換を実行し、SPIインターフェースを介してマイクロコントローラーにデータを送信します。マイクロコントローラーは、UARTおよびFT232BMインターフェースのマイクロ回路を使用して結果をusbポートに「スロー」します。

タスクの一部として、4つのADCチャンネルを使用する必要があります。 魅力的な機会は、スイッチ入力を備えたマイクロコントローラの内蔵ADCを使用することです。これにより、外部ADCチップの使用を放棄し、必要なチャネル数を提供できるようになります-安価でシンプルなソリューション。 各入力での信号の振幅は2〜2.5 Vを超えないため、回路に微分器を含める必要はありません。



私のデバイスのスキーム


ADCコントローラーは、AVR Atmega8マイクロコントローラー上に構築されています。 MKには、4つのADCチャネル、信号LED、PCインターフェイスカードを接続するのに十分な脚があります。 回路は外部ION L1009CZを使用します。 RS-232インターフェースを介したPCインターフェースカード 、MAX232チップに基づいており、メインモジュールから分離されています。必要に応じて、USBインターフェース用のFT232を搭載したカード、または任意のBluetoothモジュール(タイプBTM-222HC-04 )blootoothインターフェースを介した通信用。 以下の図は、開発中のデバイスの概略図を示しています。



電源回路は標準です-リニアスタビライザー78L05に基づいて、信号LED HL1があります。 スケマティックダイアグラムはsPlanを使用して描画され、ボードのレイアウトはスプリントレイアウトにあります。 技術チェーンの最後-LUT +エッチング+穴あけ+はんだ付けにより、以下を取得します。



底面図:





ソフトウェア部


コーディングには、Windows用のAVRStudio + WinAVR(AVR-GCC)を使用しました。Linuxの代替はEclipse + AVR-GCCです。 CodeVisionAVRを試してみました-最初は悪くありません。組み込みのコードジェネレーターがあり、コードの量の制限は2 kBです。

ファームウェアは、次のアルゴリズムに従って動作します。



テキストをデバッグするために、テストメッセージが考慮されます。 ポーリングチャネルの切り替えは、対応するLEDによって強調表示されます。 初期化中、4つのLEDすべてが同時に点滅します。 LEDの切り替えが目に見えるように、遅延を意図的に設定しました。



/* WinAVR version... Chip: ATmega8 Memory Model: SMALL Data Stack Size: 256 bytes Clock frequency: 4.0000 MHz PCO - PC3 - Channels */ // ATmega8 I/O register definitions #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdio.h> #define ADC_VREF_TYPE 0x40 #define ADC_CH1_MUX 0x1 #define ADC_CH2_MUX 0x2 #define ADC_CH3_MUX 0x3 // Counter of channel's changes uint8_t i = 0; void LED_init(void){ printf("Led initialization....\r\n"); char j = 0; DDRD|= (1<<DDD7); DDRB|= ((1<<DDB0)|(1<<DDB1)|(1<<DDB2)); for(j=0;j<5;j++) { PORTD|=(1<<PD7); PORTB|=(1<<PB0)|(1<<PB1)|(1<<PB2); _delay_ms(600); PORTB&= ~((1<<PB0)|(1<<PB1)|(1<<PB2)); PORTD&= ~(1<<PD7); _delay_ms(600); } } //Sending of single char static int my_putchar(char c, FILE *stream){ while((UCSRA&(1<<UDRE)) == 0); UDR = c; return 0; } void myUART_init(void){ // USART initialization // Communication Parameters: 8 Data, 1 Stop, No Parity // USART Receiver: Off // USART Transmitter: On // USART Mode: Asynchronous // USART Baud rate: 9600 UCSRA=0x00; UCSRB=0x08; UCSRC=0x86; UBRRH=0x00; UBRRL=0x19; //Redirection of stdout static FILE mystdout = FDEV_SETUP_STREAM(my_putchar, NULL, _FDEV_SETUP_WRITE); stdout = &mystdout; printf("UART initialization....\r\n"); } void ADC_init(void){ // ADC initialization // ADC Voltage Reference: AREF pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: None // Select ADC input 0 printf("ADC initialization....\r\n"); ADMUX=ADC_VREF_TYPE; ADCSRA=0x8E; } // ADC interrupt service routine ISR(ADC_vect){ // Here is sending data in RS-232 printf("I'am in interrupt...\r\n"); uint16_t data = ADCL; data+= (ADCH<<8); printf("Ch_%u=%u\r\n",i,data); //Control of ADMUX's state uint8_t pr = ADMUX; printf("ADMUX = %u\r\n",pr); data = 0; if (i == 3) { i = 0; ADMUX&= ~ADC_CH3_MUX; PORTB&= ~(1<<PB2); PORTD|=(1<<PD7); //Change of channel data = ADMUX; printf("3to0,ADMUX = %u\r\n",data); data=0; _delay_ms(25); } else { if (i == 0) { ADMUX|= ADC_CH1_MUX; PORTD&= ~(1<<PD7); PORTB|= (1<<PB0); //Change of channel data = ADMUX; printf("0to1,ADMUX = %u\r\n",data); data=0; } if (i == 1) { ADMUX&= ~ADC_CH1_MUX; ADMUX|= ADC_CH2_MUX; PORTB&= ~(1<<PB0); PORTB|= (1<<PB1); //Change of channel data = ADMUX; printf("1to2,ADMUX = %u\r\n",data); data=0; } if (i == 2) { ADMUX&= ~ADC_CH2_MUX; ADMUX|= ADC_CH3_MUX; PORTB&= ~(1<<PB1); PORTB|= (1<<PB2); //Change of channel data = ADMUX; printf("2to3,ADMUX = %u\r\n",data); data=0; } i++; _delay_ms(25); } // Start a new AD conversion ADCSRA|=0x40; }; int main(void) { myUART_init(); ADC_init(); LED_init(); printf("I'am in main...\r\n"); // Global enable interrupts sei(); // Start the first AD conversion ADCSRA|=0x40; while (1); }
      
      







デバッグが完了したら、テストメッセージをコメント化して、不要な遅延を削除する必要があります。 コードはデータシートに埋もれて書かれ、すべてがそこに詳細に書かれています。



プログラマー


ファームウェアには、最も単純なSTK200プログラマーが使用され 、はんだ付けを容易にするために、ボードの配線を独自に行う必要がありました。 ステッチavrdude。 私はavrealを試してみました-すばらしい代替手段で、問題もありませんでした。







最後に、動作します!


コードのデバッグ、数回の消去/書き込みサイクルの後、MKデバイスは生き生きとして、LEDを点滅させて大喜びしました。



PCでは、テキストターミナルを使用してCOMポートを操作しました。 たとえば、QT + QSerialDevice (comポートを操作するための素晴らしいライブラリ、同胞のDenis Shienkovによって作成された)などを使用して、必要に応じて一括で作成できます。



結論として


計画では、PC用のソフトウェアのみを作成しています。 実際、私はすでにQT + QSerialDevice + QWTを使用して書いていますが、すぐに、グラフがディスプレイ上でクロールされると感じています。 また、 ハブで既に述べたSTM32VLDISCOVERYを基礎として、STM32FシリーズMKにハードウェアを実装することも考えています。新しいハードウェアを学びたいです。



有用な文献


上記のすべての本を消化するのに役立ちます:

P.ホロウィッツ、W。ヒル。 「回路技術」は古典的なものです。

パトリック・ゲル。 パーソナルコンピュータを測定複合体に変える方法は上記で言及されました。



All Articles