C ++「この範囲で宣言されていません」エラーと変更のヒントをコンパイルする
-
21-09-2019 - |
質問
Arduinoメガで動作させるために、このコードを変更しようとしています。私はCにほとんど慣れていないので、いくつかの大きな間違いを犯したかもしれません。ちなみに、これは自己バランスのとれたスケートボード用です。 :p
このコードはAtmega32から取得されます(from:[url =http://sites.google.com/site/onewheeled selfalancing/home/twin-wheel-self-balance-balance-skate-lightweight-version/code4バージョン/code4 [/url そして、私はそれをArduinoメガで動作させようとしています。
このコードは、Atmega32開発ボードのwritenでしたhttp://www.active-robots.com/products/controllr/m32db.shtml
ありがとうございました!
これが私が遭遇する最初のエラーです:
infunction 'void timer_init()':エラー: 'tccr0'はこの範囲で宣言されていません 'int main()':
誰かが私に何が悪いのかを説明できますか?私はプログラミングの初心者ですが、たくさんの本/ウェブサイトを読んでいて、私も速く学んでいます! ^^そしてここに完全なコードがあります(そのかなり長い):
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <avr/interrupt.h>
#include <math.h>
clock_speed 16000000を定義します
OCR1_MAX 1023を定義します
typedef unsigned char u8; void set_motor_idle(void); void initports(void);フロートレベル= 0; float throttle_pedal;フロートAA;フロートアクセルロー; float x_acc;フロートアキュサム; float x_accdeg;
フロートジャイロサム;
gangleratedegフロート; ganglerateradsフロート;フロートti = 2.2;
全体的にフロート; Float GainControl;フロートバッテリーボルト= 24;フロートジャイロアングルド;フロート角度;フロートアングラダ; float balance_torque;フロートソフトスタート;
float cur_speed; Float Cycle_time = 0.0064; float balance_point; float a0、a1、a2、a3、a4、a5、a6; // savitzky-golay加速度計の変数
int i; int j; int tipstart; void initports(void){portc = 0x00; //ポートCプルアップは、ddrc = 0xffで始まるように低い(出力電圧なし)に設定されています。 //ポートCピンはすべて、ポートC方向レジスタを介して出力として設定されています// portc | =(1
ddra = 0x00; //入力porta = 0x00として設定されたすべてのポートピン。 //入力プルアップが低いプルアップに設定されます
ddrd = 0xff; //すべてのポートDピンをOCR1A(PIND5)およびOCR1B(ピンD4)の前提条件として出力として構成します
portb = 0x00; //ポートBプルアップは、ddrb = 0xffで始まるように低い(出力電圧なし)に設定されています。 //出力に設定されたすべてのポートBピン
} /* io:外部クリスタルクロックでAtmega32 16MHzを使用しています。 OSMCモーターコントローラーへの新しい計画ピン配置PC4オンボードLED PD5/OC1A ALI-> OSMC PIN 6 PD4/OC1B BLI-> OSMC PIN 8 PC1 DISABLE-> OSMC PIN 4 PC2 BHI-> OSMC PIN 7 PC3 AHI-> OSMC PIN 5 5 PA6/ADC6 VBATT/10-> OSMCピン3 PA1/ADC1ピッチレートGyro PA0/ADC0アクセルメーター / void adc_init(void){ / 使用しないので、アナログコンパレータをオフにします / acsr =(1 << acd); / PA0を選択します / admux = 0; admux | =(1 <ADC Prescalerを128に設定し、ADCを有効にし、変換を開始します / adcsra = 0 | (1 < / Bogusの最初の変換が終了するまで */ while(adcsra&(1 << adsc)){}}
uint16_t adc_read(uint8_t channel){
/*チャネルを選択します / admux = channel; admux | =(1 <開始変換 /
adcsra | =(1 << adsc); / コンバージョンが終了するまで待ちます / while(adcsra&(1 << adsc)){} / 結果を返します */ return adcw; }/* 156サイクルあたり156サイクル、オシロスコープで測定されたサイクルあたり6.4ms
uint16_t adc0, adc1, adc2, adc3, adc4, adc5; gyrosum=0; adc0 = adc_read(0); /* accelerometer pin PA0 */ accelraw
=(float)adc0; for(j = 0; j <7; j ++){adc1 = adc_read(1); // gyro pin pa1 gyrosum =(float)gyrosum + adc1; //ジャイロのループごとに平均7サンプルを使用すると、プログラムの各ループで完全な更新が得られます}
adc2 = adc_read(2); /* grey wire overallgain (via cutout switch)
位置pa2*/ adc3 = adc_read(3); /*位置レバープルバックポジションpa3*/ adc4 = adc_read(4); /* throttle_pedal position pa4*/ adc5 = adc_read(5); /*ポジションレバーはPA5*/// ADC6 = ADC_READ(6)を押します。 /* OSMCからのVBATT入力(現在使用されていない)位置pa6*///アクセルのみのGolayフィルターを保存a0 = a1; a1 = a2; A2 = A3; a3 = a4; A4 = A5; a5 = a6; a6 =(float)accelraw; accsum =(float)((-2*a0) +(3*a1) +(6*a2) +(7*a3) +(6*a4) +(3*a5) +(-2*a6)) /21; // Golay計算を保存します
gaincontrol = (float) gaincontrol*0.9 + 0.1*adc2/341;
//電圧スパイクを滑らかにし、範囲0-3スロットル_ pedeal =(float)throttle_pedal*0.9 + 0.1*ADC4/341を与えます。 //電圧スパイクを滑らかにし、範囲0〜3を与えます
//モーターを切断して、死んだ男のボタンが手放された場合//レバーが引き戻されたり、前方に押し込んだか、何もしない場合はどうすればよいですか:balance_point = 514; if(adc3> 100)balance_point = 534;
if(adc5> 100)balance_point = 494;
PORTB |= (1<<PB2);//Port B2 turned on/off once per loop so I can
オシロスコープでループ時間を測定します
/加速度計シグナル処理/ /オフセットを減らします/ x_acc =(float)accsum -balance_point; // accsumは加速度計のSG値であり、真の「合計」ではないため、(x_acc <-250)x_acc = -250; //(x_acc> 250)x_acc = 250; /*加速度計の角度の変化は、範囲0〜30度(sin theta)の範囲で1度あたり約3.45単位です。罪の角度は大まかに=小さな角度の角度なので、三角法を行う必要はありません。以下のX_ACCは現在程度です*/
x_accdeg =(float)x_acc/-3.45; //マイナスサインは、前面から前の加速度計の取り付けを修正します!
/*GYRO signal processing*/ /*Subtract offsets: Sensor reading is 0-1024 so "balance point"
つまり、必要なゼロポイントは、読み取り値を引いた512*/
/データシートから1秒あたり20mVあたり20mVのジャイロ角度の変化により、秒角度の変化あたり4.096単位(0〜1023のスケール)の変更により、これにより、ジャイロ角の変化率は、実際には最大速度よりも低いものになります。測定可能な(100DEG/SEC)。注これらの画分は、PWMジェネレーターに送信される直前に整数にまとめられ、モーターコントローラーに接続されています/gangleratedeg =(float)((gyrosum/7)-508)/4.096; // gyrosumは7つのサンプルのグループの合計であるため、(Gangleratedeg <-92)ganglerateg = -92; if(gangleratedeg
92)Gangleratedeg = 92 /メインプログラムサイクルごとにポートB2をオンとオフにして、オシロスコープをそれに取り付けることができ、プログラムサイクル時間を解決することができます。サイクル時間を使用して、この時間の長さを知る必要があるサイクルごとにジャイロ角度の変化を解決できます。間隔/ portb&=(0
/TIは、「I」または積分係数(現在2.2ではここ2.2)のスケーリングを表します。ジャイロアングルドは、Gyroセンサーの程度で最後のサイクル以来のアングルチャンジです。TIはスケーリング係数です(理論的には約1である必要がありますが、2.2はボードをよりきつく感じます)
ガングレートは現在、1秒あたりの程度の単位にあります。AAは時定数が変化します。/AA = 0.005; gyroangledt =(float)tiCycle_TimeGangleratedeg;
gangleraterads =(float)gangleratedeg*0.017453;/程度の新しい角度は、古い角度に加えて、最後のサイクル以来のジャイロからの角度の変化です。/ angle =(float)((1-aa) *(angle + gyroangledt)) +(aa * x_accdeg); //メインアングルの計算関数*///角度を程度からラジアンに変換する
anglerads=(float)angle*0.017453; balance_torque=(float)(4.5*anglerads)
+(0.5*Gangleraterads);
cur_speed =(float)(cur_speed +(throttle_pedal * balance_torque * cycle_time)) * 0.999;
/*レベル値は-1から+1であり、モーターに送信されるデューティサイクルを表します。ラジアンへの変換は、これらの制限内にとどまるのに役立ちますレベル=(balance_torque + cur_speed) *総合ゲイン。
}
void timer_init(){tccr0 = 0 | (1
// PWMモードは「PWM、位相正しい、10ビット」TCCR1A = 0です| (1
(1<
void set_motor()
/* leveli項は、PWMモーターコントロールポートに送信する準備ができている整数として-1023から+1023に再確認されたレベル項です。
// if(level <-0.9)level = -0.9; // secks sensible limitsにある// if(level> 0.9)level = 0.9;
int16_t leveli =(int16_t)(level*1023); //ここで注意してください。「レベル」のために終了した浮動小数点値を取得し、1023を掛けてから整数にしてから、値を「leveli」としてPWMジェネレーターに送り込む前にそれを作ります。
if(leveli <-1020)leveli = -1020; // double-checks(reveli> 1020)leveli = 1020の場合、突然ボードから投げ出されたくないので、賢明なPWM制限内にいます。
/ポートB1にLEDまたはブザーをセットアップして、トルクを配信するトルクが最大50%を超える場合は遅くなるように警告します。モーターはすでに横ばいに走っていますあなたは高速で倒れそうです!一部の人は、最高速度を自動的に制限するために自動チップバックルーチンを使用します。とりあえず私はこのようにそれをやります/
if(レベル<-0.7 || level> 0.7){
portb | =(1 <portb&=(0SoftStart =(float)SoftStart+0.001; if(SoftStart> 1.0)SoftStart = 1.0;
//PORTC |= (0<<PC1); // AHI=1 PinC3, BHI=1 PinC2 set both to ON for
OSMCは動作し、両方をオフにしてモーターダウンをシャットダウンします /*注:理由はわかりません。 PINC1出力をゼロに設定することにより、障害のないOSMCは、1がOSMC*/ portc | = 0x0cを無効にします。 // C1を引き下げて、OSMCを有効にすることを許可します。 portc&= 〜0x02; // disable is off(leveli <0){ocr1a = -leveli; // levei変数は負の署名値であるため、Aliは後方に進みます。ここにマイナスサインを保持します! OCR1B = 0; // bli = 0} else {ocr1a = 0; // ali = 0 reveli変数が正の署名値ocr1b = leveliです。 // bliはpwmです}}
int main(void){initports();
adc_init();
timer_init();
/*最初のティルトスタートコードがマイクロをオンにしている間、ボードが片側に傾いている間、ライダーはそれに足を踏み入れようとしています。ライダーがボードに乗ると*/ TIPSTART = 0; accelraw = 0;
while(tipstart <1){
// Accsumの値を見る前に、最初にマシンをオンにするときに、SGフィルターが適切な安定した値に巻かれるようにするためにこれが必要です(以下)。
for(i = 0; i <20; i ++){
sample_inputs();
}if(accsum <504 || accsum> 524){//
if(x_accdeg> 0){tipstart = 0; } else {tipstart = 1;
SoftStart = 0.4; }}角度= 0; cur_speed = 0; /*チルト開始コードの終了。このポイントを超えて行くと、マシンはレベルになり、アクティブになります*/
sei();
while(1){sample_inputs();
set_motor();
} }
解決
あなたはおそらくあなたのビルドに指定された間違ったMCUを持っているでしょう。 DDRAはAtmega1280にArduino Megaに存在しますが、DDRAは通常のArduinoのAtmega328には存在しません。
Arduino UIを使用している場合は、ツールに移動します|ボードして、Arduino Megaを選択します。
独自のビルドシステムを使用している場合は、GCCコマンドラインで-MMCU =に対して指定した値を更新する必要があります。
他のヒント
ここで最後のコメントを除外したかもしれないと思います:
/*The level value is from -1 to +1 and represents the duty cycle to be sent to the motor. Converting to radians helps us stay within these limits >>>*/<<<
コンパイラが、何かが「この範囲で宣言されていない」とあなたに言うとき、あなた自身としてこの質問:
どの範囲 だった で宣言されていますか?
あなたがその質問に答えることができないなら、あなたは問題を発見しました。結局のところ、if あなた その名前が何を指しているのかわからない、コンパイラにどのように期待できるの?それを覚えておいてください あなた 任意のコードの専門家です あなた 書きます。
もし、あんたが できる 物事が宣言されている範囲を決定すると、次のタスクは、そのスコープがあなたがそれを使用しようとしている範囲にどのように関連するかを判断することです。典型的な問題には以下が含まれます(ただし、これらに限定されません)。
- 他の名前空間で宣言されました。使用
::
完全な資格のある名前を与えるスコープ解像度オペレーター。 - クラスのメンバーとして宣言され、スタンドアロン関数で使用しようとしています。クラスのインスタンスを見つけて、そのオブジェクトを介して変数または関数にアクセスするか、クラスを変更して新しい関数をメンバーの1人として変更します。
もし、あんたが できません 宣言された範囲を見つけて、間違っている可能性のあるものがいくつかあります。
- あなたはそれを間違って綴った。ドキュメントのスペルを確認し、コードを修正します。
- あなたが含めることを忘れていたヘッダーで宣言されています。宣言された場所を把握し、適切なものを追加します
#include
指令。 これはおそらくあなたの場合の問題です。 - どこにも宣言されていません。それがどこにあるかを把握してください したほうがいい 宣言され、自分でそれを宣言してください。
これは、DIYセグウェイを制御するための合理的に単純なArduinoコードへのリンクです。
これは、スケートボードにとってより良い出発点になると思います。
http://diysegway.blogspot.com/
幸運をお祈りしています
ジョン