問題タブ [atmega]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
microcontroller - AVR マイクロ コントローラーでロータリー エンコーダーを使用する
ロータリー エンコーダを AVR マイクロ コントローラで正しく動作させるのに問題があります。エンコーダーは機械式ALPS エンコーダーで、 Atmega168を使用しています。
明確化
I have tried using an External Interrupt to listen to the pins, but it seems like it is too slow. When Pin A goes high, the interrupt procedure starts and then checks if Pin B is high. The idea is that if Pin B is high the moment Pin A went high, then it is rotating counter clock-wise. If Pin B is low, then it is rotating clock-wise. But it seems like the AVR takes too long to check Pin B, so it is always read as high.
I've also tried to create a program that simply blocks until Pin B or Pin A changes. But it might be that there is too much noise when the encoder is rotated, because this does not work either. My last attempt was to have a timer which stores the last 8 values in a buffer and checks if it is going from low to high. This did not work either.
I have tried scoping the encoder, and it seems to use between 2 and 4ms from the first Pin changes till the other Pin changes.
c - 組み込みアプリケーションのテストコード
バックグラウンド:
私はAtmelAVRatmega2560を使用して大規模なプロジェクトを開発しています。このプロジェクトには、多くのハードウェアベースの機能(7つのSPIデバイス、2つのI2C、2つのRS485 MODBUSポート、多くのアナログおよびデジタルI / O)が含まれています。私は、必要なデータにアクセスするためのインターフェイスをメインアプリケーションループに提供する、これらすべてのデバイス用の「ドライバー」を開発しました。
質問:
私が開発しているプロジェクトは、最終的にSIL基準を満たす必要があります。
コードをテストして、適切なレベルのコードカバレッジを提供できるようにしたいと思います。ただし、このようなテストフレームワークをどのように設定するかを開始するための情報を見つけることができません。
アイデアは、将来のバグ修正と機能追加をテストして、コードが壊れているかどうかを確認できる一連の自動テストを行うことができるということです。問題は、コードをチップ上でテストする方法がわからないことです。
デバイスのI/Oを監視し、外部接続されたデバイスをエミュレートするためのハードウェアが必要ですか?提供できるポインタは大歓迎です。
-スティーブ
c++ - C++は「このスコープで宣言されていません」コンパイルエラーと変更のヒント
Arduino Megaで動作するように、このコードを変更しようとしています。私はCにかなり慣れていないので、いくつかの大きな間違いを犯した可能性があります。ちなみに、これはバランススクーター用です。:P
このコードはATmega32から取得されます(from:[url = http://sites.google.com/site/onewheeledselfbalancing/Home/twin-wheel-self-balancing-skateboard-lightweight-version/code4 ] http:// sites .google.com / site / onewheeledsel ... t-version / code4[/url] そして私はそれをArduinoMegaで動作させようとしています。
このコードはATmega32開発ボード用に書かれました http://www.active-robots.com/products/controllr/m32db.shtml
ありがとうございました!
これが私が遭遇する最初のエラーです:
関数'voidtimer_init()':エラー:'TCCR0'はこのスコープで宣言されていません関数'int main()':
誰かが私に何が悪いのか説明してもらえますか?私はプログラミングの初心者ですが、たくさんの本やウェブサイトを読んだことがあり、私も速く学んでいます!^^そしてここに完全なコードがあります(かなり長いです):
CLOCK_SPEED16000000を定義します
OCR1_MAX1023を定義します
typedef unsigned char u8; void set_motor_idle(void); void InitPorts(void); フロートレベル=0; float Throttle_pedal; フロートaa; フロートアクセラウ; float x_acc; フロートアキュム; float x_accdeg;
フロートジャイロサム;
float gangleratedeg; フロートgangleraterads; float ti = 2.2;
フロート全体ゲイン; フロートゲインコントロール; フロートバッテリーボルト=24; フロートジャイロアングルdt; フロート角度; フロートアングルラッド; 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; // DDRC = 0xFFで開始するためにポートCプルアップを低(出力電圧なし)に設定。//ポートCピンはすべてポートC方向レジスタを介して出力として設定されます//PORTC| =(1 <
DDRA = 0x00; //入力として設定されたすべてのポートAピンPORTA=0x00; //ポートAの入力プルアップが低プルアップに設定されている
DDRD = 0xFF; // OCR1A(PinD5)およびOCR1B(Pin D4)が正しく機能するための前提条件として、すべてのポートDピンを出力として構成します
PORTB = 0x00; //ポートBのプルアップを低(出力電圧なし)に設定して、DDRB=0xFFで開始します。//すべてのポートBピンを出力に設定
} / * IO:外部水晶クロックでATMega3216MHzを使用しています。OSMCモーターコントローラーPC4オンボードLEDPD5/ OC1AALI->OSMCピン6PD4/ OC1BBLI->OSMCピン8PC1無効->OSMCピン4PC2BHI->OSMCピン7PC3AHI->OSMCピン5への新しい計画されたピン配置PA6 / ADC6 Vbatt /10->OSMCピン3PA1/ADC1ピッチレートジャイロPA0/ADC0加速度計 /voidadc_init(void){//使用しないのでアナログコンパレータをオフにする /ACSR =(1 << ACD); / PA0 / ADMUX=0を選択します。ADMUX | =(1 <ADCプリスケーラを128に設定し、ADCを有効にして、変換を開始します/ ADCSRA = 0 |(1</偽の最初の変換が終了するまで待ちます*/ while(ADCSRA&(1 <<
uint16_t adc_read(uint8_t channel){
/*チャネルを選択/ADMUX=チャネル; ADMUX | =(1<変換の開始/
ADCSRA | =(1 << ADSC);/変換が終了するまで待つ/while(ADCSRA&(1 << ADSC)){}/結果を返す*/ADCWを返す;}/ * 156サイクル/秒、6.4ms/サイクルOSCILLOSCOPEで測定*/ / *すべてのADC入力を読み取り、変換を実行* / void sample_inputs(void){
=(float)adc0; for(j = 0; j <7; j ++){adc1 = adc_read(1); //ジャイロピンPA1gyrosum=(float)gyrosum + adc1; //ジャイロのループごとに平均7つのサンプルを使用して、プログラムの各ループで完全な更新を取得します}
位置PA2*/ adc3 = adc_read(3); /*ポジションレバーを引き戻した位置PA3*/ adc4 = adc_read(4); /*Throttle_pedalの位置PA4*/ adc5 = adc_read(5); /*位置レバーを前方に押して位置PA5*/ // adc6 = adc_read(6); / * OSMCからのVbatt入力(現在は使用されていません)位置PA6 *///加速のみのSavGolayフィルター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; //SavGolayの計算
//電圧スパイクを滑らかにし、範囲を0〜3にしますThrottle_pedal =(float)Throttle_pedal * 0.9 + 0.1 * adc4 / 341; //電圧スパイクを滑らかにし、範囲を0〜3にします
//デッドマンボタンが離された場合にモーターをカットします//(gaincontrol変数もこのボタンを介してadc2に配線されますif(adc2 <100){Throttle_pedal = 0.001; gaincontrol = 0.001;} totalgain = gaincontrol * softstart; //レバーが後ろに引っ張られたり、前に押されたり、何もしなかった場合の対処方法:Balance_point = 514; if(adc3> 100)Balance_point = 534;
if(adc5> 100)Balance_point = 494;
オシロスコープでループ時間を測定する
/ ACCELEROMETER信号処理//オフセットの減算/ x_acc=(float)accsum-Balance_point; // accsumは加速度計のSG値であり、真の「合計」ではないため、7で割る必要はありませんif(x_acc <-250)x_acc = -250; //加速値を-250〜 + 250の範囲に制限します(片道80度傾斜)if(x_acc> 250)x_acc = 250; / *加速度計の角度変化は、0〜30度(正弦波)の範囲で1度の傾斜あたり約3.45単位です。傾斜を加速度センサーからの傾斜度に変換します。正弦角=おおよそ=小さな角度の角度なので、三角法を実行する必要はありません。以下のx_accはDEGREES*/になりました
x_accdeg =(float)x_acc / -3.45; //マイナス記号は、後ろから前への加速度計の取り付けを修正します!
つまり、必要なゼロ点は、読み取り値から512*/を引いた値になります。
/データシートからの毎秒20mVのジャイロ角度の変化は毎秒4.096単位(0〜1023のスケールで)の変化を与えます角度の変化これはジャイロ角度の変化率を最大速度よりわずかに小さく制限します実際に測定可能(100度/秒)。これらの小数部はすべて、PWMジェネレーターに送信される直前に整数に切り上げられ、PWMジェネレーターはモーターコントローラーに接続されます/ gangleratedeg =(float)((gyrosum / 7)-508)/4.096; //ジャイロサムは7つのサンプルのグループの合計であるため、ジャイロ値を7で割るとif(gangleratedeg <-92)gangleratedeg = -92; if(gangleratedeg
92)gangleratedeg = 92 /メインプログラムサイクルごとに1回ポートB2のオンとオフを切り替えて、オシロスコープを接続してプログラムサイクルタイムを計算できるようにします。サイクルタイムを使用して、サイクルごとのジャイロ角度の変化を計算します。この時間間隔の長さを知る/PORTB&=(0 <
/ tiは、「i」または積分係数(現在は2.2)のスケーリングを表します。ジャイロアングルdtは、ジャイロセンサーからの度数で表した最後のCYCLE以降の角度変化です。ここで、tiはスケーリング係数です(理論的には約1である必要がありますが、2.2はボードをよりタイトに感じさせます
)現在、度/秒の単位でaaは時定数を変化させます。つまり、aa値が小さいほど、ジャイロドリフトをゆっくりと補正するため、加速度計の時定数が長くなります。aa = 0.005; gyroangledt =(float)ti cycle_time gangleratedeg;
gangleraterads =(float)gangleratedeg * 0.017453;/ DEGREESの新しい角度は、古い角度に最後のサイクル以降のジャイロからの角度の変化を加えたもので、新しい加速度の読み取り値が少し考慮されています/ angle =(float)((1-aa)*(angle + gyroangledt))+(aa * x_accdeg ); //主な角度計算関数*///角度を度からラジアンに変換
+(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項は、OSMCに接続されているPWMモーター制御ポートに送信する準備ができている整数として-1023から+1023に再スケーリングされたレベル項です* / {
// if(level <-0.9)level = -0.9;//適切な制限内にあることを確認します//if(level> 0.9)level = 0.9;
int16_t leveli =(int16_t)(level * 1023); //ここで、「level」の浮動小数点値を取得し、それを1023で乗算してから整数にした後、値を「leveli」としてPWMジェネレーターにフィードします。
if(leveli <-1020)leveli =-1020; //(leveli> 1020)leveli = 1020;の場合、ボードから突然スローされたくないので、適切なPWM制限内にあることを再確認します。
/ポートB1にLEDまたはブザーを設定して、供給されるトルクが可能な最大値の50%を超える場合は、速度を落とすように警告します。この理由は、速度で前方に転倒し始めた場合に備えて、常に予備のモーター電力が必要になるためです。モーターはすでにフラットアウトで動作しているので、高速で転倒する可能性があります。自動チップバックルーチンを使用して、最高速度を自動的に制限するものもあります。今のところ私はこのように簡単にやります/
if(level <-0.7 || level> 0.7){
PORTB | =(1 <PORTB&=(0 <softstart =(float)softstart + 0.001; if(softstart> 1.0)softstart = 1.0;
OSMCが機能し、両方がOFFになってモーターがシャットダウンする/ *注:理由はわかりませんが、AHIとBHIを+12Vに配線するために最後に行った方向変更でモーターの切断を停止する//PinC1を設定してOSMCを無効にしない出力をゼロにすると、1はOSMC * / PORTC |=0x0cを無効にします。// C1をプルダウンして、OSMCの無効化を解除します。つまり、有効にします。PORTC&=〜0x02; //無効はオフですif(leveli <0){OCR1A = -leveli; // leveli変数は負の符号付きの値であるため、ALIはPWMで逆方向に進みます。ここでは、マイナス記号を保持してください。OCR1B = 0; // BLI = 0} else {OCR1A = 0; // leveli変数は正の符号付きの値であるため、ALI=0以降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();
}}
c - AVR ATmega32 と Arduino Mega のコーディングの主な違いは何ですか?
Arduino Megaで動作させるために、このコードを変更しようとしています。私はCにかなり慣れていないので、いくつかの大きな間違いを犯した可能性があります。ちなみに、これはセルフバランススケートボード用です。
このコードは ATmega32 (ここから) から取得したもので、Arduino Mega で動作させようとしています。
このコードはATmega32 開発ボード用に書かれています。
私はいくつかの変更を行いました(いくつかの間違いを修正しました)が、最後に遭遇しました:
関数 'int main()':
エラー: 'int main() の再定義
完全なコードは次のとおりです。
c - コードを ATmega32 から Arduino Mega に変更 - 関数「main」にエラーがありません
Arduino Megaで動作させるために、このコードを変更しようとしています。私はCにかなり慣れていないので、いくつかの大きな間違いを犯した可能性があります。ちなみに、これはセルフバランススケートボード用です。
このコードは ATmega32 から取得したものです (ここから、 Arduino Megaで動作させようとしています)。
このコードはATmega32 開発ボード用に書かれています。
しかし、私はこのエラーが発生します:
o:機能
main':</br> C:\Users\*******\AppData\Local\Temp\build27006.tmp/Test2.cpp:406:</br> undefined reference to
設定中'
どうして?ここには参照さえありませんsetup
!
これが私のコードです:
ところで、私はArduinoコンパイラを使用しています( Arduinoソフトウェアのダウンロードで見つけることができます)。
ide - ATMega32マイクロコントローラーのコーディングに使用するIDE
私はミニローバー(火星ローバータイプ)の設計を必要とするプロジェクトに携わっています。私はATMega32マイクロコントローラーを使用しています。DCモーター、IRセンサーなどの他のハードウェアがあります。私の質問は、マイクロコントローラーのコーディングに使用できるIDEはありますか?私はマイクロコントローラーコーディングの概念に慣れていないので、ユーザーフレンドリーである必要があります。また、シミュレーターも必要です。ネットで調べてみたのですが、用語が多すぎて戸惑いました。コードを書いて、シミュレーターを使ってテストできるシンプルなIDEで十分だと思います。助言がありますか?
microcontroller - バイオロイド キットの CM5 のオンライン操作中にエラーが発生しました
コントローラ (CM5) でプログラムをフラッシュした後、バイオロイド キットで CM5 をオンライン操作しているときに、次のエラーが発生します。
000 0x00 個のダイナミクセルが見つかりました。エラー 0800。
何を与える?
embedded - avrdude と atmega48pa
avrdude で atmega48pa をプログラムできますか? 署名に問題があります...
/etc -directory の avrdude.conf にいくつかの新しい行を追加しました
しかし、今は別のエラーが発生します
編集 - 1
「-vvv」を使用したデバッグ情報を次に示します。
質問
誰かがatmega48pa aith aavrispmkiiをフラッシュするのを手伝ってくれますか