sinの配列

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
こーたろー

sinの配列

#1

投稿記事 by こーたろー » 3年前

マイコンでPWMの信号プログラムを作ろうと考えております。
そこでまずは「最大振幅1V,周波数60Hzのsin波データを作成し,sin波振幅値でLED点灯箇所を変更する。
ただし,LEDは7箇所使う。また,sin波のサンプリング間隔に注意すること。」
例)  振幅=0.8~1.0V ; LED_D3点灯
    振幅=0.6~0.8V ; LED_D4点灯
    振幅=0.4~0.6V ; LED_D5点灯
    振幅=-0.4~0.4V ; LED_D6点灯
........
という課題に取り組んでいます。

しかし、下記プログラムでは、配列をうまく使っていないとの指摘があり、お手上げです。

下記プログラムの修正、課題を用いてPWMの信号プログラムを教えていただければと思います。

マイコンにもお詳しいのであれば、再度投稿で質問させてください。
よろしくお願いします。


コード:

#include<stdio.h>
#include<math.h>

#define N (99)

void main(void)
{
	int i = 0;
	double a[N], b[N], c[N], pi, t;
	pi = 4 * atan(1.0);
	printf("     時間     ωt     sinwt\n");
	for (t = 0; t < 0.01666666; t = t + 0.0001666666) {
		a[N] = t;
		b[N] = 120 * pi * t;
		c[N] = sin(b[N]);

		printf("%5.4lf     %5.4lf        %5.4lf   \n", a[N], b[N], c[N]);

	}

}

アバター
みけCAT
記事: 6734
登録日時: 13年前
住所: 千葉県
連絡を取る:

Re: sinの配列

#2

投稿記事 by みけCAT » 3年前

まず致命的な点として、現状では配列a, b, cはN要素(添字は0~N-1)しか無いので、
a[N], b[N], c[N]にアクセスしてはいけません。

さらに、浮動小数点演算は誤差を含むので、
ループは整数で回し、最大値と現在の値の比を用いて計算する方がいいでしょう。

コード:

#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;
	pi = 4 * atan(1.0);
	printf("     時間     ωt     sinwt\n");
	for (i = 0; i <= N; i++) {
		t = 0.01666666 * i / (N + 1);
		a[i] = t;
		b[i] = 120 * pi * t;
		c[i] = sin(b[i]);

		printf("%5.4lf     %5.4lf        %5.4lf   \n", a[i], b[i], c[i]);

	}

}
PWMについては、ハードウェアのPWMが使えるマイコンであれば、
計算した-1~1の値を仕様に合わせた適切な電圧(0~2V?)が出る値に変換し、
タイマー割り込みなどを用いて配列の参照する位置を一定間隔でずらしながら、
PWMの出力する電圧(デューティ比)を決めるレジスタに変換した値を書き込むといいでしょう。

PWMではなくまずはsin波の信号の値をLEDの位置で表したいということであれば、
同様にタイマー割り込みなどを用いた一定間隔で配列の参照する位置をずらし、
配列の現在の要素の値に応じて点灯させるLEDを変えるといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

こーたろ_

Re: sinの配列

#3

投稿記事 by こーたろ_ » 3年前

回答ありがとうございます。

では、codeをどのように書き直したらいいでしょうか?

コード:

#include<stdio.h>
#include<math.h>

#define N (99)

void main(void)
{
	int i = 0;
	double a[N], b[N], c[N], pi, t;
	pi = 4 * atan(1.0);
	printf("     時間     ωt     sinwt\n");
	for (t = 0; t < 0.01666666; t = t + 0.0001666666) {
		a[N] = t;
		b[N] = 120 * pi * t;
		c[N] = sin(b[N]);

		printf("%5.4lf     %5.4lf        %5.4lf   \n", a[N], b[N], c[N]);

	}

}


こーたろー

Re: sinの配列

#4

投稿記事 by こーたろー » 3年前

すみません。
見直すと書き直したプログラムを掲載してくださっていたのですね。
ありがとうございます。

返信

“C言語何でも質問掲示板” へ戻る