Interest の回答履歴

全1017件中121~140件表示
  • 日本語入力 の実装方法のヒントを教えて下さい orz

    多くのソフトで見られるテキストエリアというか、 自由に日本語を入力できる機能を作りたいのですが、 1.この自由に文字を入力できる機能は何という名称の技術なのでしょうか?   技術を検索したくても言葉が解らず困っています。   (日本語入力システム キャレット IME c++ 等では見つからず・・) 2.実装するために参考になりそうな、コード(というか関数名でも何でも)   解説サイト、書籍他何でも良いので   些細な事で構いませんので、情報を下さると幸いです orz とっかかりが見つからず、適切な言葉すら見つからない質問ですみません; よろしくお願いいたします orz

  • インラインについて

    1つ教えていただきたいことがあるのですが、本で読んだのですが普通の関数とインラインの関数は短い関数の方だとインラインの方が早いと載っていたのですが、長いほうだと普通の関数の方が早いと載っていたのですが、なぜ長いほうだと普通の関数のほうがいいのでしょうか? わかる方いらしたらよろしくお願いします。

    • 79562
    • 回答数6
  • 指数関数?duty制御

    カテゴリー違いかもしれませんが、とりあえずこちらでご相談させていただきます。 picマイコンを使って、自動的に電球の明るさをフェードイン、 フェードアウトさせる照明を制作したいと考えています。 私はマイコンのプログラム部分だけの担当です。 電圧と、光の強さの関係がイコールでないため、 添付したような、グラフの関係になるのかと思うのですが これを数式で表すと、どのような式になるのかがわかりません。 (フェードイン、フェードアウトまでの時間をmsecとしています) ledの制御などでも、指数関数を用いたフェードインの仕方は よくやられているようなのですが。。 数学がほとんどわからず、またC言語、picに対しても 初心者です。 よろしければ、ご教授いただけると幸いです。

    • kassel
    • 回答数4
  • 指数関数?duty制御

    カテゴリー違いかもしれませんが、とりあえずこちらでご相談させていただきます。 picマイコンを使って、自動的に電球の明るさをフェードイン、 フェードアウトさせる照明を制作したいと考えています。 私はマイコンのプログラム部分だけの担当です。 電圧と、光の強さの関係がイコールでないため、 添付したような、グラフの関係になるのかと思うのですが これを数式で表すと、どのような式になるのかがわかりません。 (フェードイン、フェードアウトまでの時間をmsecとしています) ledの制御などでも、指数関数を用いたフェードインの仕方は よくやられているようなのですが。。 数学がほとんどわからず、またC言語、picに対しても 初心者です。 よろしければ、ご教授いただけると幸いです。

    • kassel
    • 回答数4
  • プログラム領域の算出方法

    現在C言語でプログラミングの勉強(設計含む)をしているのですが、設計書の記載項目に「プログラム領域」「ヒープ領域」「スタック領域」の算出を関数ごとに行うというような記述がありました。 動的メモリ領域・スタック領域の算出方法は何とか調べたのですが、「プログラム領域」の算出方法がわかりません! 出来れば 1.プログラム全体のプログラム領域の算出方法 2.関数ごとのプログラム領域の算出方法 を教えて頂けないでしょうか? 勉強している環境 OS:WindowsXP コンパイラ:Borland C++ Compiler 5.5 よろしくお願い致します。

  • ログ取得のプログラム

    はじめまして。 組み込みOS(iTron)で開発を行っています。 で、デバッグ用にログを取得してコマンドで確認しようと考えています。 そこで質問なんですが、 ・ログデータを書き込むメモリは動的確保と静的確保で違いはあるのでしょうか? ・ログ書き込み用のメモリがなくなったら上書き形式で古いのから消していきたいのですが、どのようなプログラムで実現できるのでしょうか? 各ログデータに次ポインタを持たせて、そこで次のログデータのアドレスを示すことでできるかなと思っていますが。

  • 関数の値を配列に格納する早さ

    課題があって、膨大のデータファイルを操るプログラムに関係あります。 ファイルの中身にある値を内積を求めてRuijido関数という関数を作った。結構大きいので細かく説明するとよけい難しいと思うので問題になるところだけ書かせてもらいます。43000個の類似度の値を計算する部分は以下のとおり: (1)以下のプログラムを書いたら処理する時間が5分 for(i=1; i<43000; i++){ if(i==indexNum){ i++; } gainenComp[count] = Ruijido(indexNum,i); indx[count] = i; count++; printf("gainenComp[%d]:%f\n",count,gainenComp[count-1]); } (2)以下のプログラム書いたら処理時間10分(どれもひどいですT.T) for(i=1; i<43000; i++){ if(i==indexNum){ i++; } rVal = Ruijido(indexNum,i); if( rVal>0.800000){ gainenComp[count][0]= rVal; gainenComp[count][1] = i; count++; } } 関数の呼び出す時間かなり影響してくるんですか?(2)番目のところに見ると類似度関数を2回呼び出されるため、処理時間が2倍増えたと自分が思うんですが...どうしたら関数の値を配列に格納するのにすばやく処理できますか? (質問わかりづらいと思いますがどうかよろしくおねがします)

  • 組み込みCプログラムで実数型

    8~16bit、32bitのマイコンでCの組み込みプログラムを仕事で作りはじめました。 その中で、floatやdoubleといった実数型は使わないようにと教わりました。コードサイズが大きくなること、処理時間が大きくなることが理由だと考えていますが、定量的に考察したことがありません。 そこで、コンパイラのhelpを検索してみたところANSI-Cで決められているほど広くないにしても使えることが書いてありました。しかしながら、先輩たちはその使用をかたくなに拒みます。しかし、理由も先ほどのような感じです。 もし仮に、コードサイズや処理時間に問題ないとしても実数型を使わない理由を教えていただけませんでしょうか?

  • プログラミング言語の習得について  

    最近 プログラミングについて興味を持ち始め、本などを読んで勉強している駆け出しの新米です。。。 実は、ニコ動などの科学のコーナーなどで、興味を持ったのですが、 本に書いてあることをどうやって活かせば、自分の作りたいプログラムを作れるのか教えていただきたいです。 あと、VISUAL C++はプログラム作りに関して言えば 使いやすいですか? もしかして、ほかにいいのがあったら 教えてください。 また、今はC言語をやっているのですが、あんまり始めるのには良くない言語ということを聞いたのですが、変えたほうがいいのですか? 頑張るので いろいろコメントくださいね。                 よろしくお願いします。

  • 仕事に行きたくない

    18歳の女です。 仕事のある前日、特に仕事の前の休日に 凄く仕事に行きたくなくて 憂鬱な気分になる事に困っています。 朝になると体が重く、 結局休んでしまう事が月に一度程あります。 仕事が嫌など、皆が思う事ですし 自分への甘えだともわかっています。 明るい気分にするように音楽を聴いたり 自分に厳しく言い聞かせたり するのですがやはり憂鬱な気分のままです。 仕事に行きたくない等の理由ではなく 理由がわからないまま 泣いてしまう事もあります。 仕事に行きたくないという気持ちから 最終的には死んだほうがましだと 思ってしまうのです。 こんな憂鬱気分をふっ飛ばす事が 出来る方法はありませんか? 回答お願いします。

    • noname#140275
    • 回答数4
  • C言語で連立1次方程式

    C++で連立1次方程式を解くプログラミングを作りたいのですが何回やっても出来なかったので質問します。 N=3; n=N; 0<=i<=N-1, 0<=j<=N-1, A(3×3行列)= 1 -8 -6 8 7 8 -2 -2 7 a[0][0]*X+a[1][0]*Y=(-1)*a[2][0]; (1X+8Y=-(-2)) a[0][1]*X+a[1][1]*Y=(-1)*a[2][1]; (-8X+7Y=-(-2)) (行をi、列をj、a[0][0]=a[i][j]) (XとYや関数名は適当に決めてもらって構いません) X、Yを求める。 XとYが求まったら1行目をX倍した数と2行目をY倍した数と3行目を足した数を、3行目に入れる。(計算は列ごとにやる(3回計算)) 3行目の成分は分数で表示させる。(整数の形にできるのなら整数の形にしたい) 表示させる関数は↓のように作りました(型はintでなくてもいいです) void matrix_print(int n, int a[N][N]){ int i, j; for(i=0; i<n; i++){ for(j=0; j<n; j++) printf("%5d \n",a[i][j]); } printf("\n"); return; } 私はX、Yで分数が出てきたところでうまく分数表示が出来ずに(整数で表せるなら整数で表したい)そこで詰まってしまいます。 何方かわかる方はプログラムを作ってください。お願いします。

  • C言語のソースコードからどのようにメモリ領域を使用しているのかを図で説明してくれるソフト

    私はプログラミング初心者なのですが、以前プログラミングについて詳しい方に、どのようにしたら他の方が作成されたプログラムを解析していったら良いのかということを相談したところ、まずプログラムで宣言されているポインタなどの使い方などから、メモリ領域の使い方を読み取り、それを図にまとめるなどしてメモしていった方が良いという助言をいただきました。 いろいろとポインタなどについて参考になるWEBサイトなどを参照していったのですが、ポインタの書き方などが様々なものがあるということを知り、困っています。ただ、eeprom領域のメモリを電源を入れた際にCPUがそれをSRAM領域に呼び出して、関数がそのSRAMを見に行っているという感じは何となくわかるのですが、頭がごちゃごちゃになってしまい難しいです。 ただ、メモリ領域をその方がどのように使おうとしたのかでもわかれば何となくそのプログラムを読み解くことができるようになる感じがするのですが、ポインタなどからそれをグラフィック表示してくれるようなフリーソフトなどはないでしょうか? どなたかご存じの方いらっしゃいましたらご教授お願いいたします。

  • 画像の円形内による画素検出について

    画像内にある円形範囲を設定し、その範囲内の画素を検出したいのですが、円形の範囲指定をするプログラムの書き方がわかりません。 c言語でプログラムを作成したいのですが、どのようなプログラムを記述したらよいのでしょうか?

    • syunrei
    • 回答数2
  • C言語のプログラムを早く理解する方法

    私、今日の朝から仕事始めなのですが、今日から上司の方からプログラミングに関する仕事をもらえることになっていて、年末にそのサンプルプログラムをもらっていて「ちゃんと理解するように」と念を押されていたのですが、 実はまだ読んでいません。 今日の朝早く会社に行って読もうとは思っているのですが、一昨日から会社のネットワーク機器関連の管理でまだその仕事が終わっていなくて、たぶん今日1日プログラミングだけに専念できるかどうかわからない状態です。 そこで、C言語のプログラミングを早く読むコツというかテクニックがあるならば是非教えていただきたいのですが、誰か初心者の私でもわかるやり方はありますでしょうか? ぜひよろしくお願いいたします。

  • C言語で型汎用性のある関数を作成したい

    C言語です。 下記のコードでは、期待した通りにメンバにアクセスできるのですが、 構造体のメンバが多くなったとき、構造体をネストしているときには、 挙動がおかしく(なにか別の値をとりだしてしまっている?)なります。 どのようにしたら型汎用のある関数を書くことができるでしょうか? (C++ならば、汎用(テンプレート)関数があるけれども。。。) #include <stdio.h> struct hanyo{ int i; }; struct aaa{ int i; long l; char str[100]; }; struct bbb{ int i; }; void hoge(hanyo *ph){ printf("%d\n", ph->i); return; } int main(){ aaa a; a.i = 1; bbb b; b.i = 2; hoge((hanyo *)&a); hoge((hanyo *)&b); return 0; } ----実行結果---- 1 2 続行するには何かキーを押してください . . .

    • otaks
    • 回答数6
  • ジャイロセンサを用いた角度の算出について

    現在二足歩行ロボットを製作しているのですが、ボディ剛性が低いのとモーターを増やしすぎた(RC用のサーボを26個使用しています)ためか、直立状態でも姿勢が安定しないことから、姿勢の安定化のためのフィードバック用にジャイロセンサを利用しようとしたのですが、多々の問題から上手く角度が算出できずに困っています。ジャイロセンサを扱った経験のある方がいらっしゃいましたら御指導願います。 マナーが悪くて恐縮なのですが、同様の質問を下記のURLでしています。 http://oshiete1.goo.ne.jp/qa4561017.html 上記のURLでいただいたアドバイスを元に、現在はサーボ1個をジャイロを動かすために使用し、マイコンのA/Dで値を取得してexcelで計算という作業を繰り返しています。 開発環境は下記の様になります。 ・ジャイロセンサ →村田製作所製圧電振動ジャイロENC-03R(秋月電子製圧電振動ジャイロキットをそのまま使用し、オペアンプの出力をマイコンのA/Dに直結) 印加電圧:3.38V(マイコンに印加している電圧をそのままセンサに分岐) 静止時出力:約1.41V(たまたまかもしれませんが手元にある2個のジャイロキットは大体これ位出力しています) ・マイコン →SH7144F(秋月電子製SH7144Fマイコンボード(12.5MHz)) クロック設定PΦ=25MHzシングルチップモード ・コンパイラ →GCC ・現在行っていること (1)SH7144のA/Dを10bit、PΦ/8で連続スキャンモードにし、CMTを8msec(センサの応答20msecの2.5倍でサンプリング)で割り込みさせてA/Dの結果をUARTでPCに出力。 (2)UART割り込みでサーボを90°回転。このときサーボ回転開始時と停止時に"S"と"E"をPCに出力し、サーボの回転時間を計算できるようにしておく。 (3)SH7144からのUART出力をPCのハイパーターミナルでテキストキャプチャして結果をexcelに入力。 (4)excelにてA/Dの結果→電圧→角速度→角度を計算。同時にサーボの回転時間と角度から平均角速度を算出して比較。 現在抱えている問題 (1)角速度計算結果について 今回使用しているジャイロキットの場合、角速度を求める式は下記の式であっているでしょうか?キットの回路は村田製作所から出ている増幅回路例と同じです。 ENC-03Rのカタログ http://​www.murata.co.jp/catalog/s42.pdf​ 角速度=(A/D出力-静止時出力)*(3.38/1024)/(感度*ローパスフィルタの増幅度) ※静止時出力=静止時のA/D出力をあらかじめメモして代入  感度=0.00067[V/deg/sec]  ローパスフィルタの増幅度=10[倍](カタログの回路図より直流増幅度) 参考URL http://okwave.jp/qa3523603.html?ans_count_asc=0 http://www.hokutodenshi.co.jp/PUPPYSupportPage/soft/status/status.html (2)センサーからの出力について ・他の人のホームページを見た感じのセンサの出力                          /\               /    \ ↑センサ出力    /       \ 静止電圧___/           \                          \/ ̄ ̄ ̄     →時間 参考URL http://tkstechnology.web.fc2.com/robot/system/enc_03.html ・私の持っているジャイロキットの出力                          /\               /    \ ↑センサ出力    /       \ 静止電圧___/           \                          \       / ̄ ̄ ̄                            \    /                             \  /                              \/     →時間 上記のような出力のせいか、積分の式が間違っているのか、または別の問題か積算していくうちに角度の計算結果が0付近に戻ってしまいます 。 (3)積分について 数値積分の表記は下記のようであっているでしょうか。 C風表記 kakudo = kakudo + (kakusokudo_s + kakusokudo) * (t / 2); kakusokudo_s = kakusokudo; (上記をタイマで繰り返す) ※kakudo:角度(初期値0)[deg]  kakusokudo_s:一回前のサンプリング時の角速度(初期値0)[deg/sec]  kakusokudo:サンプリングした角速度(初期値0)[deg/sec]  t:サンプリングタイム[sec] excel風表記 角度 = 1セル前の角度 + (1セル前の角速度 + 角速度) * (サンプリングタイム / 2) (2)の問題で、時間がたつにつれて計算結果が0付近になってしまうのも問題なのですが、サンプリングタイムに0.008[sec]を代入しても、角度の値が出てこなくて困っています。

  • ジャイロセンサーの繰り返し誤差の補正について

    マイコン初心者です。 SH7144のA/Dコンバーターにジャイロセンサーを接続し、ジャイロの出力を積分して、角度を求めようとしました。下記のコードで、積分値は出せたのですが、ジャイロを一度傾けて元に戻しても初期値に戻らず、オフセットが残ってしまいます。積分前の出力を見ると、CW側にジャイロを回すと、CW側に値が振れた後にCCW側へ少し値が振れているようなので、角速度のデータから来る誤差じゃないかと自分では仮説を立ててみたものの、その補正のところでつまづいてしまいました。 質問はCだけの問題ではないかもしれませんが、組み込みでジャイロセンサーを扱った経験のある方がいましたら、ご教授をお願いいたします。 ジャイロセンサーは村田製作所製圧電振動ジャイロ、ジャイロスターを使用し、カタログに載っているハイパスフィルタとローパスフィルタを通して、SH7144のA/Dコンバーターへ接続しています。 ・ジャイロスターのカタログ ttp://www.murata.co.jp/catalog/s42.pdf 角速度はコンペアマッチタイマを使用し、ノイズ対策のためにCMT0で角速度の平均値を計算しています。CMT0は0.8msecごとにで割り込みが発生するように設定し、main()ではタイマのカウンタを開始するコードのみを書いています。下記にCMT0割り込みのコードを示します。 void int_cmi0(void) { unsigned static int t_ave = 0; static short int adc0_buffer[3] = {0, 0, 0}; unsigned short int i; unsigned static short int count0 = 1; adc0_buffer[0] = adc0_buffer[0] + AD0.ADDR0.BYTE; adc0_buffer[1] = adc0_buffer[1] + AD0.ADDR1.BYTE; adc0_buffer[2] = adc0_buffer[2] + AD0.ADDR2.BYTE; t_ave++; if( t_ave > 100) //AD0のADDR0~2の100回平均を求めています { for(i = 0; i < 3; i ++) { data_adc0[i] = (adc0_buffer[i] / t_ave) - 109; //"109"は静止時の出力電圧を示しています if(-3 <= data_adc0[i] && data_adc0[i] <= 3) //平均しても振れてしまう値の分をカットしています { data_adc0[i] = 0; } adc0_buffer[i] = 0; if(count0 > 89) //電源投入時にdata_adc0[]の値が安定しないため、最初の10個のデータを捨てています。 { count0 = 100; } else { count0++; data_adc0[i] = 0; } } t_ave = 0; } CMT0.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } 角度は、CMT1を使用し、8msecの間隔で割り込みを発生させ計算しています。最終的な計算結果は、SH7144のSCIを使用して、PCのハイパーターミナルに表示しています。 void int_cmi1(void) { static short int adc0_buffer_s[3] = {0, 0, 0}; //角速度の初期値を入れるバッファです  unsigned static short int count1 = 1;  short int i; for(i = 0; i < 3; i ++) { data_adc0i[i] =data_adc0i[i] + ((adc0_buffer_s[i] + data_adc0[i]) / 2); //積分を行う部分です。最終的に制御用のゲインにしようと考えているので、時間項8msecは明記していないです。 adc0_buffer_s[i] = data_adc0[i]; if(count1 > 89) //角速度と同様最初の10個のデータは0にしています { count1 = 100; } else { count1++; data_adc0i[i] = 0; } } CMT1.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } main()では、各機能のイニシャライズと各CMTのカウンタ動作を開始するコードのみを書いています。ハイパーターミナルで動作が見れているので、各機能は動作していると思います。 void main(void) { initIO(); //各機能のイニシャライズです。 initINT(); initSCI(); initADC(); initCMT(); CMT.CMSTR.BIT.STR0 = 1; //CMT0カウント開始 CMT.CMSTR.BIT.STR1 = 1; //CMT1カウント開始 while(1); }

  • ジャイロセンサーの繰り返し誤差の補正について

    マイコン初心者です。 SH7144のA/Dコンバーターにジャイロセンサーを接続し、ジャイロの出力を積分して、角度を求めようとしました。下記のコードで、積分値は出せたのですが、ジャイロを一度傾けて元に戻しても初期値に戻らず、オフセットが残ってしまいます。積分前の出力を見ると、CW側にジャイロを回すと、CW側に値が振れた後にCCW側へ少し値が振れているようなので、角速度のデータから来る誤差じゃないかと自分では仮説を立ててみたものの、その補正のところでつまづいてしまいました。 質問はCだけの問題ではないかもしれませんが、組み込みでジャイロセンサーを扱った経験のある方がいましたら、ご教授をお願いいたします。 ジャイロセンサーは村田製作所製圧電振動ジャイロ、ジャイロスターを使用し、カタログに載っているハイパスフィルタとローパスフィルタを通して、SH7144のA/Dコンバーターへ接続しています。 ・ジャイロスターのカタログ ttp://www.murata.co.jp/catalog/s42.pdf 角速度はコンペアマッチタイマを使用し、ノイズ対策のためにCMT0で角速度の平均値を計算しています。CMT0は0.8msecごとにで割り込みが発生するように設定し、main()ではタイマのカウンタを開始するコードのみを書いています。下記にCMT0割り込みのコードを示します。 void int_cmi0(void) { unsigned static int t_ave = 0; static short int adc0_buffer[3] = {0, 0, 0}; unsigned short int i; unsigned static short int count0 = 1; adc0_buffer[0] = adc0_buffer[0] + AD0.ADDR0.BYTE; adc0_buffer[1] = adc0_buffer[1] + AD0.ADDR1.BYTE; adc0_buffer[2] = adc0_buffer[2] + AD0.ADDR2.BYTE; t_ave++; if( t_ave > 100) //AD0のADDR0~2の100回平均を求めています { for(i = 0; i < 3; i ++) { data_adc0[i] = (adc0_buffer[i] / t_ave) - 109; //"109"は静止時の出力電圧を示しています if(-3 <= data_adc0[i] && data_adc0[i] <= 3) //平均しても振れてしまう値の分をカットしています { data_adc0[i] = 0; } adc0_buffer[i] = 0; if(count0 > 89) //電源投入時にdata_adc0[]の値が安定しないため、最初の10個のデータを捨てています。 { count0 = 100; } else { count0++; data_adc0[i] = 0; } } t_ave = 0; } CMT0.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } 角度は、CMT1を使用し、8msecの間隔で割り込みを発生させ計算しています。最終的な計算結果は、SH7144のSCIを使用して、PCのハイパーターミナルに表示しています。 void int_cmi1(void) { static short int adc0_buffer_s[3] = {0, 0, 0}; //角速度の初期値を入れるバッファです  unsigned static short int count1 = 1;  short int i; for(i = 0; i < 3; i ++) { data_adc0i[i] =data_adc0i[i] + ((adc0_buffer_s[i] + data_adc0[i]) / 2); //積分を行う部分です。最終的に制御用のゲインにしようと考えているので、時間項8msecは明記していないです。 adc0_buffer_s[i] = data_adc0[i]; if(count1 > 89) //角速度と同様最初の10個のデータは0にしています { count1 = 100; } else { count1++; data_adc0i[i] = 0; } } CMT1.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } main()では、各機能のイニシャライズと各CMTのカウンタ動作を開始するコードのみを書いています。ハイパーターミナルで動作が見れているので、各機能は動作していると思います。 void main(void) { initIO(); //各機能のイニシャライズです。 initINT(); initSCI(); initADC(); initCMT(); CMT.CMSTR.BIT.STR0 = 1; //CMT0カウント開始 CMT.CMSTR.BIT.STR1 = 1; //CMT1カウント開始 while(1); }

  • ジャイロセンサーの繰り返し誤差の補正について

    マイコン初心者です。 SH7144のA/Dコンバーターにジャイロセンサーを接続し、ジャイロの出力を積分して、角度を求めようとしました。下記のコードで、積分値は出せたのですが、ジャイロを一度傾けて元に戻しても初期値に戻らず、オフセットが残ってしまいます。積分前の出力を見ると、CW側にジャイロを回すと、CW側に値が振れた後にCCW側へ少し値が振れているようなので、角速度のデータから来る誤差じゃないかと自分では仮説を立ててみたものの、その補正のところでつまづいてしまいました。 質問はCだけの問題ではないかもしれませんが、組み込みでジャイロセンサーを扱った経験のある方がいましたら、ご教授をお願いいたします。 ジャイロセンサーは村田製作所製圧電振動ジャイロ、ジャイロスターを使用し、カタログに載っているハイパスフィルタとローパスフィルタを通して、SH7144のA/Dコンバーターへ接続しています。 ・ジャイロスターのカタログ ttp://www.murata.co.jp/catalog/s42.pdf 角速度はコンペアマッチタイマを使用し、ノイズ対策のためにCMT0で角速度の平均値を計算しています。CMT0は0.8msecごとにで割り込みが発生するように設定し、main()ではタイマのカウンタを開始するコードのみを書いています。下記にCMT0割り込みのコードを示します。 void int_cmi0(void) { unsigned static int t_ave = 0; static short int adc0_buffer[3] = {0, 0, 0}; unsigned short int i; unsigned static short int count0 = 1; adc0_buffer[0] = adc0_buffer[0] + AD0.ADDR0.BYTE; adc0_buffer[1] = adc0_buffer[1] + AD0.ADDR1.BYTE; adc0_buffer[2] = adc0_buffer[2] + AD0.ADDR2.BYTE; t_ave++; if( t_ave > 100) //AD0のADDR0~2の100回平均を求めています { for(i = 0; i < 3; i ++) { data_adc0[i] = (adc0_buffer[i] / t_ave) - 109; //"109"は静止時の出力電圧を示しています if(-3 <= data_adc0[i] && data_adc0[i] <= 3) //平均しても振れてしまう値の分をカットしています { data_adc0[i] = 0; } adc0_buffer[i] = 0; if(count0 > 89) //電源投入時にdata_adc0[]の値が安定しないため、最初の10個のデータを捨てています。 { count0 = 100; } else { count0++; data_adc0[i] = 0; } } t_ave = 0; } CMT0.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } 角度は、CMT1を使用し、8msecの間隔で割り込みを発生させ計算しています。最終的な計算結果は、SH7144のSCIを使用して、PCのハイパーターミナルに表示しています。 void int_cmi1(void) { static short int adc0_buffer_s[3] = {0, 0, 0}; //角速度の初期値を入れるバッファです  unsigned static short int count1 = 1;  short int i; for(i = 0; i < 3; i ++) { data_adc0i[i] =data_adc0i[i] + ((adc0_buffer_s[i] + data_adc0[i]) / 2); //積分を行う部分です。最終的に制御用のゲインにしようと考えているので、時間項8msecは明記していないです。 adc0_buffer_s[i] = data_adc0[i]; if(count1 > 89) //角速度と同様最初の10個のデータは0にしています { count1 = 100; } else { count1++; data_adc0i[i] = 0; } } CMT1.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } main()では、各機能のイニシャライズと各CMTのカウンタ動作を開始するコードのみを書いています。ハイパーターミナルで動作が見れているので、各機能は動作していると思います。 void main(void) { initIO(); //各機能のイニシャライズです。 initINT(); initSCI(); initADC(); initCMT(); CMT.CMSTR.BIT.STR0 = 1; //CMT0カウント開始 CMT.CMSTR.BIT.STR1 = 1; //CMT1カウント開始 while(1); }

  • ジャイロセンサーの繰り返し誤差の補正について

    マイコン初心者です。 SH7144のA/Dコンバーターにジャイロセンサーを接続し、ジャイロの出力を積分して、角度を求めようとしました。下記のコードで、積分値は出せたのですが、ジャイロを一度傾けて元に戻しても初期値に戻らず、オフセットが残ってしまいます。積分前の出力を見ると、CW側にジャイロを回すと、CW側に値が振れた後にCCW側へ少し値が振れているようなので、角速度のデータから来る誤差じゃないかと自分では仮説を立ててみたものの、その補正のところでつまづいてしまいました。 質問はCだけの問題ではないかもしれませんが、組み込みでジャイロセンサーを扱った経験のある方がいましたら、ご教授をお願いいたします。 ジャイロセンサーは村田製作所製圧電振動ジャイロ、ジャイロスターを使用し、カタログに載っているハイパスフィルタとローパスフィルタを通して、SH7144のA/Dコンバーターへ接続しています。 ・ジャイロスターのカタログ ttp://www.murata.co.jp/catalog/s42.pdf 角速度はコンペアマッチタイマを使用し、ノイズ対策のためにCMT0で角速度の平均値を計算しています。CMT0は0.8msecごとにで割り込みが発生するように設定し、main()ではタイマのカウンタを開始するコードのみを書いています。下記にCMT0割り込みのコードを示します。 void int_cmi0(void) { unsigned static int t_ave = 0; static short int adc0_buffer[3] = {0, 0, 0}; unsigned short int i; unsigned static short int count0 = 1; adc0_buffer[0] = adc0_buffer[0] + AD0.ADDR0.BYTE; adc0_buffer[1] = adc0_buffer[1] + AD0.ADDR1.BYTE; adc0_buffer[2] = adc0_buffer[2] + AD0.ADDR2.BYTE; t_ave++; if( t_ave > 100) //AD0のADDR0~2の100回平均を求めています { for(i = 0; i < 3; i ++) { data_adc0[i] = (adc0_buffer[i] / t_ave) - 109; //"109"は静止時の出力電圧を示しています if(-3 <= data_adc0[i] && data_adc0[i] <= 3) //平均しても振れてしまう値の分をカットしています { data_adc0[i] = 0; } adc0_buffer[i] = 0; if(count0 > 89) //電源投入時にdata_adc0[]の値が安定しないため、最初の10個のデータを捨てています。 { count0 = 100; } else { count0++; data_adc0[i] = 0; } } t_ave = 0; } CMT0.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } 角度は、CMT1を使用し、8msecの間隔で割り込みを発生させ計算しています。最終的な計算結果は、SH7144のSCIを使用して、PCのハイパーターミナルに表示しています。 void int_cmi1(void) { static short int adc0_buffer_s[3] = {0, 0, 0}; //角速度の初期値を入れるバッファです  unsigned static short int count1 = 1;  short int i; for(i = 0; i < 3; i ++) { data_adc0i[i] =data_adc0i[i] + ((adc0_buffer_s[i] + data_adc0[i]) / 2); //積分を行う部分です。最終的に制御用のゲインにしようと考えているので、時間項8msecは明記していないです。 adc0_buffer_s[i] = data_adc0[i]; if(count1 > 89) //角速度と同様最初の10個のデータは0にしています { count1 = 100; } else { count1++; data_adc0i[i] = 0; } } CMT1.CMCSR.BIT.CMF = 0; //コンペアマッチフラグをクリア } main()では、各機能のイニシャライズと各CMTのカウンタ動作を開始するコードのみを書いています。ハイパーターミナルで動作が見れているので、各機能は動作していると思います。 void main(void) { initIO(); //各機能のイニシャライズです。 initINT(); initSCI(); initADC(); initCMT(); CMT.CMSTR.BIT.STR0 = 1; //CMT0カウント開始 CMT.CMSTR.BIT.STR1 = 1; //CMT1カウント開始 while(1); }