• 締切済み

C言語についてです。(PWM)

申し訳ありません。困っています。プログラムの勉強をしているのですが・・・ 三角波比較法により、ゲート信号を出力するプログラムです。 53: void pev_inverter_set_syncint(int bdn, float tpre); ・ ・ 55: pev_inverter_start_pwm( bdn, ch); プログラムではPWMのところにキャリア同期割り込み時間の設定関数を使っています。 53: void pev_inverter_set_syncint(int bdn, float tpre); キャリア同期割り込みをキャリアの山、または谷の前tpre[μs]時間前に発生するようにセットします。tpre:割り込みタイミングのオフセット[μs]、0~キャリア周期の半分」 55: pev_inverter_start_pwm( bdn, ch); キャリア同期割り込み信号出力の開始を行う関数。 キャリア同期割り込み信号の「山」の部分で割り込みが発生する。 質問です。 (1)キャリア同期割り込み信号とは、三角波のことなんでしょうか? (2)55行目で割り込みのタイミングを設定しているのに、53行目はなぜ必要なのですか? (3)tpre時間の意味がよく分かりません。PWMにどう関係していますか? 僕の浅はかな考えなんですが・・・簡単に言うと 53行目で、キャリア同期割り込み信号の準備をして 55行目で、実際にキャリア同期割り込み信号を出力する そして、u,v,w相の電圧の値と比較して、ゲート信号を作成する という考えであっているんでしょうか?すいません。誰か教えてくれませんか?

みんなの回答

noname#224896
noname#224896
回答No.1

質問されるコーナーを間違っています. こちらでご質問されると,確実に,こちらよりお返事が早いです. ↓ 技術者向け http://okwave.jp/c205.html

2u8fFdD4
質問者

お礼

なるほどです。 わざわざありがとうございました。さっそく質問してみます。

関連するQ&A

  • C言語について(PWM)

    申し訳ありません。困っています。プログラムの勉強をしているのですが・・・ 三角波比較法により、ゲート信号を出力するプログラムです。 53: void pev_inverter_set_syncint(int bdn, float tpre); ・ ・ 55: pev_inverter_start_pwm( bdn, ch); プログラムではPWMのところにキャリア同期割り込み時間の設定関数を使っています。 53: void pev_inverter_set_syncint(int bdn, float tpre); キャリア同期割り込みをキャリアの山、または谷の前tpre[μs]時間前に発生するようにセットします。tpre:割り込みタイミングのオフセット[μs]、0~キャリア周期の半分」 55: pev_inverter_start_pwm( bdn, ch); キャリア同期割り込み信号出力の開始を行う関数。 キャリア同期割り込み信号の「山」の部分で割り込みが発生する。 質問です。 (1)キャリア同期割り込み信号とは、三角波のことなんでしょうか? (2)55行目で割り込みのタイミングを設定しているのに、53行目はなぜ必要なのですか? (3)tpre時間の意味がよく分かりません。PWMにどう関係していますか? 僕の浅はかな考えなんですが・・・簡単に言うと 53行目で、キャリア同期割り込み信号の準備をして 55行目で、実際にキャリア同期割り込み信号を出力する そして、u,v,w相の電圧の値と比較して、ゲート信号を作成する という考えであっているんでしょうか?すいません。誰か教えてくれませんか?

  • パルス幅変調(PWM)用ICを教えてください

    PWM発生用ICを探しています。 ネットで数社ほどみてみましたが見つかりませんでした。 PWMを作る方法としてはNE555の出力端子から三角波を取り出し アナログ信号のレベルとコンパレータで比較すればよいわけ ですが、発振周波数の精度を上げるため水晶を使いたいので NE555は使えません。 水晶で方形波を発振させて三角波を作れるICで、アナログ信号 を入力すればPWM出力が得られるような単電源のICはないでしょうか。 発振周波数は上限が200KHz程度が希望です。 ご存じの方、よろしくおねがいします。

  • PWM信号の切り替わり時間について

    今、PWM制御回路をアナログ回路で考えています。 コンパレータを使い、三角波発振回路と基準電圧で比較してPWM波形を出力して、デューティを可変抵抗で調整できるようなものを考えています。 そこで、PWM信号をHigh→Low、Low→Highへ切り替わる時間を3nsほどにしたいのですが、アナログ回路でこの値で切り替わるようにするには、どのような設計をすればいいのでしょうか? 今調べているのですが、まだわかっておりません。 もしよろしければアドバイスを頂けたら幸いです。

  • PICのPWMの正しい使い方について教えてください

    PIC12F1822用のPWMの基本動作テストプログラムを作りましたが、PWM出力が意図どおりに得られません。 (XC8のテストプログラムを下に添付。テストパターン1/2の切り替えはコメントアウトをお願いします。  アナライザの出力を画像で添付しました。) テスト目的: タイマー0の周期割り込みに合わせて、PWMのデューティー比(または周期)を変更するプログラム   テストパターン 1 : パルスのデューティー比を変えるテスト 質問1: パルスのデューティー比を変えるテストは、PWM設定の一回おきにCCPからのPWMの出力が出ません テストパターン 2 : パルスの周波数を変えるテスト 質問2: 周波数を変えるテストはOKに見えるものの、1回目のPWMがHighとなるのと、割り込みの11回目、13回目あたりでPWM出力が欠落する 【回答のお願い】 どうも、PWMのレジスタ設定に手順、またはタイミングがあるのではないかと思いますが、原因がわからず困っております。 PICに詳しい方からのご指導をよろしくお願いいたします。                                    K.A. ------------------------------------------------------ /* * File: PIC12F1822 PWC * Author: K.A. * * Created on 2014/07/20 * * タイマー0の周期割り込みに合わせて、PWMのデューティー比(または周期)を変更するプログラム * */ #include <stdio.h> #include <stdlib.h> #include <xc.h> #pragma config FOSC=INTOSC, WDTE=OFF, PWRTE=ON, BOREN=ON, MCLRE=OFF #define _XTAL_FREQ 8000000 // クロック8MHz /* * */ // タイマー割込みの処理 int TMR0_Count = 0; // タイマーの割込み発生回数をカウントする変数 void interrupt Timer0(void) { // タイマー0の割込み発生か? Timer0 は 8bitの オーバーフロー・カウンタ if (TMR0IF == 1) { TMR0_Count++; if (TMR0_Count > 5) { TMR0_Count = 0; if (RA5 == 0) RA5 = 1; else RA5 = 0; // RA5は、動作表示用LED } TMR0IF = 0; // タイマー0割込フラグをリセット } } int main(int argc, char** argv) { unsigned int pulse_width = 5; OSCCON = 0b01110010; // 内部クロックは8MHz ANSELA = 0b00000000; // すべてをデジタルI/Oに割当 TRISA = 0b00001000; // すべてのピンは出力に割当てる(RA3は入力専用) PORTA = 0b00000000; // 出力ピンの初期化(全て'0'にする) RA5 = 0; // 動作確認用LED // Timer0  Timer0 は 8bitの オーバーフロー・カウンタ OPTION_REG = 0b00000001; // 内部クロックでTIMER0を使用、プリスケーラカウント値 1:2 // bit5:0=Fosc/4, bit3:0=PreScaler_ON, bit2-0:PreScaler TMR0 = 0; // タイマー0の初期化 (+2cycle) TMR0IF = 0; // タイマー0割込フラグを0にする TMR0_Count = 0; // 割込み発生の回数カウンターを0にする TMR0IE = 1; // タイマー0割込みを許可する GIE = 1; // 1: 全割込み処理を許可する /* PWM */ TRISA2 = 1; // RA2 出力をサスペンド TMR2IF = 0; // TMR2 フラグをクリア CCP1SEL = 0b0; // CCP1/P1Aの機能をRA2に割り当てる CCP1CON = 0x0C; // PWM モード // Period を 設定する xx ms=((PR2)+1)*4*125ns(8MHz)* PreScaler(x1-x64) PR2 = 127; // 4.096ms (プリスケーラが x64 の場合) T2CKPS0 = 0b1; // プリスケーラ 00:x1, 01:x4, 10:x16, 11:x64 T2CKPS1 = 0b1; // CCPR1L = pulse_width >> 2; // パルス幅上位8bit CCP1CON = ((pulse_width & 0x0003) << 4) | 0x0C; // パルは幅下位2bit TMR2ON = 1; // TMR2 カウント開始 while (TMR2IF == 0) { /** / do nothing /**/ } TRISA2 = 0; // RA2に出力を接続 while (1) { if (TMR0_Count == 0) { /**** テストパターン 1 : パルスのデューティー比を変えるテスト ****/ // パルスのデューティー比を変えるテストは、PWM設定の一回おきにCCPがPWMの出力が出ません。 なぜ? pulse_width = pulse_width + 10; if (pulse_width > 500) pulse_width = 5; /**/ /**** テストパターン 2 : パルスの周波数を変えるテスト **** / // 周波数を変えるテストはOKに見えるが、 // 1回目のPWMがHighとなるのと、割り込みの11回目、13回目あたりでPWM出力が欠落する PR2 = PR2 - 8 ; if (PR2 < 8) PR2 = 127; pulse_width = PR2 ; // Duty 25% に相当 /**/ CCPR1L = pulse_width >> 2; CCP1CON = ((pulse_width & 0x0003) << 4) | 0x0C; TMR0_Count++; // 続けて PWMの設定変更をしないためのフラグ代わり } } return (EXIT_SUCCESS); }

  • インバーター(PWM)の出力波形

    (1)  書物から、電圧形電流制御型のPWM制御のインバーター出力は、電圧波形が方形波、電流波形がほぼ正弦波、そして、この方式が太陽光発電機のパワコンに多く用いられている、と学びました。  しかし、商用電圧が正弦波なのに、パワコンの出力が方形波では、同期が取れず系統連系できないはず、と思いますが、問題ないのでしょうか。  それとも、実は、電圧波形は方形波ではなく正弦波なのでしょうか。 (2) パワコン出力波形(電圧と電流)の分かるサイトも教示いただければ幸いです。

  • C言語について

    #include_<stdio.h> void_gyouRtn(int_hen,int_ln,int_maxl); int_main(void){ __int___hen;__//_辺の長さ(文字数) __int___ln;___//_出力行番号(1,2,..,maxl) __int___maxl;_//_出力行数 __//_最初の入力 __printf("数字2~9を入力してください:"); __scanf("%d",_&hen); __//_規則外の入力への対応 __while(hen_<_2_||_hen_>_9){ ____printf("※入力エラー!!_2~9を入力してください:"); ____scanf("%d",_&hen); __} __//_計算と出力 __maxl_=_3*hen-2;_____________//_行数=3*辺の桁数-2 __for(ln=1;ln<=maxl;ln++)_{___//_行1から逐一実行 ____gyouRtn(hen,ln,maxl);_____//_行の一括処理出力 __} __//_終了 __return_0; } //_行ごとの出力半巾(桁)を与えます //_中心位置±半巾の位置に●を置く予定 int_maxkRtn(int_hen,int_ln,int_maxl){ __int___maxk;_//_半巾の文字数 __//_垂直辺を無視した巾 __if(ln<=maxl/2)_{__//_上半分のとき ____maxk_=_ln-1;____//_lnと共に増加、最初は0 __}_else_{__________//_下半分のとき ____maxk_=_maxl-ln;_//_lnと共に減少、最後は0 __} __//_垂直辺で切る __if(maxk>hen-1)_maxk_=_hen-1; __//_水平辺の半分を加える __maxk_+=_hen/2;____//_hen_が偶数ならmaxk*2==hen ____________________//_奇数なら_maxk*2_==_hen-1 __return_maxk; } //_行の準備と出力を制御、実行します void_gyouRtn(int_hen,int_ln,int_maxl){ __int_kt;___//_桁(文字)位置 __int_maxk;_//_行lnでの半巾、後に行の右端 __int_mink;_//_行での図形の左端位置 __int_cent;_//_縦の中心軸の位置 __maxk_=_maxkRtn(hen,ln,maxl);_//_この行での半巾 __if(hen==2*(hen/2))_{____//_辺が偶数桁 ____cent_=_maxl/2;________//_左半分の右端 ____mink_=_cent-maxk+1;___//_図形の左端 __}_else_{________________//_辺が奇数桁 ____cent_=_maxl/2+1;______//_左と右の間の1桁 ____mink_=_cent-maxk;_____//_図形の左端 __} __maxk_=_cent+maxk;_______//_図形の右端 __//_出力開始 __kt_=_1; __while(kt_<=_maxk){ ____if(1<ln_&&_ln<maxl)_{_//_上下辺以外 ______if(kt_!=_mink_&&_kt_!=_maxk){_//_図形位置以外 ________printf("□"); ______}else{________________________//_図形位置 ________printf("●"); ______} ____}_else_{______________//_上下辺 ______if(kt<mink)_{_________________//_図形位置以外 ________printf("□"); ______}_else_{______________________//_図形位置 ________printf("●"); ______} ____} ____kt++; __} __printf("\n"); } これは添付画像の八角形を表示するプログラムなのですが、これと同様のプログラムで添付画像の*形を表示するプログラムを教えてください。 (「同様」というのは、これ以上の"機能"を一切使わないという意味です。) mainの部分は上記のプログラムとほぼ同じなので大丈夫なのですが、下部の関数部分がわかりません。 関数部分で今考えているアルゴリズムは…  (1)行ごとの出力桁数を与える(中心線±(n-1)/2)  (2)1行目から中心行の前までは、左端・中心・右端に"●"を出力  (3)中心行には、n個だけ"●"を出力  (4)それ以降の行は、(2)と同じ …という感じです。 もちろん、(1)で出力桁数を与える時には、1行目~(n/2-1)行目までは左右1ずつ幅が減り、(n/2+1)行目~n行目までは左右1ずつ増えるようにします。 このアルゴリズムでプログラムを組みたいのですが、どうも難しくてできません。どうか教えてください。

  • ゲートドライブ回路について

    今、パワーエレクトロニクスについて学んでいるのですが、PWMインバータの制御でゲートドライブ回路でフォトカプラを用いて、オン、オフ信号を入力しているのですが、何故ゲートドライブ回路を用いるのでしょうか?オン、オフ信号なら光受信回路でできるのではないでしょうか?分かりにくい質問ですみません。お願いします。

  • PWMインバータにおけるデッドタイムの相電圧に対する影響

    今回は、PWMインバータのデッドタイムが 「相電圧にどのように影響するのか」、 その原理を伺いたく投稿させていただきました。 PWMインバータは一般的にデッドタイムを考慮し スイッチング制御していると思います。 そこで実際に実験ユニットでデッドタイムを 設定し、測定をしてみました。 (正弦波・三角波比較変調にて) すると、出力相電圧がデッドタイム時間だけ 遅れて立ち上がり、「+1/2E」「-1/2E」の2レベルの パルス波形となっていました。 (電源の中性点をグランドに取った場合) これは参考書などの原理と合っています。 しかし、私はどうも納得できません・・・。 デッドタイムの間は「上スイッチ・下スイッチ」が 両者ともオフしているということは、その時間の 出力相電圧は零レベルになるのでは・・・?。 つまり相電圧は「+1/2E」「0」「-1/2E」の 3レベルとなるパルス波形になると考えていました。 なぜこのような現象が起きず、デッドタイム分だけ 綺麗に相電圧の立ちあがりが遅れるのでしょうか? この原理を知っている方がいれば、 教えていただけますでしょうか? 分かりにくい説明で申し訳ございませんが どうか宜しくお願いいたします。

  • C言語におけるtxtファイルの読み込みと出力

    環境:WinXP,Borland C++compiler 以下のようなプログラムを考えました。 ・sample.c #include <stdio.h> float func(float x,float y,float z); int main(void) { float x,y,z; scanf("%f",&x); scanf("%f",&y); scanf("%f",&z); printf("%f",func(x,y,z)); return 0; } float func(float x,float y,float z) { return x+y+z; }//ここまで。 例えば(x,y,z)=(1,2,3)と入力すると6が出力されます。 このプログラムを、任意のn組の(x,y,z)の記述されたテキストファイルを読み込んで出力outを計算し、別のテキストファイルにn組の(x,y,z,out)を書き込むようにするにはどのような変更を加えればよいのでしょうか。 具体例は以下のような感じです。用意しておいたinput.txtをsample.cで読み込んで計算し、また作成されていないoutput.txtに出力するのが目標です。 (n=3の場合) ・input.txt //x y z 1 2 3 1 8 9 -1 7 5 ・output.txt //x y z out 1 2 3 6 1 8 9 18 -1 7 5 11

  • インバータの変調方式に関する質問

    インバータの変調方法、特にPWM方式についての質問です。PWM方式には、三角波比較法と空間電圧ベクトル変調法がありますが、モータ制御の際にどちらの方式を用いるかによって、インバータから出力される電圧、 電流、周波数、モータの駆動に何か違いは生じるのでしょうか。また、モータ制御における三角波比較法と空間電圧ベクトル変調法のメリット・デメリットも教えていただきたいです。

専門家に質問してみよう