昨日からどん詰っていたおっきなバグが取れた。
バグ adchannel=(ADCON0&=0b00001100)>>2;
正解 adchannel=((ADCON0)&(0b00001100))>>2;
肝は「&」とするところを「&=」としてしまったこと。&はビットのアンド演算、&=はビットのアンド演算をした結果をADCON0というパラメータに格納する。
う~~~ん、、、分ってしまえば当り前なんだけど、他の部分からコピペしてきて流用した部分だったので、なかなか見つからなかった。
最初の1回だけAD変換した後、ADが起動しないという症状だったので、怪しそうなパラメータの値を追いかけたところ、ADCON0の0ビット目が1(AD有効)であるはずなのに0(AD無効)になっていることを発見し、上記バグにたどり着いた。
通常のプログラムでは、算術演算を多用するが、ハード制御では、ビット演算を多用するので、こんな感じでバグが潜む。1日、悩んでしまった。。。。ま、次にこんな事が起きれば、すぐに発見できるというノウハウを修得したと前向きに考えることにしよう。

ということで、AD変換割込みの制御部も完成。あとは、ロジックの検証を進めれば良い。
次に、パワーFETのドライブをテスト用に簡略化した回路で試してみたのだが、やはり、2SC1815という定番トランジスタ一つで10Aも流せるFETをドライブするのはさすがに無茶で、PWM波形がなまりまくり。FETをもうひとつはさんでドライブしないと無理なようだ。しかし、PWM制御信号の正負が入れ替ってしまう・・・・と思ったら、PICの制御ビットの設定で、正論理/負論理は反転可能。やはり、CPU制御はすばらしい。。。。
とりあえず今晩は気持よく寝られそうだ。おやすみなさい~~~
S.Kさん、K.Oさん、N.Uさん、他16人が「いいね!」と言っています。
コメント:
S.K:良かったね~!おやすみ! 2012/10/15 23:12
T.Y:ビット演算を頭の中でアルゴリズム展開をするのは、理工系の世界で過ごして来た人間でも、穴が出ますね。だけど脳が活性化しますね。 擬似体験させてもらいました。 2012/10/16 9:10
K.A:釈迦に説法だとは思いますが、気がついた点をお話します。大電流を扱うPWMは、効率や制御性を狙ってRISE/FALLを速くしていくと、大きなノイズを出すことがあります。あまり欲張りすぎないこと、またしっかりとしたノイズ対策が必要です。アース、パスコン、過剰で悪いことはありません。 2012/10/17 6:25
K.A:釈迦に説法シリーズです。どんなに優れた設計でも確率的には必ず壊れます。家の中に入れて常時使うものですから、万一誤動作した場合にシステムを安全に停止できるように設計しておくことが大切です。WDタイマの活用や、I2CやA/Dを使った、ちょっとした温度センサー等、兎に角ヤバそうな自体を察知することが必要です。 2012/10/17 6:33
創結マスター:S.Kさん、ありがとうね。(^_^)v 2012/10/17 7:50
創結マスター:T.Yさん、PICはひとつのピンに複数の機能が割り当ててあって、設定を少しでも間違えると正しく動いてくれません。その設定が何段にもなっていて複雑怪奇。データシートにも細かく記述されておらずカットアンドトライの連続です。結果をきちんと記録して置かないと忘れてしまいそうです。 2012/10/17 7:56
創結マスター:K.A師匠、釈迦に説法シリーズ、歓迎です!
ノイズ対策は大切ですよね。自宅だけならまだしも、隣近所に迷惑かけたら洒落にならないですものね。
今回は、スイッチング周波数は40kHzとあまり上げていません。立ち上がり下がりもオーバーシュートアンダーシュートで素子の許容電圧を超えないように設計してます。といってもいつもいつも計算するの面倒なので、安全サイドの定数で試して実測して適切な値を決めるといういい加減な方法なんですが(^.^; 2012/10/17 8:06 創結マスター:部品はいつかは壊れるということは肝に銘じて置かないとなりませんね。素子が壊れるときに短絡か開放かも考えながら部品選びをしないとなりませんし。電力関係は火事に直結するので、留守中に使うには、相応の対策は必須でしょう。定常的に使えるようになるまでに、きちんと保護回路も設計しようと思います。これからも、色々とアドバイスお願いしますね>K.A師匠 2012/10/17 8:43


