XMEGAのADCがおかしな値を出す件について

XMEGAの、と言っても自分が使っているATXMEG32A4Uだけなのかどうなのか分からないけども
そいつらはどうもGNDに近い値を測った時にノイズフロアとはまた別の良く分からない直流バイアスが計測される。
実測するとADC値で大体100~180ぐらいの値(若干変動あり)が出てきていて、「ノイズにしては大きいなー」
とは思っていたんだが、どうやらこれは仕様らしい。というかむしろわざと利便性を考えてこうなっているらしい。

この状況が発生する条件は次の通り
・ADCを差動でなくシングルエンドモードで動かす。
・ADCを符号無し(unsigned)で動かす。

この条件が二つ揃ったときにADC値に下駄が履かされる。
履かされる下駄の大きさはデータシートではΔVとして書いてあり、その大きさは0.05Vrefぐらいの大きさになる。
ADC値だと大体200LSBぐらい。
Atmel曰く、「マイナス入力が入った時に分かるように下駄を履かせてる」との事。
マイナス入力を測りたかったらsignedモードを使うので余計なお世話感しかないが、そういうことらしい。

で、下駄が邪魔な場合は上の二つの条件を満たさないようにADCを設定すれば良い。
自分がやったのはsignedモード&シングルエンドで変換すること。
ただし、この場合は符号ビットで1bit使うので分解能が11bitになる。
他に良い解決方法が有るならこんな事しなくて良いけど、11bitもあれば十分なので特に今の所困ってない。

誰か(自分)の参考の為に書いときますた。

2016/08/04 22:49 · Hirosi Suzuki

atmega168P,328P(と多分88も)のPORTC入力

プログラム中でハイインピーダンスにする → ならない(中途半端に抵抗値が低い)
プルアップにする → プルアップされるけど明らかに内部のプルアップ抵抗の値が小さい

別のPORTで同じように入力ポートのコードを書くとハイインピーダンスになったり
50kΩのプルアップが入ったりするので、おかしいのはPORTCだけっぽい。
そして新品をひっぱり出してきても同じ現象が再現されるので、
これは・・・まさか仕様なのか・・・?

2015/05/10 02:29 · Hirosi Suzuki

atxmegaのタイマーカウントリセット

ATXmega32A4Uを使っていて小一時間引っかかった事が有ったのでメモ
マイコンの16bitタイマーを使っていて、タイマーカウントをリセットしたかったので
ASF(AtmelSoftwareFramework)のtc_reset()関数を呼んでカウントリセットを試みたのですが
リセットされませんでした。
tc_restart()関数だとカウントリセットもされるんですが、
当然ながらその後カウントアップが始まります。

で、どうにかカウントを再開させずにカウントだけをリセットできないかゴニョゴニョやって
結局以下のコードを書いて解決しました。

inline void tc_cnt_reset(volatile void *tc)
{
  ((TC0_t *)tc)->CNTL = 0;
  ((TC0_t *)tc)->CNTH = 0;
}


呼ぶ時はこう

tc_cnt_reset(&TCC1);

これでTCC1タイマーのカウントが0になる
※ASFのタイマーカウンターモジュールが入ってないと動きません

関数本体の中身を

((TC0_t *)tc)->CNT = 0;

って書けば一行で済みそうな気もするけど、16bitのレジスタにアクセスするには
まず下位8bitを書いてから上位8bitを書かないといけないらしく、
上記の一行だけではうまくいかない(ややこい)。

ちなみに。
ASFのtc_reset()は内部でCTRLFSETレジスタのCMDビットを弄っているだけっぽいので、
今回はASFは犯人ではないっぽい。

2015/02/12 20:18 · Hirosi Suzuki

記事追加

最近携帯電話のUSB端子が壊れまして。
で、携帯を修理に出してる間今まで使っていた携帯よりも数世代新しいスマホを
入手して使ってたんですが、コイツが酷い機種で・・・。
普通に使ってるだけなのにどんどん熱くなって、
終いには過熱保護が効いて操作を受け付けなくなると言う神仕様だったので
改造してどうにかしようという事で、一つ記事を書いてみました。
同じ症状で困っている人は是非どうぞ。
携帯の温度センサーの騙し方

この記事も実際の工作をしてから半年ぐらい経ってから書いている訳ですが、
最近のスマホは少しはマシになっているんでしょうかね?
マシになってると良いなあ。

2015/01/17 19:43 · Hirosi Suzuki

UARTで設定が正しいのに文字化けする

UARTで各種設定(ボーレート、パリティetc)が正しいにも関わらず
受信したデータが正しくない時(文字化けする時)は送信と送信の間隔をあけて試してみると良いです。

どうもこの文字化けは通信と通信の間隔が狭く、スタートビットをデータビットの
途中で誤認して取得してしまうような場合に起きる現象なようです。
こんな時は送信と送信の間に_delay_ms(100);とか挟んでみると通信がうまくいくことが稀に良くあります。

これでダメな時は別な要因が有りますので、根気強く原因を探しましょう。

2014/07/04 17:03 · Hirosi Suzuki

Older entries >>