teacup. [ 掲示板 ] [ 掲示板作成 ] [ 有料掲示板 ] [ ブログ ]

 <思いやりのあるコミュニティ宣言>
 teacup.掲示板は、皆様の権利を守りながら、思いやり、温かみのあるコミュニティづくりを応援します。
 いつもご協力いただきありがとうございます。

 投稿者
  題名
  内容 入力補助画像・ファイル<IMG>タグが利用可能です。(詳細)
    
 URL
[ ケータイで使う ] [ BBSティッカー ] [ 書込み通知 ] [ 検索 ]

スレッド一覧

  1. 足あと帳(0)
スレッド一覧(全1)  他のスレッドを探す 

*掲示板をお持ちでない方へ、まずは掲示板を作成しましょう。無料掲示板作成


Re: のこぎり波作成

 投稿者:こーたろー  投稿日:2020年 7月27日(月)11時35分33秒 softbank126224149003.bbtec.net
返信・引用
  ケンケン様
返信ありがとうございます。

単にソフトウェアでサイン波と三角波を比較したいだけです。

インバータを設計していて、ドライブ回路に「L6384E」スイッチング素子に「2SK4017」を使用することを考えています。

そこで、ドライブ回路にパルス信号を送るプログラムをマイコンで作成しようと考えております。

 
 

Re: Re: のこぎり波作成

 投稿者:ケンケン  投稿日:2020年 7月26日(日)23時18分3秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.865[元記事へ]

こーたろー様

電気的な2つの信号を比較してパルスを生成したいのでしょうか?
それとも単にソフトウェアで実現したいのでしょうか?
ソフトウェアであれば、単にサイン波と三角波を比較してサインが大きければ1、逆は0を配列に代入するだけのことです。
電気信号であれば、PICマイコンにコンパレータが内蔵されていますので、これを使うとよいと思います。

三角波の周波数をM倍するとすれば、こういう感じでしょうか。

#define N 100
#define M 2    // 三角波の周波数をM倍する
#define L (N/(M*2))

for(i=0;i<N;i++){
  if(i/(M*2) & 1){
    d[i]=(double)(i%L)/L;
  }
  else{
    d[i]=(double)(L-i%L)/L;
  }
}

ところで、これはΔΣ変調の課題とかですか?
 

Re: のこぎり波作成

 投稿者:こーたろー  投稿日:2020年 7月25日(土)13時01分24秒 softbank126224138144.bbtec.net
返信・引用
  ケンケン様

修正ありがとうございます。



例で示していただいたプログラムを実行したところ三角波になりました。

添付の画像のようにサイン波とキャリア三角波を作成し振幅を比較したいと考えております。
キャリア三角波の周期をもっと早くしたいのですけど何か方法がありますか?


よろしくお願いします。
 

Re: のこぎり波作成

 投稿者:ケンケン  投稿日:2020年 7月24日(金)23時40分11秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  こーたろー様

気付いたことをいくつか。

・Nは99ではなく100にしたほうが全体として見やすいと思います。
・(double N) は文法エラーです。以前も指摘したと思いますが。
・21行目あたりに t = 0.000166666666 とありますが、0が1つ多いと思います。
 これだと10周期できてしまいますね。

・acosの戻り値は0~πなので、振幅を1にするのであれば、πで割ればよいと思いますが、
 そもそも三角波やのこぎり波を出力するだけなら、そんな複雑な計算をしなくてもよい
 のではないですか?


私ならこう書きます。

#define N 100

//のこぎり波の場合
for(i=0;i<N;i++){
  d[i]=(double)i/N;
}


//三角波の場合
for(i=0;i<N/2;i++){
  d[i]=(double)i*2/N;
}
for( ;i<N;i++){
  d[i]=(double)(N-i)*2/N;
}
 

のこぎり波作成

 投稿者:こーたろー  投稿日:2020年 7月24日(金)22時43分49秒 softbank126224138045.bbtec.net
返信・引用
  ケンケン様

C言語でのこぎり波(キャリア三角波)を作成したいです。振幅は1で周期は600Hz程度を考えています。

私が考えたのは逆三角波(y=acos(cosx))を利用しましたが振幅が1を超えてしまいました。

前回のプログラムを作成しているのでsinのプログラムもそもまま掲載いたします。

修正箇所がお分かりでしたらお教えください。

[code]
#include<stdio.h>
#include<math.h>

#define N (99)

void main(void)
{
int i = 0;
double a[N + 1], b[N + 1], c[N + 1], pi, t,d[N + 1],ra;
pi = 4 * atan(1.0);
printf("     時間     ωt     sinwt    のこぎり波\n");
/*sinωtの計算*/
for (i = 0; i <= N; i++) {
t = 0.01666666 * i / ((double N) + 1);
a[i] = t;
b[i] = 120 * pi * t;
c[i] = sin(b[i]);
}
/*のこぎり波*/
for(i=0;i<=N;i++){
t = 0.000166666666 * i/ ((double N) + 1);
ra = cos(1200 * pi * t);
d[i] =acos(ra);
printf("%4d   %5.4lf     %5.4lf        %5.4lf  %5.4lf \n",i, a[i], b[i], c[i],d[i]);

}

}
[/code]
 

Re: sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月24日(金)22時41分12秒 softbank126224138045.bbtec.net
返信・引用
  ケンケン様
添削ありがとうございます。

おかげさまでサインの振幅によってLEDを点灯させることができました!

本当にありがとうございます。
 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月15日(水)02時05分40秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  > No.860[元記事へ]

こーたろー様

・LCD表示だけのプログラムでは正常に表示されますか?
・何度も書いているようにforループの中にウェイトが入っていません。
 LCDへの出力が正しくできていたとしても、ものすごい速度で書き換えられて読むことは
 できないでしょう。
・かっこ閉じるが一つ足りないようです。ビルドは通ったのでしょうか?
 

Re: sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月13日(月)16時12分33秒 softbank126147189077.bbtec.net
返信・引用 編集済
  ケンケン様
丁寧にご返信いただきありがとうございます。

試しにiとsinをLCDに表示させたところうまく表示できませんでした。

このことからwhile文がループしていませんでした。

しかし、なぜループしていないのかわかりませんでした。




[code]
#include "mcc_generated_files/system.h"
#include "mcc_generated_files/charlcd.h"
#include"mcc_generated_files/led_d3.h"
#include"mcc_generated_files/led_d4.h"
#include"mcc_generated_files/led_d5.h"
#include"mcc_generated_files/led_d6.h"
#include"mcc_generated_files/led_d7.h"
#include"mcc_generated_files/led_d8.h"
#include"mcc_generated_files/led_d9.h"
#include<math.h>

#define N(99)

/*
                         Main application
*/
int main(void)
{ uint8_t i=0;
double ra,a[N+1],pi,t;
pi=4*atan(1.0);
/*for(i=0;i<=N;i++){
    t=0.01666666*i/((double)N+1);
    ra=120*pi,t;
    a[i]=sin(ra);
}*/
    // initialize the device
    SYSTEM_Initialize();
    CHARLCD_Initialize();

    while (1)
    {for(i=0;i<=N;i++){

        if(0.8<a[i]&&a[i]<=1.0) LED_D3_On();
        else LED_D3_Off();
        if(0.6<a[i]&&a[i]<=0.8)LED_D4_On();
        else LED_D4_Off();
        if(0.4<a[i]&&a[i]<=0.6)LED_D5_On();
        else LED_D5_Off();
        if(-0.4<a[i]&&a[i]<=0.4)LED_D6_On();
        else LED_D6_Off();
        if(-0.4<a[i]&&a[i]<=-0.6)LED_D7_On();
        else LED_D7_Off();
        if(-0.6<a[i]&&a[i]<=-0.8)LED_D8_On();
        else LED_D8_Off();
        if(-0.8<a[i]&&a[i]<=-1.0)LED_D9_On();
        else LED_D9_Off();

        printf("i=%4d   sin(ra)=%5.4lf\r"i,a[i]);





   /* }*/

        // Add your application code

    }

    return 1;
}
/**
End of File
*/


[/code]



 

Re: sinの振幅によってLED点灯

 投稿者:ケンケン  投稿日:2020年 7月12日(日)23時36分15秒 NE0356lan33.rev.em-net.ne.jp
返信・引用
  こーたろー様

60Hzで、1周期を100分割するということは、6000分の1秒ごとに出力を更新するということです。
そのためには、出力変更後に6000分の1秒のウェイトをおいて繰り返すか、6000分の1秒ごとに
割り込みを発生させて割り込み内で出力変更するかになります。

ところで、60分の1秒周期というとかなり短くて、肉眼では認識できないと思いますが高速な
カメラで撮影なのですかね。

下記にヒントを載せておきます。

#define N 100
double a[N]


メインルーチン内

for(i=0;i<N;i++){
    a[i]=sin(3.14159*2*(double)i/N);
}

while(1){
    for(i=0;i<N;i++){
        if(0.7<=a[i] && a[i]<=1.0) LED_D3_On();
        else LED_D3_Off();
        if(0.4<=a[i] && a[i]<0.7) LED_D4_On();
        else LED_D4_Off();
        if(0.1<=a[i] && a[i]<0.4) LED_D5_On();
        else LED_D5_Off();
        if(-0.1<=a[i] && a[i]<0.1) LED_D6_On();
        else LED_D6_Off();
        if(-0.4<=a[i] && a[i]<-0.1) LED_D7_On();
        else LED_D7_Off();
        if(-0.7<=a[i] && a[i]<-0.4) LED_D8_On();
        else LED_D8_Off();
        if(-1.0<=a[i] && a[i]<-0.7) LED_D9_On();
        else LED_D9_Off();

//    ここに約1/6000秒のウェイトを入れる


    }

}
 

Re: sinの振幅によってLED点灯

 投稿者:こーたろー  投稿日:2020年 7月12日(日)11時31分15秒 softbank126243071093.bbtec.net
返信・引用 編集済
  ケンケン様
お返事ありがとうございます。

高速にループされてしまうということですが、そうなると、sinの周期を60Hzにしている意味はなくなるということですよね?

できればtを実際の時間の秒カウントにできれば、60Hzが実現するのかなとかんがえております。

修正方法などありましたらよろしくお願いします。
 

レンタル掲示板
/84