人気ブログランキング | 話題のタグを見る

OceanBlue


リーフタンクでクイーンエンゼルのペアリング
by masaX
最新の記事
2023年捕獲群 記録
at 2023-04-14 22:01
2023年群入居
at 2023-04-14 21:56
シュワルベ ワンをチューブレス化
at 2022-12-25 17:20
ずんぐりむっくり
at 2021-08-29 10:08
コンチネンタル GP5000..
at 2021-06-19 15:15
コンチネンタル GP5000..
at 2021-06-02 10:08
コンチネンタル GP5000..
at 2021-06-01 08:22
カテゴリ
外部リンク
フォロー中のブログ
検索
以前の記事
2023年 04月
2022年 12月
2021年 08月
2021年 06月
2021年 05月
2021年 04月
2021年 03月
2021年 02月
2021年 01月
2020年 11月
2020年 08月
2020年 07月
2020年 05月
2020年 03月
2020年 02月
2020年 01月
2019年 11月
2019年 10月
2019年 09月
2019年 08月
2019年 07月
2019年 06月
2019年 05月
2019年 04月
2019年 03月
2019年 01月
2018年 12月
2018年 11月
2018年 10月
2018年 09月
2018年 08月
2018年 07月
2018年 06月
2018年 05月
2018年 04月
2018年 03月
2018年 02月
2018年 01月
2017年 12月
2017年 11月
2017年 10月
2017年 09月
2017年 08月
2017年 07月
2017年 06月
2017年 05月
2017年 04月
2017年 03月
2017年 02月
2017年 01月
2016年 12月
2016年 11月
2016年 10月
2016年 09月
2016年 08月
2016年 07月
2016年 06月
2016年 05月
2016年 04月
2016年 03月
2016年 02月
2016年 01月
2015年 12月
2015年 11月
2015年 10月
2015年 09月
2015年 08月
2015年 07月
2015年 06月
2015年 05月
2015年 04月
2015年 03月
2015年 02月
2015年 01月
2014年 12月
2014年 11月
2014年 10月
2014年 09月
2014年 08月
2014年 07月
2014年 06月
2014年 05月
2014年 04月
2014年 03月
2014年 02月
2014年 01月
2013年 12月
2013年 11月
2013年 10月
2013年 09月
2013年 08月
2013年 07月
2013年 06月
2013年 05月
2013年 04月
2013年 03月
2013年 02月
2013年 01月
2012年 12月
2012年 11月
2012年 10月
2012年 09月
2012年 08月
2012年 07月
2012年 06月
2012年 05月
2012年 04月
2012年 03月
2012年 02月
2012年 01月
2011年 12月
2011年 11月
2011年 10月
2011年 09月
2011年 08月
2011年 07月
2011年 06月
2011年 05月
2011年 04月
2011年 03月
2011年 02月
2011年 01月
2010年 12月
2010年 11月
2010年 10月
2010年 09月
2010年 08月
2010年 07月
2010年 06月
2010年 05月
2010年 04月
2010年 03月
2010年 02月
2010年 01月
2009年 12月
2009年 11月
2009年 10月
2009年 09月
2009年 08月
2009年 07月
2009年 06月
2009年 05月
2009年 04月
2009年 03月
2009年 02月
2009年 01月
2008年 12月
2008年 11月
2008年 10月
2008年 09月
2008年 08月
2008年 07月
2008年 06月
2008年 05月
2008年 04月
2008年 03月
2008年 02月
2008年 01月
2007年 12月
2007年 11月
2007年 10月
2007年 09月
2000年 01月
その他のジャンル

ハードウェアタイマーの使い方

サイン波を作るプログラムは 既に完成していて



ポンプの駆動も問題なく



このまま完成させようとしてたところですが



O-Familyさんより PWMを作るハードウェアタイマーの使い方の問題点を御指摘頂き



考え直しておりました


既に作っていたプログラムは先日、記事にしたように 確かに アブノーマルな手法で



シビアな目で見ると 正確な時間を刻むハードウェアタイマーの使い方ではない



そんなところで もう一度 ハードウェアタイマーの使い方(モード)を考え直す事にした



今までのタイマーの設定は



Config Timer1 = Timer , Prescale = 1 , Clear Timer = 1
Compare1a = Koma1 - 1
Compare1b = 1500
On Compare1a Tim2
On Compare1b Tim3
Enable Compare1a
Enable Compare1b



「比較一致 CTC動作」というモードで



PWMの波長や周波数を調整するCompare1AやCompare1Bの値を プログラムで書き換えると その場で書き換わるらしくて このタイミングが悪いとタイミングが悪いまま書き換わってしまうらしくて そこに問題が有るとの事 



そんな事で 他にもいろいろなモードがある中で



まず重要なのが 「比較器[OCR1x]の更新」のタイミングらしくて これがBOTTOMになるモードを使うと良いらしい



それから「TIMER1[TCNT1]TOP値」が「OCR1A」あるいは「ICR1」になるモードを選ぶ



この条件で選んでみると



「位相・周波数基準PWM動作」で2つのモード



「高速PWM動作」で2つのモード



合計4つのモードがリストに挙がる


元々 今のサイン波プログラムを作り始めた時に上記「高速PWM動作」モードでやり始めたのですが まったくサイン波にならずに 勝手に「こういう使い方はできないんだ」と思い込んで やめてしまってた


そんな事で もう一度 今までのプログラムのままでタイマーの設定だけを変えてみると



やっぱり まったくサイン波にならない



これではまったく進まないので まずは 上記の4つのモードの簡単なプログラムを書いてみて



波長、周波数を調整する方法を確認してみると どれも そうも問題なく 同じ様な使い方で 波長も周波数も制御できるじゃないか!





問題なく制御できているので 最低限サイン波だけ出力するプログラムだけを取り出して入れてみると 問題なく サイン波が出力されている



どうして 前のプログラムでサイン波が出なかったのか?



これを確かめる為に 現在のプログラムのタイマーのモード設定を「高速PWM動作」の



TOPを「ICR1」にするモードに書き換えて実行してみると やっぱりダメ



ここから 順番に引っかかりそうなコードを省いていきながら サイン波が出るか確認していく


とことんコードを省略していって テストでサイン波が出たプログラムと もう何も違いは無いところまで省略したのに サイン波が出ない!



2つのプログラムの違いになる部分が解らないし もう省けるところも無い



なぜだ!!





この状態から かれこれ30分は まぶたが腫れてあんまり見えない目で コードを睨み続けていた気がする・・・・





そこでやっと 違いに気付いた



以前のプログラムでは タイマーの設定のコードの後 すぐに 「Stop Timer1」でタイマーを止めておいて メインループの寸前で再スタートさせていた



テストプログラムでは これをやっていない


試しに タイマーを止めるのをやめて メインループの寸前でタイマーを設定するようにしてみると サイン波が出た!!

「比較一致 CTC動作」モードでは タイマーを止めてもまったく問題は無かったけれども



「位相・周波数基準PWM動作」



「高速PWM動作」



のモードではタイマーを一度止めると正常に機能しなくなるのかも知れない


ここは深くは解らないけど 先に進む事にする


タイマーを止めなければ サイン波が出る事が解ったので もう一度最初のプログラムで タイマーを止めないコードに書き換えると これも問題なくサイン波が出力された!!



ハードウェアタイマーの使い方_e0359523_12542542.jpg



これで一つ解決!!



でも よく見ると サイン波の線が あまり綺麗ではないし



半波を200コマ割りにしたキャリア周波数だと 凸凹になる(画像は100コマ割り)


「反則技」を使っていた元の「比較一致 CTC動作」を使ったプログラムも 反則技を使わずに波形が繋がる比較器の設定タイミングが分かったので やってみると



ハードウェアタイマーの使い方_e0359523_12542690.jpg



画像では分かり辛いが ±の切り替わり部分以外の線は こちらの方が滑らかで綺麗に仕上がっている
でも これも 200コマ割りにすると少々凸凹になる 



反則技を使った 元のプログラムが 一番綺麗な波形だったりするのと



これだと 500コマ割りでも 波形が大きく丸くなるけれども 凸凹が出ずに綺麗なカーブを描いてくれる 



ハードウェアタイマーの使い方_e0359523_12542669.jpg





さてと



結局のところ どれを使う事にしようか?


オーディオの音質に拘ってるなら いざ知らず
ポンプをコントロールするのに きっと この程度の違いは どれを使っても差は出ないと思うけれども



正弦波フェチとしては悩むところです(笑)!!

















 



by masax7790 | 2011-06-22 10:03 | AVRマイコン関連
<< こんな方法が有ったのか ちくしょう 刺された!! >>