電子發(fā)燒友App

硬聲App

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示
創(chuàng)作
電子發(fā)燒友網(wǎng)>電子資料下載>電子資料>讓Arduino控制的汽車直行

讓Arduino控制的汽車直行

2023-02-06 | zip | 0.29 MB | 次下載 | 免費

資料介紹

描述

互聯(lián)網(wǎng)上有大量關(guān)于 Arduino 控制的汽車項目的描述。套件包括電機(jī)和底盤。其中一些套件是兩輪驅(qū)動,第三輪作為浮動腳輪。

這種三輪配置本質(zhì)上是不穩(wěn)定的,即使在驅(qū)動程序中將兩個電機(jī)設(shè)置為相同的速度,也不會直線行駛。車輪直徑、滾動摩擦和電機(jī)特性的變化會導(dǎo)致偏差。克服這個問題的唯一方法是增加反饋并定期對電機(jī)速度進(jìn)行修正。該項目將解釋如何實施以實現(xiàn)直線行駛。

Arduino 控制的汽車

這是一個由 Arduino 控制的汽車示例,由兩輪驅(qū)動套件構(gòu)建。主要組成部分是:

兩輪驅(qū)動套件,包括電機(jī)、底盤、各種螺絲和螺母、車輪和車輪編碼器

  • 阿杜諾UNO
  • L298N電機(jī)驅(qū)動橋板
  • 2 x HC-020K 編碼器模塊
  • 4 x ICR16340 鋰離子電池和電池座
  • 切換開/關(guān)開關(guān)
  • 連接線

本文不包括如何制造汽車的描述;互聯(lián)網(wǎng)上有很多資源可以解釋所需的步驟。

成品車如下:

?

img_3640_z855wTTegG.JPG?auto=compress%2Cformat&w=740&h=555&fit=max
?

整車電路圖如下:

?

schematicdiagram_Gw0R9NIhYI.png?auto=compress%2Cformat&w=740&h=555&fit=max
?

只是配置上需要注意的幾點:

  • 該車采用并聯(lián)/串聯(lián)配置的四節(jié) ICR16340 700 mAh 鋰離子電池。其中兩個串聯(lián)的電池在充滿電后可提供約 8 V 的電壓,足以驅(qū)動電機(jī)和 Arduino 板。并聯(lián)電池可能存在問題(可能會產(chǎn)生循環(huán)電流),作為替代方案,ICR16340 電池有 2800 mAh 版本——其中兩個串聯(lián)應(yīng)該足以為汽車供電。
  • 電機(jī)控制由 L298N 橋驅(qū)動器模塊執(zhí)行。同樣,有大量資源可以解釋它們的運行方式以及如何連接電機(jī)和控件。
  • 該電路使用數(shù)字引腳 5 和 6 將 PWM 輸出到 L298N 板以控制電機(jī)速度。這些引腳的 PWM 頻率由 ATmega328P 的定時器 0 控制。數(shù)字引腳 9 和 10 的 PWM 頻率由定時器 1 控制。稍后在該項目中,定時器 1 用于觸發(fā)距離控制回路,因此與引腳 9 和 10 的 PWM 沖突。不要在該項目中使用這些引腳。
  • 根據(jù)您的具體接線方式,可能需要調(diào)換電機(jī)引線以獲得一致的方向。此外,HC-020K 編碼器模塊必須在軟件中與正確的電機(jī)配對。這可能需要交換中斷 2 和 3 或調(diào)整軟件。

脈搏過多之謎

HC-020K 編碼器模塊依靠 LM393 比較器來生成方波脈沖。編碼器輪上的每個孔都會在方波中產(chǎn)生上升沿和下降沿,其頻率與輪速成正比。對這些方波脈沖進(jìn)行計數(shù)也會得出與行進(jìn)距離成正比的總數(shù)。使用 Arduino 對這些脈沖進(jìn)行計數(shù)的標(biāo)準(zhǔn)方法是將它們連接到中斷并讓中斷服務(wù)例程 (ISR) 遞增計數(shù)器(稍后提供示例代碼)。

幾項試圖將脈沖計數(shù)與 rpm 和行進(jìn)距離相協(xié)調(diào)的實驗表明,脈沖計數(shù)不正確的因素約為十倍 - 十倍于許多脈沖。這使得編碼器幾乎毫無用處。此異常需要進(jìn)一步調(diào)查

以下是 HC-020K 編碼器的一些示波器軌跡:

?

screenshot1_3513k27dnJ.bmp?auto=compress%2Cformat&w=740&h=555&fit=max
?

在 5 毫秒的時間尺度上,方波的上升沿和下降沿看起來很干凈。然而,如果放大到 2 微秒的時間尺度,方波的下降沿會在 5V 到 0V 的轉(zhuǎn)換期間顯示多個向上向下的尖峰。

?

screenshot2_4dDOvhtNGO.bmp?auto=compress%2Cformat&w=740&h=555&fit=max
?

這些尖峰中的每一個都可能觸發(fā)中斷并導(dǎo)致脈沖計數(shù)過多。它們是由 HC-020K 編碼器模塊上的比較器電路的性質(zhì)引起的——它在開環(huán)模式下運行。

解決這個問題的正確方法是通過在輸出和提供參考電壓的分壓器之間添加一個反饋電阻,在比較器電路中引入遲滯。有幾篇文章解釋了這個電路——這里是德州儀器的一個例子。

https://www.ti.com/lit/ug/tidu020a/tidu020a.pdf

要針對遲滯修改 HC-020K 編碼器模塊,需要從輸出端到 LM393 的引腳 2 連接一個 50KOhm 電阻。由于使用了表面貼裝 IC,實際上很難執(zhí)行此 mod。如果你能做到——祝你好運!

一些額外的研究顯示了一種替代方法。這需要在輸出和地之間有一個 100nF 的電容器。這是一個更容易實現(xiàn)的模組,如下所示。

?

img_3638_uZYt2trHXQ.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
?

?

img_3637_CboVYDCv8i.jpg?auto=compress%2Cformat&w=740&h=555&fit=max
?

電容器有效濾除高頻尖峰并提供平滑過渡。產(chǎn)生的波不是方波,因為它被電容器在前沿和下降沿上的充電和放電所修改。示波器軌跡如下:

?

screenshot3_XqGSjsEfkt.bmp?auto=compress%2Cformat&w=740&h=555&fit=max
?

放大到5微秒的時間尺度,方波的下降沿顯示單次跳變

?

screenshot4_XrcJzrHELA.bmp?auto=compress%2Cformat&w=740&h=555&fit=max
?

進(jìn)行此修改后,脈沖計數(shù)與觀察到的轉(zhuǎn)速很好地對齊。

反饋控制

既然解開了太多脈沖的謎團(tuán),是時候?qū)④囕喚幋a器的反饋控制應(yīng)用于電機(jī)速度了。基本思想是根據(jù)測得的脈沖數(shù)調(diào)整單個電機(jī)速度,使輪子覆蓋相同的距離并沿直線驅(qū)動 Arduino。

反饋控制回路分為許多類別,但最常見的稱為 PID(比例、積分和微分)回路。關(guān)于這個主題的信息很多,他們的研究是一門完整的學(xué)科。簡單系統(tǒng)如下圖:

?

controlloop_aMe0oCtBLi.png?auto=compress%2Cformat&w=740&h=555&fit=max
?

將設(shè)定點(期望輸出)與反饋(實際輸出)進(jìn)行比較,誤差用于生成對受控系統(tǒng)的輸入。該輸入將系統(tǒng)驅(qū)動到所需的輸出,以便最終反饋等于設(shè)定點。

對于 Arduino 汽車,需要控制的輸出是兩個車輪的脈沖計數(shù)之差。如果此差異為零,則車輪將行駛相同的距離(假設(shè)車輪直徑相等)。

幾個定義:

  • 來自車輪 A(電機(jī) A)的脈沖計數(shù) = pulseA
  • 來自輪 B(電機(jī) B)的脈沖計數(shù) = pulseB
  • 脈沖計數(shù)之間的差異 = 反饋 = pError = pulseA – pulseB
  • 設(shè)定點 = 0

下面是Arduino小車基本控制策略的流程圖:

?

flowchart_FatbK3YVja.png?auto=compress%2Cformat&w=740&h=555&fit=max
?

關(guān)于中斷的部分

Arduino 上的控制程序使用中斷有兩個目的:

  • 對來自編碼器的脈沖進(jìn)行計數(shù)。每次編碼器輸出進(jìn)行 1 到 0 轉(zhuǎn)換時,都會在 Arduino 上觸發(fā)中斷。
  • 強(qiáng)制控制回路比較計數(shù)的脈沖并根據(jù)控制算法調(diào)整電機(jī)速度。

第一個中斷的相關(guān)代碼片段是

const int encoder1 = 2;
const int encoder2 = 3;
volatile int pulse1;
volatile int pulse2;

void setup(){
  pulse1 = 0;
  pulse2 = 0;

  attachInterrupt(digitalPinToInterrupt(encoder1), count1, FALLING);
  attachInterrupt(digitalPinToInterrupt(encoder2), count2, FALLING);
}

void count1(){
  // counting the number of pulses for encoder 1
  pulse1++;
}

void count2(){
  // counting the number of pulses for encoder 2
  pulse2++;

引腳 2 和 3 用于編碼器的中斷輸入。pulse1 和 pulse2 是用于保存計數(shù)的變量。Count1 和 count2 是中斷服務(wù)程序,只是增加計數(shù)器。中斷在從編碼器接收到的方波的下降沿觸發(fā)。

第二個中斷使用 ATMega328 內(nèi)置的 Timer1。定時器以預(yù)定的時間間隔觸發(fā)中斷。然后,這會運行一個控制回路,使汽車保持直線行駛。相關(guān)代碼片段如下:

void setup(){

cli();//stop interrupts

  //set timer1 interrupt at 4Hz
  TCCR1A = 0;// set entire TCCR1A register to 0
  TCCR1B = 0;// same for TCCR1B
  TCNT1  = 0;//initialize counter value to 0
  // set compare match register for 4hz increments
  OCR1A = 3905;// = (16*10^6) / (4*1024) - 1 (must be <65536)
  // turn on CTC mode
  TCCR1B |= (1 << WGM12);
  // Set CS12 and CS10 bits for 1024 prescaler
  TCCR1B |= (1 << CS12) | (1 << CS10);  
  // enable timer compare interrupt
  TIMSK1 |= (1 << OCIE1A);
  
  sei();//allow interrupts

}

ISR(TIMER1_COMPA_vect){

//Control loop here

}

預(yù)分頻器 (0CR1A) 的值決定了中斷的頻率。

控制汽車(第 1 部分)

第一種直接駕駛汽車的方法使用基于流程圖的簡單算法。代碼如下:

 int pError = 0;
pError = pulse1 - pulse2;

 // pError is positive speed up motor A and slow down motor B
 if(pError > 0){
  analogWrite(enA, (motorSpeed + 7));
  analogWrite(enB, (motorSpeed - 7));
 }

 // pError is negative speed up motor B and slow down motor A
 else if(pError < 0){
  analogWrite(enA, (motorSpeed - 7));
  analogWrite(enB, (motorSpeed + 7));
 }

 else {
  analogWrite(enA, motorSpeed);
  analogWrite(enB, motorSpeed);
 }

 digitalWrite(led, toggle);
 toggle = !toggle;

控制汽車(第 2 部分)

一種更復(fù)雜的方法是使用 PID 控制器Arduino 庫包括一個名為 FastPID 的庫,它實現(xiàn)了 PID 控制器。添加到與 IDE 關(guān)聯(lián)的庫。

有關(guān)如何在以下鏈接中使用此庫的文檔

https://github.com/mike-matera/FastPID

這是代碼片段

float Kp=0.6, Ki=0.4, Kd=0, Hz=4;
int output_bits = 8;
bool output_signed = false;

FastPID driveStraight(Kp, Ki, Kd, Hz, output_bits, output_signed);
ISR(TIMER1_COMPA_vect){
  static int pError;
  pError = 0;
  pError = pulse1 - pulse2;
  uint8_t output = driveStraight.step(setpoint, pError);

  analogWrite(enA, (motorSpeed - output));
  analogWrite(enB, (motorSpeed + output));

  digitalWrite(led,toggle);
  toggle = !toggle;
}

可以通過為 Kp、Kd 和 Ki 分配不同的值來調(diào)整回路的靈敏度

最后的話

希望這有助于直接駕駛!


下載該資料的人也在下載 下載該資料的人還在閱讀
更多 >

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數(shù)據(jù)手冊
  2. 1.06 MB  |  532次下載  |  免費
  3. 2RK3399完整板原理圖(支持平板,盒子VR)
  4. 3.28 MB  |  339次下載  |  免費
  5. 3TC358743XBG評估板參考手冊
  6. 1.36 MB  |  330次下載  |  免費
  7. 4DFM軟件使用教程
  8. 0.84 MB  |  295次下載  |  免費
  9. 5元宇宙深度解析—未來的未來-風(fēng)口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發(fā)指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應(yīng)用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

  1. 1OrCAD10.5下載OrCAD10.5中文版軟件
  2. 0.00 MB  |  234315次下載  |  免費
  3. 2555集成電路應(yīng)用800例(新編版)
  4. 0.00 MB  |  33566次下載  |  免費
  5. 3接口電路圖大全
  6. 未知  |  30323次下載  |  免費
  7. 4開關(guān)電源設(shè)計實例指南
  8. 未知  |  21549次下載  |  免費
  9. 5電氣工程師手冊免費下載(新編第二版pdf電子書)
  10. 0.00 MB  |  15349次下載  |  免費
  11. 6數(shù)字電路基礎(chǔ)pdf(下載)
  12. 未知  |  13750次下載  |  免費
  13. 7電子制作實例集錦 下載
  14. 未知  |  8113次下載  |  免費
  15. 8《LED驅(qū)動電路設(shè)計》 溫德爾著
  16. 0.00 MB  |  6656次下載  |  免費

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉(zhuǎn)中文版)
  4. 78.1 MB  |  537798次下載  |  免費
  5. 3MATLAB 7.1 下載 (含軟件介紹)
  6. 未知  |  420027次下載  |  免費
  7. 4OrCAD10.5下載OrCAD10.5中文版軟件
  8. 0.00 MB  |  234315次下載  |  免費
  9. 5Altium DXP2002下載入口
  10. 未知  |  233046次下載  |  免費
  11. 6電路仿真軟件multisim 10.0免費下載
  12. 340992  |  191187次下載  |  免費
  13. 7十天學(xué)會AVR單片機(jī)與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費