|
カテゴリ:電子工作
PIC16F648の方は一応完成したのだが、とりあえず無視したUSRTも「なんとかなるかな?」と軽く考えてコーディングを始めたのがいけなかった。一応一通りコーディングを終えて、シンタクスエラーもとれていない状態だが、既に300行を超えている。PIC16のCPU単体では1000行にも満たないので、まあUSARTはそれくらい複雑ということ。。。
さて、せっかくVeritakの波形ビューアを拡張してもらったので、ちょっと使ってみることにした。題材はA/Dコンバータ(お約束)である。デルタ-シグマ変調方式の実験をしてみようと思う。デルタ-シグマ変調の原理そのものは、Wikipediaのデルタ-シグマ変調(ただし英語版の方がよい説明だ)でも見てください。この方式の面白いところは、同じ構成が、DA変換にもAD変換にも適用できるところ。 Veritakのチュートリアルの中にも、DA変換の例が載っています。また、Spiceシミュレータの一種である、SwCADを使った実験は、「ベルが鳴っています」の中にもあります。(余談ですが、このサイトほんとにCool) これをディジタルシミュレータであるVerilogでやってみようという極めて、ムダかつ屈折した試みです(大笑)。 一次のΔΣ変換にすることにして、Verilogのmoduleを作ってみました。ANALOG.Hの中では、 `define ANALOG [63:0] としているだけです。alwaysブロックが4つのシンプルなものですが、最初のalwaysブロックは、wireからrealへの変換、2番目は、加算、3番目は積分器、4番目はコンパレータと遅延回路をかねています。 積分器は(さくっと)差分式で、サンプルレートの1000倍のレートで計算しています。また、ゲインはどれくらいが適正なのかよくわかりませんので、適当に決めています(シミュレーションを動かして確認することにします)。実は、Veritakにはちゃんとルンゲ・クッタ(たぶんルンゲ・クッタ・ギル)式のタスクがあるのですが、今回は使い方をしらべるのがめんどうくさかったので使っていません。ただし、必ずしもいい加減というわけではなく、入力信号がクロックに対して十分に遅いので、差分法でも十分と考えました。 出力は遅延回路のあとから取っていますので、1サンプル分遅れますが実質的に同じです。出力digital_oは1ビットですので、一般的にはこのあとデシメーション・フィルタをかけて多ビット値に変えるのですが、そこはあとで考えることにしましょう。 --- 本日の御託 毎日のようにさまざまな偽装の問題が報道されている。拙宅はへーベルハウスなのだが、早速昨夜旭化成ホームズからお詫びの電話があった。無料で修繕する(あたりまえだ!)が4万棟ほど対象があり、すべて終えるのに約2年程度かかるとの試算とのこと。改めて工事時期等の連絡があるらしい。 報道によれば、ニチアスに損害賠償をもとめるつもりらしい。2階の軒下もあるので、足場を組むことを考えると、職人さんが3人で三日くらいだろうか?大雑把に一棟当りの修繕工事費を、50万円とみても、ニチアスの昨期の営業利益を超えてしまいそう・・・ 1 // 2 // (c) 2007 Bakaoyaji 3 // 4 `include "ANALOG.H" 5 6 `timescale 1ns/100ps 7 8 9 `define RESOLUTION (1.0) 10 `define GAIN (0.01) 11 `define GAIN2 (0.00001) 12 `define RELATIVE_GAIN (`GAIN * `RESOLUTION) 13 `define RELATIVE_GAIN2 (`GAIN2 * `RESOLUTION) 14 15 module sigma_delta_adc( 16 input clk_i , 17 input `ANALOG analog_i , 18 output reg digital_o 19 ) ; 20 21 real real_in , integ_in , delta, integral = 0.0 ,feedback = 1.0 ; 22 real integral2 = 0.0 ; 23 24 always@ * begin // converting `ANALOG to real 25 real_in = $bitstoreal( analog_i) ; 26 end 27 28 always@ * begin // summing 29 integ_in = real_in - feedback ; 30 end // always 31 32 33 always begin // integral 34 # `RESOLUTION 35 integral = integral + `RELATIVE_GAIN * integ_in ; 36 end 37 38 always@( posedge clk_i) begin // comparater and delay 39 if( integral >= 0.0 ) begin 40 feedback <= 1.0 ; 41 digital_o <= 1'b1 ; 42 end 43 else begin 44 feedback <= -1.0 ; 45 digital_o <= 1'b0 ; 46 end 47 end 48 endmodule // sigma_delta_adc お気に入りの記事を「いいね!」で応援しよう
Last updated
2007.11.01 20:49:12
コメント(0) | コメントを書く
[電子工作] カテゴリの最新記事
|