忍者ブログ

電子工作/プログラミング
08 2024/091 2 3 4 5 6 78 9 10 11 12 13 1415 16 17 18 19 20 2122 23 24 25 26 27 2829 30 10

09.29.07:25

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

  • 09/29/07:25

12.29.05:21

DBMを知る

GigaStほしい。 


今、研究室でネトアナ使わせてもらってるんだけど、それと同じようなこともできるらしい(トラッキングジェネレータ機能?)。価格も29000円で十分手が届くし簡易的でもスペアナが使えれば、開発の幅が広がる。何しろ高周波を測定できる環境が家にない。今後の最優先事項にしておこう。


今日は、SSBを復調するときに使えるDBM(Double Balanced Mixer)と仲良くなっていきたいと思う。
DBMの回路は↓




T2の1次側電圧はこのように求まる





こんなふうにVcが正か負かによってVsの正負も変わるわけか。
んーてことは純粋な乗算器じゃないんかなー それともダイオードのスイッチングをON, OFFで考えたからこうなったのかな。Vcをダイオードの立ち上がりの際どい所にもっていけば乗算器的な動きをしてくれそうな気もする。 ここは今後の課題かな

それも含めてSpiceで動作を確認してみる。



Vs:1kHz  Vc:100kHzでやってみた。なお定数は適当。きちんと乗算できているが、「ひげ」がすごい。


今日わかったことは
・DBMを構成するダイオードは特性が一致したものを使用しなければならない。(→本来逆相であるべきVc成分がきえないから)
・ダイオードを十分ONさせるだけVc信号は大きくないといけない

課題
・トランスの特性はどうすればいいのか トランスのコア、巻き方でどのように特性が変わるのか
・実際動かしてみるとどうなるか



間違っている箇所がありましたら、指摘してくださるとうれしいです。





PR

12.28.05:28

SSB復調を知る

日々の記録をつけたいなーっと思ってCGIにPythonが使える無料サーバ探してたけど見つからない。自宅サーバも考えたけどめんどくさいし、このブログで記録つけていこうかなと思うてる。


最近は、「無線」という大まかなやりたいことはあるけど、知らないことが多すぎて勉強してると煮詰まってきてモチベーションも下がってるって感じ。どこまでやれば自分のものにできたのかがあんましわかんない。
とりあえず、いろいろ作りながら理論は後からでいいかなと。


今興味あるのはこれ → 7MHz受信機
7MHzはアマチュア無線で人気のバンドらしい。まず、Sallen Key LPFは前作ったアナログシンセで使ったんだけどその時はオペアンプやった。見た感じ同じなんだけどトランジスタではどうなるんかなと特性測ってみたい。
あとのブロックは検波段の中身がわからんてこと。
全体的にはSSBの復調で検波段がVFOとANTからの信号ミキサーになってると思うんだけど、SSBの復調理論がまだわかってない。 いまから調べる。


ということで、大学の教科書を読む。SSBはDSB信号のUSBもしくはLSBをフィルタで取り除いたものだからDSBから考えるといいっぽい。



「アマチュア無線では、7MHz帯以下ではLSB、10MHz帯以上ではUSBを使う慣習になっている(wikipediaより) 」らしいので、USBを取り除くと..



こうなるのかな。スペクトルはLSBのみ残る。
これで受信波のスペクトルが求まった。これに局部発振の信号をかけるとスペクトルはfcだけずれるから



となって、第二項をLPFでばいばいするって感じか。

11.20.08:00

コルピッツ発振回路1

学祭が終わり一区切りつきまして、とりあえず今開発中のものは「なし」の状態になりました。んでこれからの目標は、無線で通信できたらおもしろそうってことで今勉強してる最中です。

この日記をとおして、やったことをアウトプットできたらええなー思うてやっていくつもりです。

ここ最近やってたのはストレート方式のAMラジオをブレッドボード上で組んだり、ここみながらトランジスタの高周波増幅について式を追っかけたりしてました。


今日は超再生検波回路の前身となるコルピッツ発振回路について理解を深めていきます。
コルピッツ発振回路についてはここが詳しく説明されてました。 コルピッツ発振はコンデンサで分圧するところが肝のようです。

2つのコンデンサを直列に接続したとき、どのように分圧されるのかは



のようになり、抵抗で分圧するときとは逆になりました。コンデンサの中間点をGNDにすると



という2点の電圧が得られます。コンデンサの値を適当に決め、入力に1kHzの正弦波を与えてLTspiceでシミュレーションしてみました。





計算結果と一致しています。ここで重要なのは上の結果の通り逆位相の出力がとれるとこです。たとえばC1=C2であれば、出力の振幅は入力の半分となり位相は逆のものが得られます。


まずはわかりやすいエミッタ接地型のコルピッツ発振回路についてみてみます。(参考:URL
回路はこんな感じです↓↓



増幅回路は電流帰還バイアス回路で帰還回路はLC共振回路となっています。増幅回路は反転増幅、帰還回路は先の通りコンデンサを2つ直列につなげた形なので逆位相の出力となり回路全体としての位相は180度+180度 = 360度で発振条件を満たしています。

んなとこで今日はここまで。明日はどれだけ高周波まで発振できるか求めていきたいと思います。

07.05.20:06

マイコンのCPU負荷率測定法

ある処理のCPU負荷率を調べたいときは多々ありますよね。オーディオ関係の高負荷処理や、ある割り込み処理がどのくらい負荷率が高いか、通信部の負荷率など...

「マイコン 負荷率 測定」とか調べてもRTOSありきの説明だったりとかで出てこないのです(ただ調べ方が悪いだけなのか?)

ここで紹介ってほどおおげさじゃないですがみなさんはどうやってるんだろうという事も兼ねて自分の方法を書いてみます。

(Ⅰ)オシロスコープを利用した方法
まずマイコンのある一つのピンを測定用端子としてオシロのプローブとつなぎます。あとはそのピンに、測定したいロジックの最初にH終わりにLを出力します。


これでオシロに矩形波が表示されデューティー比が負荷率になります。
またこの方法では測定するロジックの実行時間も分かります。

03.27.00:33

ペリフェラルを利用しないマイコン間シリアル通信

マイコンには多くの通信機能が搭載されています。私が今開発に用いているAVRマイコン(ATMega1284P)にはSPI, TWI, USARTなどの通信機能があります。これらの通信機能はマイコン内部のハードウェア上で行っているのでソフトウェア上でそれを再現するより高速でしょう。
まずペリフェラルを利用しないマイコン間シリアル通信をするメリットを挙げてみます。
  • SPIは1対多の通信をサポートしていますが新しいモジュールと通信するときなど不安要素はなるべくなくしておきたいものです。対象のモジュールはSPIを使いマイコン間通信はソフトウェアで行えば安心です。
  • 今回の通信方法は超低速マイコンと高速マイコンの通信でも動作します。(人 対 マイコンなど笑)
  • I/Oさえあれば動くので楽です
普通に通信するときはペリフェラルを利用すればいいのでソフトウェアで行うことは稀でしょう。

使用するピンですが超低速マイコンと高速マイコンの通信でも動作させるためにDREQピンを使います。
  1. SCK
  2. MISO
  3. MOSI
  4. DREQ
下のように定義しました

//COMピン
#define COM_PORT_OUT PORTB
#define COM_PORT_IN  PINB
#define C_SCK  0
#define C_MISO 1
#define C_MOSI 2
#define C_DREQ 3




回路はお互いに同じピンをつなぐだけです。


あとは下のフローチャートに従って通信します。


参考にAVRのコードを載せておきます

1. Master側


//シリアル送受信関数 Master
// uint8_t COMSendData(uint8_t data);
// r24 : data(u8bit)
.GLOBAL COMSendData
.FUNC COMSendData
COMSendData:

.irp bit, 7,6,5,4,3,2,1,0
CBI _SFR_IO_ADDR(COM_PORT_OUT), C_SCK

;MOSI
CBI _SFR_IO_ADDR(COM_PORT_OUT), C_MOSI
SBRC r24, \bit
SBI _SFR_IO_ADDR(COM_PORT_OUT), C_MOSI

DREQ_LOOP_L\bit:
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_DREQ
RJMP DREQ_LOOP_L\bit

SBI _SFR_IO_ADDR(COM_PORT_OUT), C_SCK

DREQ_LOOP_H\bit:
SBIS _SFR_IO_ADDR(COM_PORT_IN), C_DREQ
RJMP DREQ_LOOP_H\bit

;MISO
CBR r25, (1 << \bit)
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_MISO
SBR r25, (1 << \bit)
.endr

MOV r24, r25

RET
.ENDFUNC

2. Slave側


//シリアル送受信関数 Slave
// uint8_t COMRecvData(uint8_t data);
// r24 : data(u8bit)
.GLOBAL COMRecvData
.FUNC COMRecvData
COMRecvData:


.irp bit, 7,6,5,4,3,2,1,0
SCK_LOOP_L\bit:
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_SCK
RJMP SCK_LOOP_L\bit

CBI _SFR_IO_ADDR(COM_PORT_OUT), C_DREQ

SCK_LOOP_H\bit:
SBIS _SFR_IO_ADDR(COM_PORT_IN), C_SCK
RJMP SCK_LOOP_H\bit

;MOSI
CBR r25, (1 << \bit)
SBIC _SFR_IO_ADDR(COM_PORT_IN), C_MOSI
SBR r25, (1 << \bit)

;MISO
CBI _SFR_IO_ADDR(COM_PORT_OUT), C_MISO
SBRC r24, \bit
SBI _SFR_IO_ADDR(COM_PORT_OUT), C_MISO

SBI _SFR_IO_ADDR(COM_PORT_OUT), C_DREQ
.endr

MOV r24, r25

RET
.ENDFUNC




引数には送信するデータを渡してあげると受信したデータが関数から返ってきます。
   NEXT >>>