ディー・クルー・テクノロジーズ Blog

bookmark_border駐車場の空きを教えるエッジAIを作る
(その2~AIモデルおよびデータセットの課題) 

エッジ デバイスやさらに小さなIoT デバイスで使用できる小さな AI モデルを作成する、駐車場AI R&D チャレンジの2回目です。オープンソースを活用しながら低コストでの開発をしています。

今回はそうしたエッヂAI開発でありがちな、乗り越えなければならない課題をお話します。

AI モデルのサイズとパフォーマンス

オープンソースのオブジェクト検出 AI モデルはたくさんあります。 なかでも有名なのはYolo(You only look once) です。 こうしたオープンソースの検出モデルは、多くの研究データ セットで高いスコアを達成する素晴らしいものです。

人や車を検出する、オープンソースのオブジェクト検出AI

ただ、小さなオブジェクトやオブジェクトが密集しているケースなどでは、検出パフォーマンスが低下する傾向があります。加えて、CPUを集中的に使用し、GPU をサポートしないようなエッジ デバイスやIoTデバイスでは、画像のフレーム レートは遅くなるので、さらにパフォーマンスに影響を与えます。

Yoloモデルのサイズは、数百メガバイトから 5 ~ 10 メガバイトまでさまざまあるのですが、 最適化されたモデルが小さいほど、パフォーマンスが低下しますので、今回のエッジAI開発のような、メモリの小さな環境ではかなり厳しい想定はありました。

とはいえ、今回の目的はそうした環境下でも「画像内の 1 つ以上のオブジェクトタイプを検出できる AI モデルを作成すること」です。

もしCPU のみのエッジ デバイスで 5 以上のフレーム レートで機能するAIモデルが実現できれば、さらに難度の高いAI/IoT デバイスでもAIモデルが実行できる可能性がありますのでやる価値はあります。

私は今回のAI モデルのサイズの目標を、エッジ デバイスの場合は 2 Mb 以下、さらに小さなAI/IoT デバイスの場合は 400kB 以下と置いて開発をすすめました。

データセットの注釈(アノテーション)

オリジナルデータ→ アノテーション記録 → イメージマスク出力(AI学習後)

AIモデルの実行環境と同じくらい重要なのが、データセットの注釈(アノテーション)です。

有料のアノテーション済の学習データ(教師データ)は便利ですがご存じの通り高価ですので、今回は無料で扱えるKaggleのデータベースを使うことにしました。

Kaggleのデータセットのデータは4000ほどありましたが、アノテーションが付いておりません。

付けなければなりませんが、人によるアノテーションはお察しの通り途方もない作業で、開発者が自ら行うのは無理があります。そこで、前述の著名な物体検出 AI モデルの「 Yolo」 で車を認識させアノテーションを自動設定しようと試みました。

 ところが、これがうまくいかないのです。

私の感覚ですと、どうもこの「Yolo」はおおまかに1画像に移っている車の数の20%~40%程度しか車を認識しませんでした。

 なぜか。

どうやら映像内で並んでいる車のサイズが小さすぎて、前述した「小さなオブジェクトやオブジェクトが密集しているケース」に相当してしまいYoloが認識できないのが原因のようでした。

結論として今回Yoloが使えないことが分かったので、もう自作しかないと思った私は、映像内の車の位置を記録するアプリケーションをカスタム製作することにしました。

詳細はまた機会があればご紹介しますが、このアプリがうまく各車の位置をアノテーション記録してくれたので、AIモデル学習、その後のAIモデルのイメージ マスク出力までできるようになりました。

データセットのバランス

データ セットの課題はもう1つあります。それはデータセットのバランスです。

データセットのバランスとは、極端に似たデータばっかりセット内に存在するとか、逆にあまり存在しないデータがあるといった不均衡、不均一なデータであることで、そのままAIが学習するとAIモデルの性能評価に偏りが生じる可能性があります。

今回の駐車場のデータセットでもいろいろとありましたが、まとめるとこんな感じです。

  1. 気象条件による明るさの変動
  2. 影による画像の明るさの変化
  3. 明るい日差しの中で白い車
  4. 暗い場所の黒い車
  5. 植物の問題
  6. データセット大きな偏り
  7. 一部の車種の形状

以下簡単にご説明いたします。

1.気象条件による明るさの変動

これは、霧がかかった冬の日から、明るい夏の日までさまざまな状態があります。こうした季節や気象の変化で駐車場の映像の明るさも刻々と変化します。この変動はAIモデル学習に影響を与えます。

2.影による画像の明るさの変化

また、1日の時間帯の条件も難しい時があります。朝から夕方までの太陽の位置で周囲の明るさ自体が変わります。また特に朝夕などで太陽の位置が傾いているときの映像データですと、出来る影が車の周囲に発生をして、これが邪魔をしてAIモデルが車を見分けにくくなることがあります。

日なたと日かげのある条件

3.明るい日差しの中で白い車

たとえば、明るい朝の日差しの中に白い車があるような状況です。こうなると周囲の明るさに車が埋没するので、カメラ センサーが飽和状態になり、車の特徴が見分けにくくなります。

明るいと白い車が飽和しがち

4.暗い場所の黒い車

これは前述の逆パターンで、薄暗くなった夕方になって駐車場へやってきた黒い車は、車とその周囲の明るさが似ていてAIが認識しにくい、という問題を引き起こします。

夕方の黒い車

5.樹木の問題

これもよく問題になります。この駐車場データの右下にある車は、その前にある木々の枝が茂っており、部分的に遮られています。落葉樹ですと冬には葉がありませんが、夏には葉がもっと茂るので、認識率もさらに変わってくることになります。

(右下)木の葉が多い茂っている

6.データセットの大きな偏り

この重要度は前述しましたが、駐車場の映像でのデータセットの偏りとは、なんだかわかりますか?

実は「駐車台数」です。

実際に学習用に入手できた駐車場画像は0~3台ほどが停車しているものが大半で、Kaggleでは4台~というものがほとんどなかったのです。ですので、このまま学習をすすめると、学習に大きな偏りが生じる、という問題を発生させます。

7.一部の車種の形状

こちらも前述いたしましたが、車の形状が大きく違う場合、認識率が落ちることがあります。たとえば、RVやセダンなどが多い国の映像を中心に学習していると、たまに停めに来る大型トラックなどを車と認識しない、ということが起きます。

以上、オープンソースを活用しながら低コストでエッジAI開発をするときの、AI モデルのサイズとパフォーマンス、そして駐車場データセットの課題についてまとめてみました。

いかがでしょうか。皆様の開発の参考になると嬉しいです。

次回は、これらの課題克服のポイントなどについてお伝えしようと思います。

bookmark_border駐車場の空きを教えるエッジAIを作る
(その1~ エッジAIモデルについて)

エッジAIとは?

ディー・クルーでは、エッジAI(IoT環境で動く人工知能)の研究を行っています。

IoTデバイスでは通信負荷が高まるとデータ転送に遅延が生じるなど、問題が起き始めます。

そこで、クラウド側に過度に依存せず、ローカル環境=エッジ側でセンシングー演算ーAI認識まで完結させて、レスポンス性能と通信負荷の低減を両立した環境にやさしいシステムを実現する。

これをめざしてディークルーで現在研究しているのが、AI開発「エッジAI」です。

すなわち、AIを組み込んだIoTデバイスやEDGEデバイスに AI オンチップ アクセラレータを組込むという構想です。

この構想のもと、私は電力負荷の高いGPU を使用せずに低電力 MCU で動作する軽量の AI システムを作りたいと思っていまして、今研究を進めています。

駐車場の空き監視AIを作ってみたきっかけ

今日は、そのなかでも、映像認識のエッジAI研究プロジェクトの1つ「駐車場監視AI」をご紹介します。

映像認識AIは例えば、今映像で映っているオブジェクト(対象物)が、人なら人、コップならコップといった具合に、「どこに、それがあるのか(ないのか)」を人工知能(AI)にリアルタイムに検出させる技術を用いて課題を解決する技術です。

当社はIoTシステムの開発案件を多く手掛けており、駐車場に関したシステムも開発していました。駐車場に止める「車」はAIモデルが認識しやすいオブジェクト(対象物)であります。

そこで、駐車場に設置したカメラから、駐車スペースの空きが分かる便利になると思い付き、AIによる駐車場空き監視システムを作ってみたので、少しご紹介したいと思います。

今回のAIモデルの概要

このプロジェクトのAIモデルについての概要を示します。

図1 AIモデル入力イメージ (368×528)
図2 AIモデル 出力マスク(23×33)

  1. 図1 入力イメージからのオブジェクト検出にFCNN(完全な畳み込みネットワーク)を用います。
  2. AIモデルは、図2 出力マスクを生成し、オブジェクトのおおよその位置を示します。
  3. AIモデルは、この出力マスクを使いオブジェクトの位置を特定、数えることができます。
  4. AI モデルは、Python向けの機械学習ライブラリである、Pytorch フレームワークを使用します。
  5. AI モデルは、Raspberry PI 4 上で 4 ~ 8 Hz のフレーム レートで実行されます。
  6. 学習用のデータセットソースは 、 Parking Lot Dataset | Kaggle を使用しています。

AIモデルの動作について

作成したAIモデルの動作についてはYoutubeの動画にしましたので、ぜひご覧いただければと思います。

図3 駐車場の空き監視AI デモ映像

次に、この映像で何が起きているかということをご説明します。

  • AIモデルが、映像上で「車」と認識している位置に、白い四角を打っています。
  • 動画の上部(UPPER)駐車スペースと、下部(LOWER)駐車スペースの「Parked」(満)と「FREE」(空)数で、AIが認識した数を数えて、それぞれの値を変えています。
  • AIが認識した駐車した車の数に合わせて、白い四角の数も変わり、これらの数字も刻々と変わっていくことがお分かりいただけるかと思います。

なお、映像がカクカクしているなとお感じかもしれません。これは、IoTならではの軽量システムでのパフォーマンスを維持するために、意図的にフレームレートを落としているからです。システム環境によっては、フレームレートを高め、AIモデルをそこに最適化することもできます。

次回は、このAIモデル作成時の課題や工夫したポイントなどについてお伝えしようと思います。

bookmark_borderネイル女子にやさしいキーボードを作ってみる
(その5~ センサの動作確認)

やわらかいセンサ、「ショッカクポット(POTU-001-1)」を使った、やさしいキーボードを作ってみよう!の5回目です。今回は、その4までで製作した装置を実際に指で触ってみて、装置のセンサ値の変化を確認してみます。

このセンサには爪で押すスポンジ部の内部に、4つのチャネル(センサの反応を記録するポイント) があります。スポンジを上から見て時計回りに、6時の位置にCH1、9時に CH2、12時にCH3、3時にCH4のが設置されています。

①スポンジを押したときのセンサ値の変化

まず、CH2→CH3→CH4→CH1の位置に合わせて、順に爪でスポンジを上から押し、それぞれのセンサ値の変化をグラフで確認。次に、各チャネルの間の位置を押した時の動作も確認しました。

その様子を動画にまとめていますので、ご覧ください。

想定通り、各チャネルの上を爪で押すと一番近くのチャネルのセンサ値が変化し、各チャネルの間を押すと、近いチャネルのセンサ値が変化しました。

ただ、指に対するセンサの大きさのためか、設定した閾値を超えない程度ですが、他のチャネルの値も変化するため注意が必要そうです!

そこまでは予測していたのですが、今回一番想定外だったのは、スポンジの表面を軽く触れるだけでもセンサ値が1mmほどと変化があったことです。つまり、予想していた以上に感度がよかった。逆に言えば、思った以上に「繊細」くんなのです。

だから、「どんな触れ方をしたかによって、どう反応させるか」

この微妙な区別をつけるのが次のSTEPの課題になりそう、ということが分かりました。

②スポンジをつまんだときのセンサ値の変化

さて、取扱説明書によると「つまむ」動作の検出が可能ということで、センサの側面のスポンジをつまんだときのセンサ値の変化を確認してみました。

スポンジの側面のいろんな位置をつまんでみて、センサ値の変化を記録してみましたが、爪でつまむと、おもしろいようにセンサ値が変化。各チャネルが「つまむ」動作を細かく判別することもわかりました。

動画で見るとわかるのですが、左や上はつまみにくかったのか、センサ値が弱めだったので、右や下の時は、両手指(というか私の場合は爪です)でキューブをしっかりとホールドしながら操作しましたら、しっかりとセンサ値が反応したようです。

側面の操作にしっかり反応を示す結果をみて、新たな入力方法を思いつきました!

スポンジ側面を爪で刺すと反応する、といった入力方法。

爪が伸びている前提ではありますが、これはアリかもしれません。爪で刺すと動くアプリって具体的にはまだよくわかりませんが、面白いので、このアイデアをどうするかも次STEPの課題にしたいと思います。

さて今回は「やさしいキーボードを作ってみる」のセンサの動作確認を行いましたが、正常に動作してひとまず安心しました。

次はこのセンサ値からの入力判定を行おうと思います! 

いかに誤判定しないように入力判定を持っていくかがポイントですが、これが曲者。思い切ってキャリブレーション機能もつけようかなあ。

フゥー… 悩みどころです。。

〇ユキグマ〇

工作&モノづくり系好き女子。電子工作グッズは無地のメイクボックスに入れてお部屋の雰囲気を保ちます。
フランボワーズケーキに目がないです

bookmark_borderネイル女子にやさしいキーボードを作ってみる
(その4~プログラムを実装する!)

お待たせしました。いよいよキーボードのプログラムを実装します!

プログラムの実装

今回、Arduino側には取得したセンサ値をシリアル通信でPCに送信するプログラムを実装しました。

なお、センサとの通信方法は同梱の取扱説明書に基づいて実装しました。
この取扱説明書、日本語で書かれているのでわかりゃすい!

しかも、説明書って長いことが多いのですが、こちらはたった8ページなので、すぐ読み終わりました。

いろんな意味で私に親切なセンサ君です(笑)

Arduino側のプログラム動作手順概要:

さて、実装プログラムはおおむねこんな流れで動作しています。

① 初期設定

・センサとのSoftwareSerial通信を開始
・PCとのHardwareSerial通信を開始
・100msのタイマを開始

② タイムアウト時にセンサへコマンド(0x6D)を送信

③ センサからのセンサ値を受信

④ 受信したセンサ値を文字列に変換してPCに送信

特に大きく困るポイントはなく、サクサクと実装を進められました。

私にはとても扱いやすい、素直なセンサ君でしたね。

あっ、今思い出しました。1点だけクセがありました。

このセンサの出力データフォーマットのCHの順番ですが、
「CH1,CH4,CH2,CH3」

となっているのですね。(下図で赤い字で示した部分です)

頭の中でコードを考えているときCH1からCH4の順番であると勝手に考えていて、実際に動作させたとき少し焦りました。。。

数字の順番にならんでいないので少しモヤっとしましたが、動かせばすぐに分かります。

皆さん実装するとき、ここだけ注意してくださいね。

〇ユキグマ〇

工作&モノづくり系好き女子。電子工作グッズは無地のメイクボックスに入れてお部屋の雰囲気を保ちます。
フランボワーズケーキに目がないです。

bookmark_borderネイル女子にやさしいキーボードを作ってみる
(その3~ センサを改造)

では実際にハードウェアをつなげてみましょう。

ハードウェア接続

購入したセンサには付属のケーブルがついているのですが、コネクタの受け側が手元にないので、ケーブルの片側を切断し、Arduinoに接続できるように改造します!

センサをGROVEのコネクタにはんだ付けしてGROVE-ベースシールドにつなげようと思ったのですが、Arduino用だけではもったいないのでピンヘッダにはんだ付けしました。

久しぶりのはんだ付けで時間かかったのと、きれいにできなかったのは反省です。。

はんだ付けは、勘がにぶらないように定期的に練習しないとだめですね。頑張ります!

GROVE ケーブル

 https://www.switch-science.com/catalog/798/

・GROVE – ベースシールド

 https://www.switch-science.com/catalog/1293/

というわけで、以下の図のように実際に接続しました!

!! ご注意 !!

付属のケーブルの色がすべて同じ色で区別がつかないので、コネクタ切断前に各線を間違えないよう、シールをはっておいて正解でした。貼っておかないとケーブルがまとまっているのもありどこにつながっているのか判別が難しいので、製作の参考にしてください。

以上でハードウェアの準備が完了です。

次はいよいよプログラム実装をしていきます!

このブログを書いている人:

〇ユキグマ〇

工作&モノづくり系好き女子。電子工作グッズは無地のメイクボックスに入れてお部屋の雰囲気を保ちます。
フランボワーズケーキに目がないです。

bookmark_borderネイル女子にやさしいキーボードを作ってみる
(その2~ プログラムを実装する!)

シス)テム構成

ハードウェア

・ショッカクポット(POTU-001-1)

四角のスポンジのほうだと1万円越え!!!! 失敗するのが怖いので今回はなしにしました。。丸いスポンジ型のも1万越えが大半だったのですが、秋月電子さんだと2,000円以下(2022年末時点)で販売!!

秋月だけ他と1桁も違うとは??と不思議に思いつつも安さにひかれ購入決定! 

届いたものを確認しましたが、問題なく動作しておりました。ちなみにこのスポンジの触感は、メイクに使用するスポンジに近かったです。

https://akizukidenshi.com/catalog/g/gM-14092/

・Arduino Leonardo

Arduino UNOは社内にたくさんあるのでそれを使おうと思ったのですが、HIDデバイスとして使用するには一工夫が必要そう。今回はセンサのほうがメインなので手間をはぶいて、HIDデバイスのライブラリがあるArduino Leonardoを使います。時間があればArduino UNOでのHIDデバイス認識もやってみようと思います。

・USBケーブル(Micro USB Type-B 2.0)

・Windows 10 PC

GUIアプリ作成

Arduinoの開発ツールにシリアルのコンソールがありますが、直感的に押したときの動作変化が分かりづらいので、GUIアプリで分かりやすくしました。普段だとFormアプリなどでシンプルなものを作成していますが、今回は見栄え重視を意識してWPFに挑戦です!

ScottPlot.WPFはグラフ描画のライブラリですが、サンプルが公式に多く載っているので色々なグラフパターンを試しながら確認できました。

開発環境:

・VisualStudio Community 2019 WPFアプリケーション、C#

・ScottPlot.WPF(Version 4.1.56)

作成した画面のポイント:

・閾値を変更可能 ← キー入力判定時にも利用できるようにするため

・グラフ描画時、閾値で色を変えることで直感的にその場で判別しやすい

・横軸の幅を固定にすることでセンサ値の時間変化を分かりやすい

センサ値を確認する側の前準備はこれでOK!

次は購入したセンサをArduinoに接続できるように改造を行います。

このブログを書いている人:

〇ユキグマ〇

工作&モノづくり系好き女子。電子工作グッズは無地のメイクボックスに入れてお部屋の雰囲気を保ちます。
フランボワーズケーキに目がないです。

bookmark_borderネイル女子にやさしいキーボードを作ってみる
(その1~DIY でキーボード)

手元がキラキラ、きれいだと気分が上がりませんか?

私、仕事柄、どうしても手元を見がちなのでネイルで気分を上げています。

忙しいときは明るい色にしたりなど、気分のバロメーターになっていたりして。

ネイルをしていて何気に困ることとして、こんなことってありませんか?

「キーボードにネイルがささる」

 

爪が伸びてくるとタイプミスになりやすかったり、カチカチ音が気になったりとか。。

皆さんはいかがですか?

この解決策として、私が見つけたのは、

・アイソレーションキーボードを使用する(キーとキーと離れている)

・キーストロークが浅いものを選ぶ

などなど、検索で調べるとたくさんでてきます。同じように悩んでいらっしゃるようですね。

<参考>

ネイルした指先でも打ちやすい! 疲れにくいキーボードに新色登場(マイナビウーマン)

どれも素敵なので、すぐにでも解決したい!という方であれば、ご予算に応じたものを買ってしまうのもありです。

生来の電子工作好きである私は、

「ネイルにやさしいキーボード、自分で作ります」

これに挑戦してみたいと思います。

さて、電子工作には、自分なりのこだわりのポイントって重要です。今回はどうやって爪にやさしくするかです。

私が、爪に触れる「素材」にこだわることにしました。

「クッションのようなやわらかさ」でキーボードが爪を易しく受け止めてくれえれば、素敵だなーと。

そこで、やわらかい素材のセンサーとして、実際どのような感触なのか気になっていた、

タッチエンスのショッカクキューブ 

を使ってみたいと思いたちました。 これ、なかなか触感の良いセンサーなんですよー。

こちら使用しながら、次回から、実際にネイルにやさしい、やわらかいキーボードを作ってみようと思います。

一つ補足です。QWERTYフルキーボードを考えていましたが、必要になるセンサの数を考えると「予算オーバー」なのでテンキーにします。

フルキーボードを期待していた方ごめんなさい m(__)m

デモでも楽しめる工作になると思います(^^♪

このブログを書いている人:

〇ユキグマ〇

工作&モノづくり系好き女子。電子工作グッズは無地のメイクボックスに入れてお部屋の雰囲気を保ちます。
フランボワーズケーキに目がないです。

bookmark_borderPLL (4)

僕はPLLの特徴は”時間を扱う”ことだと思っています。

時間を扱うと言う事は・・・リミッタ(制限)が無いとも言えます。電圧や電流なら普通は電源が供給できる範囲を超えた状態にはならないので、上限/下限があります。しかし、時間には上限も下限もありませんし、制限をかけようも無いのです。

なので、周波数差や時間差などの時間を電圧に変換する位相比較器は、なにかタイムマシーンのような特別な回路の様に思えます。位相比較器の話は別に機会にすることにして、今回は”ジッタ”について触れてみたいと思います。

PLLを設計すると”ジッタ(Jitter)”と言う単語を必ず目にします。この単語の英語の意味は・・・”神経質に振る舞う、イライラする”です。ジッタはPLL回路の色々なトラブルの原因になる事が多いので、ジッタと聞くと神経質にもなるし、イライラもしますが、電気用語での意味は”時間軸の雑音”と考えて良いと思います。

例えば、1MHzの発振器は1usec毎に1周期を繰り返し正弦波やパルスを出力しますが、この周期が1.1usecに成ったり、0.95usecになったりと出力するたびに間隔が異なることが、ジッタです。ジッタは雑音なのでジッタが全く無い信号はこの世にはありえません・・・もしあるとすれば、世界標準時を決める原子時計のパルスはジッタが無い(と決めた)と言えます。

雑音が大きくなると問題が起きるのが世の常で、ジッタも大きくなると問題を引き起こします。

S/N設計をするのと同じように、ジッタもきちんと設計しないとトラブルが発生します。

PLLのジッタに関連する機能は、大きく分けて2つに分かれます。それは、

(1)ジッタの少ないクロックを広い周波数帯で出力する事(シンセサイザー)
(2)ジッタだらけのクロックをきれいなクロックにして出力する事(ジッタクリーナー)

の2点だと思います。まずは、(1)についてです。

実は、PLLに不可欠な電圧制御発振器(VCO)は大きなジッタ源なのです。

VCOの制御信号に雑音があれば、その雑音に応じて周波数が変化し、周波数が変化するということは周期が変わるのでジッタになります。制御信号に全く雑音が無くても発振器のトランジスタや抵抗などから様々な雑音が出ているので、これらが周波数に変換されてジッタになって出力されます。VCOの感度(電圧 => 周波数の変換効率)が高いほど出てくるジッタも多く、出来るだけ広い周波数範囲を一つのVCOでカバーしようとした時には、ジッタも多くなることを覚悟する必要があります。ジッタの大きな特徴は、ほっておくとどんどん増えるって事です。

例えば、周波数が1Hzずれた場合0.1sec後には36°ずれ、0.2sec後には72°位相がずれてしまいます。”周波数(差)を時間で積分すると位相(差)になる”ので、周波数がちょっとでもずれていると、時間経過と共に位相ずれ(つまりジッタ)が増加します。

VCOのジッタを減らすには、ジッタを検出して”正しい位置”に”すばやく”戻す必要があります。

“正しい位置”は基準信号としてPLLに入力されます。これに使うのが水晶を使ったVCXOです。

この発振器は水晶に電圧をかけて固有振動数を取り出しているため、非常に周波数が安定していてジッタが少ないです。しかし、周波数の可変範囲が狭いため色んな周波数では使えません。

このジッタの少ないVCXOを基準としてPLL回路を構成し、VCOのジッタを補正すれば、広い周波数範囲でジッタの少ない信号を取り出すことが出来るようになります。

“すばやく”戻すにはPLLの応答速度を早くする必要があります。

ジッタはほっておくとどんどん増えるので、低い周波数の方(周期が長いほど)その量が多い事になります。PLLの応答が間に合う周波数であれば、基準からずれた位相を基準に合わせる事ができるので、ジッタが無くなる事になります。

PLLの応答速度は、オープンループ特性(PLL(その2)を参照ください)の利得が0dBとなる周波数とほぼ同じになります。上の図では1MHzなので、1MHzより遅いジッタが修正できることになり、その分のジッタはVCO出力からは無くなる事になります。

次回は、ビヘイビアモデルを使って応答速度とジッタの量の関係を確認してみたいと思います。(美斉津)

bookmark_borderPLL (3)

今回は「PLL(その3)」です。

前回はパーツ(位相比較器、VCO)をビヘイビアモデルでモデル化し、PLL全体の周波数特性や過渡解析の例を紹介しました。

今回は、PLL特有に問題(キャプチャーレンジなど)に振れたいと思います。

実験室で”PLLがロックしない”といった叫びを聴いたことがあるでしょうか?僕は何度も叫びました。

では、なぜPLLがロックできないかと言うとそれば「位相比較器に入力される2つに信号の周波数差にフィルタが応答できない」からです。

別の言葉で言うと、周波数差がキャプチャーレンジより大きいとPLLは引き込めなくなってしまいます。

PLLに関する文献は山ほどあるので、キャプチャーレンジの計算は文献にまかせて、PLLが引き込めていない時には何が起きているのかを今までのビヘイビアモデルを使って調べてみたいと思います。

前回のVCOとPLL回路を今回も使います。回路定数も前回と同じで先ずは、

.param r0=510 r1=10k c0=1n r2=1k c1=10pとします。

この回路定数だと位相余裕も十分だし、入力する周波数frを9,10,11MHzとした場合のどれでも1.5usec程度で引き込めている事が過渡解析で分かります。

では、フィルタ時定数を変更(注1)してゲイン特性が0dBとなる周波数を1桁遅くした時にどうなるか調べてみると・・・・

注1).param r0=510 r1=1k c0=100n r2=1k c1=100p

位相余裕などは十分取れているので問題は無いのですが、過渡解析は”PLLがロックしない”と叫んでいます!

フィルタの時定数を変更したことで、位相比較器のビート信号(差周波数で振動する)をVCOに伝達できず、VCO制御電圧が十分振れずにVCO出力周波数が目標周波数に到達できないために、PLLが引き込めなくなってしまっています。

PLLを使ってジッタを抑圧する時にはPLLの帯域は狭いほう都合がいいので、ゲイン特性が0dBとなる周波数をなるべく低く設定しようとします・・・・そして、上のように罠にはまってしまうのです。

あらゆる電子回路で使われているPLLですが、確実に動く設計をするにはAC解析だけでは不十分で、必ず過渡解析が必要になります。しかし実際の回路をそのまま過渡解析に使っていたら莫大な時間が必要になり、非現実的です。そんな時に便利なビヘイビアモデルを紹介しました。

次回はエミッタ接地やソース接地の増幅器についての予定です。(美斉津)

bookmark_borderPLL (2)

今回は「PLL(その2)」です。

前回はPLLに不可欠な位相比較器をビヘイビアモデルを使ってモデル化しました。

今回は、電圧制御発振器(VCO)をモデル化してPLL全体の動作を、位相や周波数を分かりやすい電圧に置き換えてPLLを説明してみたいと思います。

PLLは、位相比較器、フィルタ+チャージポンプ、電圧(または電流)制御発信器、分周器の4つの要素で作る事ができます。

(チャージポンプや分周器はPLLの性能や機能を高めるための回路で、PLLに必須の回路ではありません。)

VCOも位相比較器と同じように1MHz=1Vと定義して等価モデルを作ります。こちらは、位相比較器より簡単に電圧制御電圧源(VCVS)のみモデル化できます。

.param fo=10

.param dfp=’0.1/3.3′

.param Kv=’1/(2*dfp)’

.param Vref=1.65

e0 out 0 Value=fo*(2/(exp((Vref-v(vc))/Kv)+1))

周波数(1MHz)を電圧(1V)で表現すればよいので好みの計算式を入れるだけです。

上の例では自然対数を使って、Vcに1.65Vを与えた時に10MHz(10V)が、Vc=0~3.3Vと変えると周波数は9.5~10.5MHzと変化するようにパラメータを設定しています(下図参照)。

続いて前回の位相比較器(PC)と合わせて、PLL全体をシミュレーションしてみます。

今回のVCOと前回のPD(位相比較器)をサブサーキットにして、ラグリードフィルタ(R0,R1,C0)と利得100dBの圧縮アンプ(E0)、VCOの制御電圧の雑音除去用に1次のLPF(R2,C1)で構成しています。R3はオープンループ特性などをシミュレーションするときに都合が良いので、入れていますが、実際には0Ωにします。

PDの出力PhもVCOの制御Vciも電圧なので、実際にPLLに使う回路をそのまま使ってシミュレーションが出来るところが都合いいところです。

R3をOPENにしてシミュレーションしたオープンループ特性を上図に示します。利得特性(赤線)が0dBとなる周波数(1MHz)の位相が85°であることから、十分な位相余裕が確保できています。このときの各部品の定数は下記に通りです。

.param r0=510 r1=10k c0=1n

.param r2=1k c1=10p

このままR3をSHORTにして、過渡解析を実施した結果を下図に示します。

2usecでレファレンス周波数(FR)を10MHz => 11MHzと変えたときの過渡解析です。約1uscで安定して収束しています。

PLLは時間に関連する操作をする回路なので理解しにくいし、実際の回路のまま過渡解析をすると時間がかかる嫌な回路なのですが、電圧制御発振器(VCO)と位相比較器(PD)の扱う周波数や位相をビヘイビアモデルで電圧に置き換えることで、解析時間も短くなるし、理解も簡単になると思います。

次回は、PLL特有の特性(ロックレンジやシーズインレンジなど引き込みに関する特性)を今回のモデルを使って説明したいと思います。(美斉津)