• ベストアンサー

AVRマイコンでクロックカウントする場合

手元にテスト環境が無いので、質問致します。 周波数40KHz、パルス幅5μSの正パルスをAVRマイコンでカウントし比較一致で出力したいのですが、可能でしょうか? AVRの取説によると、外部カウンタ入力はデューティー比50%でないとダメなようなので、汎用I/Oの割り込みを使って処理しようと考えています。パルスの立ち上がりで変数をインクリメントし、所定の数値との比較一致で外部出力をONさせる、それだけのことですが、可能でしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Visar
  • ベストアンサー率19% (17/87)
回答No.2

こんばんは。 >再度ご教示いただけると有りがたいです。よろしくお願いします。 そんな、教示なんて、とんでもない。 相談に乗れるぐらいで申し訳ありません。 英文はちんぷんかんぷんなので、専ら機械翻訳に任せています。 ※変な訳文の雰囲気と、タイミングチャートとにらめっこして、 なんとかデバイスを使っている程度です。 プリスケーラーの件ですが、MPUの場合、クロックの 立ち上がりや、立下りに同期して何かアクションを 起こすだけですよね。 1/8プリスケーラーに仮に40KHzのクロックを流すと、 8回に一回元の信号の一波長のパルスを出力すると 取説(ATmega128:doc番号Rev. 2467X–AVR–06/11)のp130 - Figure 56.に 書いてあるので、5KHzでデューティ12.5%のパルスを出力すると 言うことではないのでしょうか。 はずしていたらごめんなさい。

NamakeGamo
質問者

お礼

Visar 様 お世話になります。私の不勉強に付き合っていただいて本当に有難うございます。 プリスケーラの件、よく取説を確認したら仰る通りでした。すみません。 ご教示の内容納得致しましたので、何かテストボードを購入して試してみたいと思います。 これで締め切ります。お世話になりました。

その他の回答 (1)

  • Visar
  • ベストアンサー率19% (17/87)
回答No.1

こんにちは。 型式が不明なので一概に言えませんが、 例えば、AVR[ATtiny261A]の取説で タイマー/カウンター周りの ブロックダイアグラムを見てみますと、 クロックソースの辺りにEdgeDetectorや 1/8プリスケーラーがあるので、 デューティー比50%じゃ無くても使えるんじゃ ないですか。 確かにクロックソースのタイミングダイアグラムには クロックT0の波形はデューティ50%の図となっていますが これは例では。 プリスケーラーを通した時点で1/8のワンショットが 来るのと同じですから。 はずしていたらごめんなさい。

NamakeGamo
質問者

補足

Visarさん、早速有り難うございます。 AVRはATMega128を予定しています。確かにデューティー比50でないといけない理由がよくわからないのですが、取説には16bitタイマー/カウンタの説明に以下の記載があります。(タイマー/カウンタが使えるならば16bitのT1or3を使う予定です) The External clock must be guaranteed to have less than half the system clock frequency(fextclk<fclk_io/2)given a 50/50% duty cycles. これを50/50%でなければならないと解釈したのですが。英訳間違っていますでしょうか? それとプリスケーラの件ですが、プリスケーラは周波数を変更するだけでデューティー比を変えることは無いと思うのですが、間違っていますでしょうか? 再度ご教示いただけると有りがたいです。よろしくお願いします。

関連するQ&A

  • クロック信号のカウント方法について教えて下さい

    15MHZのクロックをカウントし、設定値と比較一致した場合外部に2μS巾のワンショット信号を出しタイミングによっては、カウント一致後約60μSで外部信号によってカウンタをリセットする回路を考えているのですが、いいデバイスが見つかりません。マイコン(AVR)のソフトウェア上でカウントするのは無理のようですし(?)、かといってカウンタICにもそのようなICが見つかりません。 どなたか方法をお教え頂けませんでしょうか?カウント数は10進4桁以内です。 マイコンから設定値を書き込めるカウンタICはZENIC製ZEN2024Fを見つけたのですが、使えるのかどうか今ひとつよくわかりません。マイコンはAVRを使おうと思っています。 全くのマイコン初心者です。よろしくお願いいたします。

  • マイコンで経過時間のカウント

    マイコンで所定時間経過したかどうかを判断するとき、 下記の2パターンがあると思います。 例えば、マイコンで有名なR社さんのマイコンセミナーでは②で説明していました。 私は②に慣れています。 お互いのメリットデメリットを教えてください。 また、どちらがおすすめなのでしょうか? ①開始時間time1と現時間time2との差分で経過時間を判断する方法。  例えば、arduinoとかでのmills()関数を使用した方法。  time1 = mills();  /*何らかの処理*/  time2 = mills();  time_diff = time2 -time1; /*経過時間*/ ②ある変数timerを1秒ごとに減算して0になったかで判断する  例えば、1秒割込みで   if(timer > 0){ timer--; }  を実施し、  その後、   if(timer == 0){  で比較する。

  • AVRマイコンで4bit分のデータをシリアルで送る

    お世話になります。AVRマイコン初心者です。 ATtiny2313 を使い、メロディICの入力端子に4bit分のデータをシリアルで送りたいです。 メロディIC → SM11125ABV (セイコーNPC製) データシート → ftp://ftp.npc.co.jp/pub/pdf_j/1125abv_nc0720a.pdf やりたいことは、SM1125ABVの入力端子SI, SCに選曲のためのデータを送り、選曲することです。 データシートにあるように、1bit分のパルス幅は2μsです。 ようは、この幅のパルスを出力できればいいのですが・・・・ 何から始めればよいのか・・・・ 検索したら、UARTというのが見つかりましたが、例がやたらと文字列の送受信で… 文字列の部分を0 ,1 に置き換えたら、H、Lのパルスが出力されてくれるのか??? それとも、タイマで割り込みのタイミングでH、LをI/Oポートから出力させればいいのか??? WinAVRを使います。 どうかアドバイスよろしくお願いいたします。

  • AVRでサーボモータの制御プログラム

    ATmega168を購入してWinAVRでプログラムを書いています。GWServoのS03T 2BBMGと書かれているサーボモーターを動かそうとしています。パルスを送ればいいのかなと思ってdelayと出力を使ってPWMしているのですがまったく制御できません。どういうプログラムを組めばいいのでしょうか?AVRに外部の発信子はつけていません。ATmega168に内蔵されている発振子でしています。というかそれでいいのでしょうか?ごちゃごちゃですが、何か動かすためのアドバイスをください。お願いします。

  • AVRのサーボ制御で困っています。

    AVRマイコンを用いてサーボを8個制御するプログラムをC言語で作っています。使っているマイコンはATmega64LでサーボはフタバのS3003、AVRstudio4.17とAVR-GCCを用いてコンパイルやシュミレートをしています。 プログラムはサーボを8個動かすために タイマ2の比較一致割り込みで2.5msの周期をつくり タイマ0の比較一致割り込みで0.5ms~2.5msのパルスをつくり main関数でサーボの角度を制御するというものです。サーボ8個の角度の保持にはグローバル変数を用いています。 「サーボ初期位置→サーボ2個移動して固定」はうまくいくんですが「サーボ初期位置→※サーボ2個移動→さらに他のサーボ2個移動→はじめに動かしたサーボ2個を初期位置へ」というプログラムを書いたら、なぜか※をつけた「サーボ2個移動」の部分が実行されずその次の行動から実行されてしまいます。これはAVRに書き込んで確認したもので、シュミレータで確認するためにwait()などの待つ処理を除いてシュミレートしてみたのですが、「サーボ2個移動」の2行を飛ばして実行してしまっています。 具体的に飛ばされている部分は後述のソースコードのdo{・・・}while(1);の中の servopos[FR_LEG]=31; servopos[RL_LEG]=31; で、do{・・・}while(1);の無限ループはservopos[FR_JOINT]=70;からservopos[RL_LEG]=94;を無限ループしています。 電気回路、C言語ともに初心者なので見当がつかず、いろいろ試したり調べてみてもわかりませんでした。 質問は「なぜこのようにプログラムを数行飛ばして実行してしまっているのか」です。ソースコードの指摘をしていただけると有り難いです。 ソースコード #include <avr/io.h> #include <avr/interrupt.h> #define RL_JOINT 0 #define FR_JOINT 1 #define FL_LEG 2 #define RL_LEG 3 #define FL_JOINT 4 #define RR_JOINT 5 #define RR_LEG 6 #define FR_LEG 7 uint8_t phase=0; uint8_t servopos[8]={94,94,94,94,94,94,94,94}; /* void wait(uint16_t w){ while(w--){ volatile uint16_t i=200; while(i--); } } */ ISR(TIMER2_COMP_vect){ PORTC=0x00; TCNT0=0; } ISR(TIMER0_COMP_vect){ PORTC |= (1<<phase); OCR0 = servopos[phase]; phase++; if(phase>7){phase=0;} } int main( void ){ //ポート設定 DDRC=0xFF; PORTC=0x00; //タイマ0設定 OCR0 = 94; TCCR0 |= (1<<WGM01)|(1<<CS02)|(1<<CS00); TIMSK |= (1<<OCIE0); //タイマ2設定 OCR2 = 79; TCCR2 |= (1<<WGM21)|(1<<CS22); TIMSK |= (1<<OCIE2); // 全体割り込み許可 sei(); do{ // wait(10000); servopos[FR_LEG]=31; servopos[RL_LEG]=31; // wait(1000); servopos[FR_JOINT]=70; servopos[RL_JOINT]=70; // wait(1000); servopos[FR_LEG]=94; servopos[RL_LEG]=94; }while(1); }

  • 安価なパルスジェネレータ

    12V、50%duty方形波、0~4kHzを出力できるパルスジェネレータを探しています。 ファンクションジェネレータは非常に高価ですので安価なパルスジェネレータは無いでしょうか? なお、コンピュータから制御するのではなく、機器単体で設定できるものを考えています。

  • picマイコンの出力にて、定電流回路をON/OFFさせLEDを駆動させたいのですが?

    PIC16F84Aマイコンを使用して、duty比 1:10 ON時間 10mS のパルスを 出力して、その出力にて 2SC1815 を駆動させ、LM317Tを使用した (100mA 又は 1A) の 定電流回路を、ON/OFFさせたいといろいろ 実験をしていますが、どうも上手くいきません。 定電流回路は、LM317の出力に抵抗を入れそこに LM317のajs を繋ぎ LEDに出力と考えています。 こういった構成では、不可能なのでしょうか? どの様な回路を組んだら実現できるのか教えて頂けませんか?

  • PICのUSBホストコントローラーについて

    初心者です。 PIC24FJ64GB002のUSBホストコントローラーを使用し、USB機器との通信を行っています。 USB機器との通信制御を行っていない時に、PICの汎用ポートからシリアル通信の信号(パルス幅=10μsec、50ビット)を出力しているのですが、不特定ヶ所でパルス幅が50μsec程延びます。 USB機器との通信制御を行っていない時に、通信端子に『通信時間=50μsec、1msec間隔 』の信号が出力されています。 ●この通信制御が汎用ポートの処理の邪魔をしている(割込みが入っている)のでしょうか? ●割込みが原因の場合、割込みを避けて汎用ポートの出力を行いたいのですが、どのようにすればよろしいでしょうか? ご教示下さい。 よろしくお願い致します。

  • PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方

    PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方法について PICマイコンを使って、レベル0-5Vの2つの信号A、Bの立ち上がり時間の差を、分解能1μs・最大時間100ms程度で測定し、USBコネクタでPCに時間差データを転送する方法を教えてください。 信号A、B は通常はLレベルで、Hレベルのパルス幅が10μsから1ms程度の単発パルスです。信号A、B のパルス幅は同じですが、Bのほうが数μs から数10msの遅延があります。 マイコンのクロックに10MHzとか20MHzなどの切りのいい周波数を使い、PICマイコンの割り込みを使う方法があるようなのですが、適切なPICマイコンの型番とプログラミング法、PCとインターフェースの方法などが書かれたサイトなど紹介して頂けると助かります。

  • PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方

    PICマイコンを使った分解能1μsの時間差測定とPCへのデータ取込み方法について PICマイコンを使って、レベル0-5Vの2つの信号A、Bの立ち上がり時間の差を、分解能1μs・最大時間100ms程度で測定し、USBコネクタでPCに時間差データを転送する方法を教えてください。 信号A、B は通常はLレベルで、Hレベルのパルス幅が10μsから1ms程度の単発パルスです。信号A、B のパルス幅は同じですが、Bのほうが数μs から数十msの遅延があります。 マイコンのクロックに10MHzとか20MHzなどの切りのいい周波数を使い、PICマイコンの割り込みを使う方法があるようなのですが、適切なPICマイコンの型番とプログラミング法、PCとインターフェースの方法などが書かれたサイトなど紹介して頂けると助かります。