忍者ブログ

東裏通


[PR]

×

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

A/D変換結果の平均回数

A/D変換結果を何回平均すればいいか。

調べてみると標準誤差がこの判断によさげ。
標本誤差=標準偏差/√標本数
だそうな。

エクセルで計算してみる。
A/D変換誤差が±3LSBとする。
標準偏差の計算を正規分布する乱数で行う。
=NORMINV(RAND(),0,1)
これで大体±3の正規分布する乱数ができる(99.73%が±3に入る)。
3σだからわかりやすい。

標本数を2,4,8,16,32,64,128,256とする。
各標本に対して標準偏差を求めて標本数のルートで割る。
=STDEV(N個の乱数範囲)/SQRT(N個)

乱数を変えて50回分平均してみた。
0.586236917 0.461962255 0.343433668 0.244178051 0.17491674 0.12441633 0.089293353 0.062873792

信頼区間は平均値±3×標準誤差で99.73%になるので3を掛ける。
1.758710751 1.385886765 1.030301005 0.732534153 0.524750219 0.37324899 0.267880058 0.188621376

図にするとこんな感じ。


つまり1回だと±3LSBの誤差が、2回平均で±1.8LSB、8回平均で±1LSBになる。
なので精度が±3LSBじゃ足りないよ、±1LSB以下じゃないとだめだよ・・・ってときは
大体±0.7LSBの16回くらい平均すればいいかな~と。

問題は誤差が偶然誤差じゃなくてA/D変換器固有の誤差だった場合だな。。。
正規分布してないならこの計算使いもんにならんぞ。

R8CのA/D変換器は内部でノイズ除去やってるっぽいから
平均の意味ないんだよな~。
精度上げるなら外部からホワイトノイズ与えるしかないな。。。

参考文献:
統計解析道具箱
標準偏差(SD)と標準誤差(SE)
シリウス先生の心理統計学
標準偏差と標準誤差
National Semiconductor
A/D, D/Aコンバータ 日本語アプリケーション・ノート
ディザ信号付加による A/D コンバータの性能改善

拍手[0回]

PR

別スレッドからのコントロールへのアクセス2

前に書いたシリアルポートのデータ表示。
もっと簡単な方法があった。

SerialPortのBytesToReadをBackgroundWorkerのDoWork内でポーリング。
表示させたいときはReportProgressで元スレッドにデータを渡せばいい。
DataReceived?なにそれおいしいの?


Public Class Form1
    Private WithEvents BackgroundWorker1 As New System.ComponentModel.BackgroundWorker
    Private SerialPort1 As New System.IO.Ports.SerialPort

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) _
                                                                   Handles MyBase.Load
        If SerialPort1.IsOpen = False Then
            SerialPort1.PortName = System.IO.Ports.SerialPort.GetPortNames()(0)
            SerialPort1.BaudRate = 9600
            SerialPort1.DataBits = 8
            SerialPort1.Parity = System.IO.Ports.Parity.None
            SerialPort1.StopBits = System.IO.Ports.StopBits.One
            SerialPort1.Open()
        End If
        BackgroundWorker1.WorkerReportsProgress = True
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, _
                                         ByVal e As System.ComponentModel.DoWorkEventArgs) _
                                        Handles BackgroundWorker1.DoWork
        Try
            Static rxcnt As Integer = 0
            Static rxbuf(1024) As Byte
            While True
                If SerialPort1.BytesToRead <> 0 Then
                    rxcnt = SerialPort1.Read(rxbuf, rxcnt, SerialPort1.BytesToRead)
                    BackgroundWorker1.ReportProgress(0, rxbuf)
                End If
            End While
        Catch ex As Exception
        End Try
    End Sub

    Private Sub BackgroundWorker1_ProgressChanged(ByVal sender As System.Object, _
                       ByVal e As System.ComponentModel.ProgressChangedEventArgs) _
                                          Handles BackgroundWorker1.ProgressChanged
        Dim rxbuf() As Byte = e.UserState
        TextBox1.Text = rxbuf(0)
    End Sub
End Class


動くんじゃないかな?試してないけど。

拍手[0回]

ラウンドロビンスケジューラ

作ってみた。
R8C/M12Aはとっても小さいのであまり意味ない気もするけど。

タイマ割り込みでスタックを入れ替えることでコンテキストスイッチ。
RTOSがどんな実装してるか知らないけど、これくらいしか浮かばなかったので。

なんか専用命令もあるけどよくわからないし。

というわけでどんどん使ってくれたまへ。

roundrobin.zip

拍手[0回]

自動ビットレート検出

R8C/M12Aで自動でビットレートを検出して通信するようにプログラムしてみました。
ヘッダを0xFFとしてスタートビットの幅をタイマRJ2で測定しています。

0xFF,0x01,0x00,0xFFと送信すると、
0xFF,0x02,0x03,0x01,0x02,0x03,0xF5と返信してきます。

とりあえず56kbpsまでは使えるみたいです。
何かのプログラムの参考にどうぞ。

autobitrate.zip

拍手[0回]

R8C/M11A、R8C/M12AのI/Oファイル

HEWでR8C/M12Aのプログラム適当に作ってたら動かなかったのでSFRの状態を見ようと思った。
でも表示->CPU->IOでウインドウ開いても表示されない。。。

よく調べて見るとR8C E8aエミュレータデバッガ V.1.04.00 リリースノートにこんなことが…

4.6 I/O ファイルに関する注意事項

orz

すでにRev.1.00は出てるのに。。。ひどい。。
仕方ないので自分で作った。

R8CM12A.io

M11A/M12Aのどっちでも使えるはず。
ルネサスさん、いくらR8Cが開発停止したからって中途半端で放っておかないでくださいよ。。

拍手[0回]


プラグイン

カレンダー

04 2025/05 06
S M T W T F S
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31

カテゴリー

最新記事

最新CM

最新TB

プロフィール

HN:
東こうじ
性別:
男性

リンク

サイトマスター

アクセス解析

バーコード

RSS

ブログ内検索

アーカイブ

カウンター