質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

932閲覧

エラーコードの対処の仕方が分からない

Thiara

総合スコア14

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2022/12/20 06:17

実現したいこと

ArduinoでPID制御の出力をコメントとしてシリアルモニタに出力して,その波形をグラフにしたいです.

発生している問題・エラーメッセージ

invalid type argument of unary ' * ' (have 'float')

該当のソースコード

#define Kp #define Ki #define Kd #define TARGET 2.0 #define COM_VOL 3.3 #define AVE_NUM 1000 #define INPUTIO 0 #define OUTPUTIO 9 float duty = 0; float dt,preTime; float vol = 0; float vol_sum = 0; float error,P,D,U; float I = 0; float preP = 0; void setup() { Serial.begin(9600); delay(1000); } void loop() { float nowtime = micros()/1000000.; vol_sum = 0; for (int i = 0; i < AVE_NUM ; i++){ vol_sum = vol_sum + analogRead(INPUTIO); } //取得した値は10bitなので,1024で割って電圧に変換をする vol = COM_VOL * (vol_sum / AVE_NUM) / 1024; //PID制御でDUTY比を計算して,デジタルピンに書き込み dt = (micros() - preTime) / 1000000;//時間差分 秒 preTime = micros(); error = TARGET - vol;//偏差 P = error; I = I + P*dt; D = (P - preP) / dt; preP = P; U = Kp * P + Ki * I + Kd * D;//ここでエラーが出ます. if(U > 255) U = 255; if(U < 0) U = 0; duty = duty + (U - duty) * 0.2; analogWrite(OUTPUTIO,duty); Serial.print(nowtime,3);Serial.print(","); Serial.print(dt,3);Serial.print(","); Serial.print(duty,3);Serial.print(","); Serial.print(P,3);Serial.print(","); Serial.print(I,3);Serial.print(","); Serial.print(D,3);Serial.print(","); Serial.print(vol,3); }

試したこと

floatをcharに変更してみましたが,同じ結果でした.エラーの場所をコメント化するとコンパイル出来ました.

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

Arduino

1#define Kp 2#define Ki 3#define Kd

なにも値が書いてませんよ?


#define というのはソースコード中の識別子を置き換えます。

例えば#define Hoge 1であれば、ソースコード中に現れたHoge1で置き換えます。
さて、#define Kp ですが、これは、ソースコード中のKpを消します。

したがって、
U = Kp * P + Ki * I + Kd * D;

U = * P + * I + * D;
に変換されますし、

float Kp = 1;

float = 1;
に変換されます。そして文法エラーになります。

投稿2022/12/20 06:22

編集2022/12/20 06:46
ozwk

総合スコア13553

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Thiara

2022/12/20 06:36

float Kp = 1; float Ki = 1; float Kd = 1;//ここでエラー のような適当な値を追加すれば良いのですか?これを追加した場合, exacted unqualified-id before '=' token と新たなエラーが出ます.
Thiara

2022/12/20 07:39

つまり U = Kp * P + Ki * I + Kd * D; のKp,Ki,Kdの値を変化させて計算したい場合は #define Kp x とし,xにいろいろな値を代入すれば良いということですか?
ozwk

2022/12/20 07:41

はい、 #define Kp 1 などとします
y_waiwai

2022/12/20 08:10

まあ、defineの使い方がわかっていない、ってことなんで、 基本的な文法をしっかり勉強しよう、ということになります
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問