ATmega88PをRTC化
投稿者: O-Family
|
2009/04/01(水) 19:41 No. 1280 |
|
4月に入り、新入社員や新入学の話題があふれてきています。 そこで、マイコンの電子工作も原点回帰してみようと、「AVRマイコンでデジタル時計」を再企画します。
・ATmega88Pの省電力を生かして、RTC(リアル タイム クロック)化してみる。 (バッテリー・バックアップと、表示オフ時の省電力) ・4桁LEDのダイナミック点灯。 ・テスト結果が良好だった温度センサーICで、室温も表示。
他、アイデア等がありましたら、どしどしご意見を下さい!
|
|
|
投稿者: fuku ..2009/04/01(水) 21:10 No.1282 |
|
こんばんは
以前 教えていただいた時計、今も動いています。 12.8MHz高精度モジュールは正確ですね。
超小型LCDキャラクタディスプレイモジュール(16×2行バックライト・オレンジ)か高輝度ブルー7セグLEDで作ろうかと思っていたところです。
出来ればシンプルな回路でお願いします。
|
|
|
|
投稿者: O-Family ..2009/04/01(水) 21:55 No.1284 |
|
12.8MHz高精度モジュール時計、正確に動いているようですね。 省電力のRTCモジュール化する場合は、32.768kHz水晶を使用しなければいけないので、もう少し精度は落ちてしまうでしょう。
LEDは、秋月電子のC-551SRD(赤)か、C-551UB(青)が良さそうですね。
|
|
|
|
投稿者: kiku ..2009/04/02(木) 06:34 No.1292 |
|
@1Hz外部同期入力端子を付けて、SOFT-PLLで位相比較、結果をPWMで32.768kHz水晶に対しVCXO化で自動公正 Aサーミスタもついでに公正用に使い、さらに高性能化 これで、長時間学習すれば、外部同期外しても、チャンピオンクラスになるのでは? ちなみに1Hzのソースは電波時計やGPSとなります。 言うのは簡単、作るのは大変。
|
|
|
|
投稿者: O-Family ..2009/04/02(木) 08:45 No.1293 |
|
何だか、とても難しそうな動作のようですね。 もっと簡単に、JJYやGPSから正確な1Hzを取り出す方法はないものでしょうか?
1Hz信号があれば、32.768KHz水晶など使わなくても、RTC化はとても簡単なのですがね。
|
|
|
|
投稿者: kuki ..2009/04/02(木) 11:54 No.1294 |
|
実際は難しいので 32Kの水晶に対し、バリキャップダイオードをPWMで容量制御できるようにして、ソフト的に32Kの周波数をトリミングできる仕様にすれば、ケースに収めた後からも、ソフトで時計の周波数をいじる事ができると思いますが。 追加部品は、バリキャップダイオード、コンデンサ、抵抗だけなので、コストアップになならないでしょう。
問題なのは、PWM動作の時、どのくらい電力食うかですね。食ったら、電池でバックアップできないから、RTCの意味ないし。
|
|
|
|
投稿者: O-Family ..2009/04/02(木) 18:51 No.1295 |
|
まだまだ難しそうですね。 私の設計は、RTCに重点を置いてみますので、成果がありましたら教えて下さい。
ATmega88Pのマニュアルを読んでいると、チップ内蔵の温度センサーが追加されているようです。 A/DコンバータのCH.8で読み取れるので、さっそくテストしてみましたが、誤差が±10℃と大きく、いくら省電力にしても、あくまでチップの温度測定用のようで、室温測定には向かないようでした。(残念)
また、ATmega88Pのアナログ基準電圧は1.1Vなので、温度センサーICでの温度測定上限が低くなります。 しかも、基準電圧とは言え、1.0〜1.2Vと誤差が大きく、テストしているチップでは、1.08Vになっていました。 温度センサーIC接続時には、プログラムで多少の誤差調整が必要になりそうです。
|
|
|
|
投稿者: 金太 ..2009/04/02(木) 18:52 No.1296 |
|
百均で売ってる針式時計からモジュール部分を取り出して1Hzのクロック源にする。 後は立上りエッジ検出で割り込み動作させ処理が終わる毎にAVRを省電力モードで待機させれば 省電力時計の出来上がり...
モジュールの電源1.5Vを作るのと出力が+−が交互に出力されるので少し工夫が必要です。 既にAVRで実現している記事がありますが独自に工夫する面白さもあると思いますので伏せときます。
|
|
|
|
投稿者: O-Family ..2009/04/02(木) 19:21 No.1297 |
|
金太さんへ、 少し趣旨から外れてしまったかな? 欲している1Hz信号は、JJYやGPSのような、超高精度な1Hzのことですよ。 市販の時計ならば、おおむね32.768KHz水晶でしょうから、ATmega88Pにこの水晶を付ける方がシンプルですね!
|
|
|
|
投稿者: kiku ..2009/04/02(木) 23:41 No.1298 |
|
>私の設計は、RTCに重点を置いてみますので、成果がありましたら教えて下さい。 32767HZのPWMでトリミングの件は、そのうち実験しますので結果はお待ちください。
PWMとA/Dの実験をしましたがとても正確なので、安心していましたが、結構ばらつきが有るんですね。O-Family様の報告からすると、外部基準をLDOで作った方が良さそうです。
そうそう、ソフトUARTで入出力をインバート指定しましたが、問題なく動作しています。 open"COMpin : baud , dtb , pari , stb , [Inv]" Open "COMD.1:9600,8,N,1,INVERTED" 命令文のリファレンス・マニュアルの未確認外れました。 これができると、実験レベルならば、MAX232付けなくても、ツェナーダイオードとショットキーダイオード、抵抗器で代用できるのでかなりお得です。 参考まで!
|
|
|
|
投稿者: O-Family ..2009/04/03(金) 12:15 No.1299 |
|
kikuさんへ、
AVRのアナログ基準電圧は、数十mVの誤差ですが、温度センサーのようにレンジが狭いと、計算値に影響が出てしまいます。 一度、[AREF]端子の電圧を測って、校正値をプログラムで加味すれば、それ以降は問題なく使えそうです。
「Open"COM」命令の検証、ありがとうございます。さっそく、マニュアルに反映しておきます。
|
|
|
|
投稿者: O-Family ..2009/04/03(金) 22:20 No.1300 |
|
テストバージョンの回路図を書いてみました。
LEDは、バックアップ状態を考慮して、アノードコモンタイプにしました。 重要なポイントは、電源が落ちた(オフにした)場合に、バッテリー(電気二重層コンデンサ)の電力で、電源が落ちたことを検出できるかどうかです。 何かもっと良いアイデアがありましたら、ご投稿をお願いします!
まずは、ブレッドボードに組んでみます。
|
|
|
|
投稿者: akio ..2009/04/04(土) 12:02 No.1301 |
|
電源断の検出ですが、DC5VIN側にリレーを並列に入れて、 ATMEGAで接点信号を読むようにしたらどうでしょうか?
|
|
|
|
投稿者: O-Family ..2009/04/04(土) 23:38 No.1303 |
|
リレーの導入は、消費電力とノイズの影響が少し心配ですね。フォトカプラ等ならば使えるのかな?
基本的な部分を、ブレッドボードに組みました。 温度センサーで、温度を表示しています。 久しぶりに7セグLEDをさわったので、懐かしい気さえしています!
|
|
|
|
|
投稿者: O-Family ..2009/04/05(日) 07:48 No.1306 |
|
おはようございます。
電源の逆流防止用ダイオードは、ショットキーを使うので、AVRの電源とポート端子の電位差はさほど高くならないと思い、抵抗分圧とA/D変換で検知できるのではないかと思った回路図です。 (あ!、ポートへも、抵抗ではなく、同じショットキーダイオードでつなげば、電位差は起きないんだ!)
できるだけ速く検知しないといけないので、平滑用の電解コンデンサとのバランス調整が必要になるのではと思います。
|
|
|
|
投稿者: O-Family ..2009/04/06(月) 09:34 No.1308 |
|
温度センサーを、液晶表示器でテストしていたときには安定していましたが、表示をLEDに変えたとたん、温度表示にバラツキが出始めました。(±5℃ほどばらつく)
原因がわからず、調査に苦労しましたが、どうやらLEDの消費電力が大きく、表示によって電源ラインの微少な電圧降下が、AVRの基準電圧に影響を及ぼしているようです。 (オシロで見ると、基準電圧に数ミリボルトのノイズが乗っている) もしかすると、ATtiny2313のタイマー電力問題のように、ポートのドライブ能力にも影響されるのかもしれません。 AREF端子に、100μFのコンデンサを付けると、多少は安定しますが、誤差の周期が大きくなるだけです。 基準電圧を5Vで使っていたときには、問題にならない誤差ですが、1.1Vでは大問題です。
マニュアルには、A/D変換中は他のA/Dポートを変化させるなとか、A/D変換中はAVRをスリープにしろとか、対策が書いてありますが、A/D変換前の電圧変動には触れられていません。
苦肉の策として、温度センサーを検出する際に、割り込みを一旦停止し、LEDを消灯してから電源が安定するまで500μS待ってA/D変換することで、安定するようになりました。(表示は、どこかの桁が一瞬消えてしまいます)
ブレッドボード特有の問題かもしれませんが、同様のトラブルを見かけましたら教えて下さい。
|
|
|
|
投稿者: kita ..2009/04/06(月) 12:29 No.1309 |
|
こんにちは。
AVCC端子にはLとCのフィルターで接続したほうが良いと思います。 そのための、アナログ電源用の独立端子だと思います。
他にも原因はあるかもしれませんが、アナログ回路の電源にノイズがのるとどうにもなりません。
|
|
|
|
投稿者: O-Family ..2009/04/06(月) 14:18 No.1310 |
|
私も、一番にAVCCのノイズを疑いましたが、今回の現象にはまったく効果がありませんでした。 LCフィルタは、内分のコンパレータに影響するほど、電源ラインからのノイズが大きい場合には効果がありますが、今回のように、AVR内部でのデジタルノイズが、基準電圧に影響している様な場合には効き目がないようです。
実際に、AVR回路とLEDのドライブ回路の電源を、別電源に分けても症状が出ています。 AVRと非同期のノイズと、同期しているノイズでは、対処の方法も変えなければいけないかもしれません。 そのために、マニュアルにこっそりと「A/D変換中はAVRをスリープにしろ」と書かれているような気がします。
|
|
|
|
投稿者: kita ..2009/04/06(月) 22:19 No.1311 |
|
こんばんは。
LCフィルターは高い周波数成分のノイズに効果があります。 今回はこれではなかったようです。
スリープのことは知っています、ただそれ程気にしたことはありません。
8番ピンのGNDとアナログ側のGNDを分離したらどうなりますか? 負荷電流によりGND間レベルが変動するようです。
これで解決するか、GNDを分離して使用して良いのかは良く分かりませんが、 試してみて下さい。
|
|
|
|
投稿者: O-Family ..2009/04/06(月) 22:44 No.1312 |
|
ブレッドボード上では、アナログ系・デジタル系が、それぞれ分離されて、ターミナル端子の所で1点アースの形になっています。 逆に、AVRの[GND]と[AGND]を最短で短絡しても、症状に変化はありませんでした。
確かに、ポートの負荷電流によって起きている症状のようなので、LEDのセグメントにもドライバーICを入れると、不本意ではありますが解消すると思います。
|
|
|
|
投稿者: kita ..2009/04/06(月) 23:30 No.1313 |
|
AVRの[GND]と[AGND]を分離して1点アースもしないという意味です。 AVRの[GND]と[AGND]を最短で短絡すると逆に負荷電流の影響を受けて悪くなると思います。
センサーへの接続もRC5とRC4は使用しない方が良いかもしれません(VCC側につながっているとの事なので)
LEDをOFFでAD値が安定して取り込めるならそれでも良いように思います。
|
|
|
|
投稿者: kiku ..2009/04/07(火) 05:16 No.1314 |
|
AREFに大きいコンデンサーをつける場合、start adc直後は安定しない。 タンタルは効きます。
|
|
|
|
投稿者: O-Family ..2009/04/07(火) 07:42 No.1315 |
|
kitaさんへ、
今回は、タイマーも高速で動かさず、ポートのドライブもLEDだけなので、スリープまで行わずに、LEDの消灯と待ち時間だけで対処できそうです。 ATtiny2313のタイマー電力問題と同様に深い部分の問題で、A/Dの用法としても難しい部類だと思います。 安易に使ってきたA/Dコンバータですが、ノイズの影響を低減させる方法として、良い勉強になりました。
kikuさんへ、
>AREFに大きいコンデンサーをつける場合、start adc直後は安定しない。 その通りですね。 今回の回路では、基準電圧を5Vと1.1Vで切り換えながら使用するので、AREFのコンデンサも0.1μFから0.01μFへ1桁落としました。 それでも、切り換え時は5mSほど待たなければいけないようです。 このコンデンサも、高周波ノイズの影響が少ない場合には、外しておいた方が使いやすいような気もしました。 (タンタルは、驚くほど高い・・・)
|
|
|
|
投稿者: O-Family ..2009/04/07(火) 10:27 No.1316 |
|
ポートをA/D入力にした場合に、自動的にデジタル回路から切り離されると思っていましたが、どうやら違うようです。 ATmega8には無くATmega88から追加された [DIDR0] レジスタで、デジタル回路から切り離せるようですが、BASCOM-AVRでは、このレジスタを制御していません。
と言うことは、BASCOMの命令範囲で、A/D変換用にアナログ電圧を入力しているポートでは、中間電位付近で過大な電力を無駄に消費してしまっていることにならないでしょうか?
マニュアルには、アナログ信号を入力する際には、消費電力削減のため、このレジスタで制御すべきです、と、さらっと書いてありますが、未使用ポートのプルアップ以上に重大な問題ではないでしょうか?
|
|
|
|
投稿者: kiku ..2009/04/07(火) 10:34 No.1317 |
|
ADが安定しない件ですが、実際には何bitぐらいなのでしょうか? そもそも。60dBの精度要求だと考えると、LED駆動を含め、ブレッドボードは、きつい様な気がします。もしかすると、温度センサーの出力に既にパルスノイズが混入していませんか?私なら、PC3と温度センサーのVCC及び温度センサーの出力と1uFに適度な抵抗を入れ積分します。
もっとも、5mSの消灯でちらつき無く解決できるならば、最良の解決策だと思います。
90dBOverの設計をしていると解決できない場合、にタンタルという麻薬に手を染める。 設計変更できない場合は、本当に最終手段ですね。醜い解決方法ですが、手段が無い場合、は有効??
タンタルも性能がピンキリで、面白いぐらい性能に差があったりします。 (特に中国製のフェイクコンデンサーには、泣かされました。ちなみにN●C-T●KINの偽物でした) タンタルコンデンサーは個人で遊びで使うなら、ノートパソコンやHDDのジャンクから、大量に取ることが出来ます。 特に古いHDDのコンデンサーは内部抵抗がとても低いです。
|
|
|
|
投稿者: kiku ..2009/04/07(火) 10:49 No.1318 |
|
低消費電力バージョンの場合パワーダウン中には有効そうですね。 私も以前パワーダウン中のAD入力に悩みまして、パワーダウン中はAD入力をOVに固定していました。このレジスタで軽減できるなら、とてもよいことですね。とても参考になります。
ところで、32Kクロック動作で、パワーセーブモードで、1uAきりましたか?
|
|
|
|
投稿者: O-Family ..2009/04/07(火) 10:59 No.1319 |
|
kikuさんへ、
まず、温度センサーの出力は、オシロで見てもまったくきれいな物です。 AREF端子には、LEDを駆動すると3〜5mVのパルスノイズがのり、2〜3ビットの変化が±5℃のバラツキになります。 つまり、LEDの表示値によってポートのドライブ電流が変わり、それがAREF電圧に影響している様な気がします。 コンデンサで解消できるようなノイズではなく、AREF電圧自体が上下している感じです。
>低消費電力バージョンの場合パワーダウン中には有効そうですね。 通常のA/D変換動作時にも、必ず切っておかなければいけない気がするのです?
>ところで、32Kクロック動作で、パワーセーブモードで、1uAきりましたか? 32.768KHzクリスタルは、Timer2の時計専用になるので、AVRの動作クロックは、現在 内蔵RC 1MHzです。 1秒に1回目覚めて、時計のみをカウントする構造です。 「拡張スタンバイ」に移行する前に、上記A/Dで引っかかっています。
|
|
|
|
投稿者: kiku ..2009/04/07(火) 12:50 No.1320 |
|
PC3にもノイズが無いとなると厄介ですね。 VCC及びAVCCにパルスノイズが無い場合でLEDドライブでAREFにノイズが乗るなら確かに嫌な現象です。この場合、電気的には、外部にLEDドライバを持つか、ソフトの点灯アルゴリズムで逃げるか、温度を平均化するしか手はなさそうですね。 お役に立てませんでした。
>>低消費電力バージョンの場合パワーダウン中には有効そうですね。 >通常のA/D変換動作時にも、必ず切っておかなければいけない気がするのです? 日本の常識は、旧製品の互換をうたうなら、関係なく、レジスタをセットすれば、より低消費電力と考えるのが普通ですが、、フランス人の考えはよくわかりません。 なにしろ、EEPROMがリセット電圧検出方法で、消えてしまうCPUですから
PS:今、MEGA640の回路図ライブラリ作っていますが、PIN数が100PINもあると、疲れます。UARTが4本ほしくて選定したが、人柱になりそう。本当にBASCOMで動作するか心配。
|
|
|
|
投稿者: kita ..2009/04/07(火) 14:54 No.1321 |
|
O-Familyさんへ
[DIDR0]レジスタの件、参考になります。 設定しておいた方が良いと思います。
すでに試されたかもしれませんが、 GNDとAGNDを外部でつながなければAGND-AREF間の電圧はmV単位で安定するようです。 (内部でつながっているとは言え、AGNDを浮かすのは少々気になりますが)
|
|
|
|
投稿者: O-Family ..2009/04/07(火) 15:46 No.1322 |
|
デジタル入力禁止レジスタは、周知されていなかったのですね。 マニュアルは隅々まで読まないと、知らずに使用していることが色々ありそうですが、実際に困ってみないと真剣に読まないのも悪い癖ですね・・・
AREF電圧の問題は、とにかく色々やってみた結果、内部の電圧降下以外に想像がつかない状態です。 ATtiny2313の様に、まだ電源ラインに問題が残っているのではないかと思います。 (ATmega88PA では、直っていたりして!)
さて、肝心のRTC化の最重要課題です。 Timer2と32.768KHz水晶時計は、BASCOMが完全対応しているので、「Config Clock = Soft」命令だけで動作しています。 1秒ごとに割り込みが発生するので、「拡張スタンバイ」に移行して割り込みを待ちます。 通常時は、AVR回路だけで5V 1.6mAの電流量ですが、「拡張スタンバイ」に入っても、100μAまでしか落ちていません。 なにせ、初めてのスリープ動作なので、まだ何か電源を切り忘れているところがあるのでしょう。 しかし、電流計とマニュアル以外、調べようが無いところも辛いです。
|
|
|
|
投稿者: kiku ..2009/04/07(火) 17:43 No.1323 |
|
>100μAまでしか落ちていません。 内部プルアップは結構電流食います。
PWM制御付きRTCの回路、まだ検証していませんが、PDF添付の通りです。 バリキャップを制御して、周波数をトリミングします。 RS232Cは例のインバートで対応しています。
|
|
|
|
投稿者: O-Family ..2009/04/07(火) 18:30 No.1324 |
|
またまた、マニュアルの理解不足でした。 kikuさんの言われたとおり、32.768KHzクリスタルで「拡張スタンバイ」に入るためには、外部クリスタルの32.768KHzをAVRの動作クロックにしなければいけませんでした。 32.768KHzでは、通常動作時に遅すぎて使えません。 よって、ATmega88からある「パワーセーブ」でないとだめなようです。 (ATmega88Pを使う意味が無くなってしまう?)
と言うわけで、「パワーセーブ」に移行したところ、テスターの300μAレンジで測定限界以下になりました。
内部プルアップは、電気を食うのでしょうか?
|
|
|
|
投稿者: kiku ..2009/04/07(火) 21:01 No.1325 |
|
使わないプルアップ入力を、出力にして、Lで固定で電流測ってください。数十マイクロ下がった記憶あります。だめもとで試してください。 あとは、クロックですね。何か解決方法があると良いですね。
|
|
|
|
投稿者: O-Family ..2009/04/08(水) 08:07 No.1326 |
|
10μA単位で測定できる電流計がないので、詳細はわかりませんが、プルアップを外しても変化がないような気がします。 外部に抵抗性の負荷がある場合は、外さなければいけませんが、スイッチのような回路では大丈夫ではないでしょうか? スリープに入ると内部の入力回路も自動的に切られるので、電流の流れる場所は無いような気がします。 一応、プログラムでは、すべてのポートを入力にして、プルアップも切っておきます。
現在、ブレットボードでは、時計カウントしながらのバックアップのテスト中です。 昨晩22:00に電気二重層コンデンサ1Fの電圧が4.7Vからスタートして、10時間経過後、約1Vの電圧降下です。 電圧が高いと消費も大きいですが、ここからは持久戦です。
動作クロックは、内部RC 1MHzで動いていますが、1秒に1回の短い処理なので、遅いクロックで時間をかけるよりも、速いクロックで瞬時に処理する方が良いかもしれません。
|
|
|
|
投稿者: O-Family ..2009/04/08(水) 22:11 No.1327 |
|
バックアップのテストは、昨晩から24時間が経過しました。 現在、コンデンサの電圧は3.2Vです。 3V台に入ってから、消費電力が急激に少なくなったようで、動いているのか心配なくらいです。 もう1日くらいは持ちそうです。
|
|
|
|
投稿者: O-Family ..2009/04/09(木) 20:51 No.1328 |
|
バックアップのテストも、2日(48時間)になろうとしていますが、まだ3Vをキープしています。 3V台から、ATmega88Pのピコパワーが本領を発揮しているようです。 電気二重層コンデンサを一時的に外して通電すると、時計も正確にカウントしています。 うまく行くと、1週間ぐらい持つのかもしれません。(驚き!)
回路的に使えそうなので、同時進行でパターン設計し、基板をおこしてみます。
|
|
|