在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

電子發燒友App

硬聲App

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示
電子發燒友網>電子資料下載>電子資料>讓Arduino控制的汽車直行

讓Arduino控制的汽車直行

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

資料介紹

描述

互聯網上有大量關于 Arduino 控制的汽車項目的描述。套件包括電機和底盤。其中一些套件是兩輪驅動,第三輪作為浮動腳輪。

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

Arduino 控制的汽車

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

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

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

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

成品車如下:

?

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
?

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

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

脈搏過多之謎

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

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

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

?

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

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

?

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

這些尖峰中的每一個都可能觸發中斷并導致脈沖計數過多。它們是由 HC-020K 編碼器模塊上的比較器電路的性質引起的——它在開環模式下運行。

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

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

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

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

?

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
?

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

?

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
?

進行此修改后,脈沖計數與觀察到的轉速很好地對齊。

反饋控制

既然解開了太多脈沖的謎團,是時候將車輪編碼器的反饋控制應用于電機速度了。基本思想是根據測得的脈沖數調整單個電機速度,使輪子覆蓋相同的距離并沿直線驅動 Arduino。

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

?

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

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

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

幾個定義:

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

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

?

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

關于中斷的部分

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

  • 對來自編碼器的脈沖進行計數。每次編碼器輸出進行 1 到 0 轉換時,都會在 Arduino 上觸發中斷。
  • 強制控制回路比較計數的脈沖并根據控制算法調整電機速度。

第一個中斷的相關代碼片段是

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 是用于保存計數的變量。Count1 和 count2 是中斷服務程序,只是增加計數器。中斷在從編碼器接收到的方波的下降沿觸發。

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

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

}

預分頻器 (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 部分)

一種更復雜的方法是使用 PID 控制器Arduino 庫包括一個名為 FastPID 的庫,它實現了 PID 控制器。添加到與 IDE 關聯的庫。

有關如何在以下鏈接中使用此庫的文檔

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 分配不同的值來調整回路的靈敏度

最后的話

希望這有助于直接駕駛!


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

評論

查看更多

下載排行

本周

  1. 1山景DSP芯片AP8248A2數據手冊
  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元宇宙深度解析—未來的未來-風口還是泡沫
  10. 6.40 MB  |  227次下載  |  免費
  11. 6迪文DGUS開發指南
  12. 31.67 MB  |  194次下載  |  免費
  13. 7元宇宙底層硬件系列報告
  14. 13.42 MB  |  182次下載  |  免費
  15. 8FP5207XR-G1中文應用手冊
  16. 1.09 MB  |  178次下載  |  免費

本月

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

總榜

  1. 1matlab軟件下載入口
  2. 未知  |  935054次下載  |  免費
  3. 2protel99se軟件下載(可英文版轉中文版)
  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十天學會AVR單片機與C語言視頻教程 下載
  14. 158M  |  183279次下載  |  免費
  15. 8proe5.0野火版下載(中文版免費下載)
  16. 未知  |  138040次下載  |  免費
主站蜘蛛池模板: 国内自拍 亚洲系列 欧美系列 | 四虎国产欧美成人影院 | 欧美性黑人十极品hd | 色免费在线 | 日本三级网站在线线观看 | 四虎网址| 又黄又爽又猛午夜性色播在线播放 | 久久精品午夜 | 啪啪午夜免费 | 夜夜爽天天干 | 亚洲成人观看 | 国产成 人 综合 亚洲网 | 国产乱码精品一区二区 | 天天爱天天做天天爽夜夜揉 | 欧洲另类一二三四区 | 五月天激情开心网 | 97人人插| 日本不卡高清视频 | 最近2018中文字幕免费视频 | 一区二区在线观看高清 | 日本一区三区二区三区四区 | 特级一级黄色片 | 欧美久久天天综合香蕉伊 | 无夜精品久久久久久 | 97福利视频 | 天天爱天天爽 | 黄色一级视频欧美 | 人人乳乳香蕉大免费 | www.av片| 制服丝袜在线一区 | 在线视频 亚洲 | 国产成人v爽在线免播放观看 | 久精品在线观看 | 一区二区不卡视频在线观看 | 精品久久久久久午夜 | 四虎在线成人免费网站 | 国产三级三级三级 | 亚洲综合久久综合激情久久 | 黄色小毛片 | 欧美色碰碰碰免费观看长视频 | 国产98在线传媒在线视频 |