digitale bottega cresc blog. 一定周期のパルス発振

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

一定周期のパルス発振

さて,前記事では1命令あたりの実行時間を測定したが,別にwaitを入れて周期的な波形を出そうとは考えていない。ただ見てみたかっただけ。最終的にはタイマを使ってカウンタとかいじくってパルスを生成することになると思うので,最初からそれでいこう。

方法はタイマを使ってカウントさせ,ある一定値を与えておきタイマの値がこの値になったら割り込みを起こす。割り込み先でそれまで出力ビットを反転させる。こうするとある程度正確に一定周期のパルスが発生できるはず。ただし,ある一定値はパルスのオンエッジとオフエッジで発生させるから,たとえば発生させたい周波数が440Hz(=2.2727ms)の倍の早さのつまり1.13636msごとに割り込ませる。この方法だとある一定値を変更すれば音階ができそう。

と思っていろいろ調べていたら,ATtiny2313はコンペアマッチでポートの出力を反転させる機能があるらしい。だったらそのままそれを使えば一定周期のパルスとなる。

まずは出してみたいパルスの周波数を考えて,ATtiny2313のclkCPUの速度とCLKDIV8のオン,オフそれからタイマ/カウンタはclkCPUをさらに分周して使えるらしいから,その辺を計算する。

計算した表は印刷画面を画像化したものを載せておく。pdfデータでおきたかったんだけど,このブログでは置けないらしい。

calc_freq1.png
calc_freq2.png

計算は88鍵のピアノに合わせて88音で行った。最初のページは音程と周波数とその周波数だと1周期に何秒必要で,さらに上下の音との差を計算させた。つまり表中で一番低いA0では周波数27.5Hz,1周期当り36.36msであり,ひとつ上の音との1周期当りの時間の差は2.04msと読む。

2ページ目は内蔵発振器の周波数を元に作ることが可能なタイマの1サンプリングにかかる時間,タイマが最大値までカウントした場合の時間,そしてその場合の最低と最高周波数を求めた。

この二つの表から,今回使用するタイマと発振周波数,分周値(CLKDIV8使用の有無),カウンタの分周値を次のように決定した。

  1. タイマカウンタ0(TCNT0)とタイマカウンタ1(TCNT1)のどちらを使用するかについては,作業中に8bitタイマのTCNT0では到底最低周波数が得られそうになかったので途中で計算をやめた。したがって16bitタイマのTCNT1を使用する。
  2. 最低音のA0まで出そうと思うと,27.5Hzのパルスが必要なので最低周波数がこれ以上である分周しない場合は除外。したがって,CLKDIV8はオンにする。
  3. 最高音のC8まで出そうと思うと,4.186kHz以上のパルスが必要なので,最高周波数がこれに満たないものは除外。
  4. 最高周波数付近では1音当りの差が1μsに満たないので除外。とするとすべて除外されてしまう。
  5. 4.ではすべて除外としたが,最高周波数付近では1音当りの差が1μsに満たないのはA#7~C8であり,それ以外は1μs以上なので表中セル背景が水色のものを採用する

決定したのは発振周波数8MHz,CLKDIV8:オン,カウンタ分周なしである。

次に本当に計算どおりに最高周波数と最低周波数が得られるかを確認した。使用したのは次のプログラム。比較値は二つの値の切り替えなので外から切り替えるのではなく一回一回コメントアウトして再コンパイルした。今回はC言語にしてみた。

/*
 * _002.c
 *  最低周波数と最高周波数の確認
 *
 * Created: 2011/10/19 20:00:46
 *  Author: tom
 */ 

#include 

int main(void)
{
	DDRB=0b00001000;	// PB3(OC1A)を出力ポートに設定
	
				// タイマカウンタは非PWM出力で使用する
	TCCR1A=0b01000000;	// Compare matchでOC1Aがトグル動作
	TCCR1B=0b00001001;	// CTC 比較一致タイマ/カウンタ解除
	//TCCR1C		(FOC1x OC1x強制変更)は使用しない
	
				// OCR1Aは切り替えて使う
	OCR1A=0;		// コンペアマッチの値(最高周波数)
	//OCR1A=0xFFFF;		// コンペアマッチの値(最低周波数)
	TCNT1=0;		// カウンタを0にリセット
}

結果が下のようになり,最低周波数,最高周波数とも期待通りの結果となった。

f_min.png f_max.png
最高周波数(1MHz, 1μs周期) 最低周波数(7.63Hz, 65.54ms)

theme : 電子工作
genre : 趣味・実用

tag : AVR, ATtiny2313

comment

Secre

プロフィール

cresc1973

Author:cresc1973
1973年生まれ。茨城県高萩市出身。千葉県柏市在住。ミニが好き。合唱が好き。こんぴゅ~たが好き。

最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
カテゴリー
blog counter
online counter
現在の閲覧者数:
ブログ内検索
RSSフィード
リンク
ブロとも申請フォーム

この人とブロともになる

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。