【小项目关键技术二】UGV电机编码测速
測試程序
#define PinA 2 //外部中斷0 #define PinZ 3 //外部中斷1 #define PinB 9 //編碼器的OUT_B信號連接到數字端口8 #define T 200 //定義采集時間周期單位ms unsigned long time1 = 0; // 時間標記 volatile long PulSum_CW = 0; //定義長整型不可修改脈沖數 volatile long PulSum_CCW = 0; long PulSum_CW_t0 = 0; //定義記錄順時針方向 t0 時刻脈沖數變量 long PulSum_CW_t0_T = 0; //定義記錄順時針方向 t0+T 時刻脈沖數變量float Rad_CW_Speed = 0.000; //定義順時針角速度 float Rad_CCW_Speed = 0.000; //定義逆時針角速度long PulSum_CCW_t0 = 0; //定義記錄逆時針方向 t0 時刻脈沖數變量 long PulSum_CCW_t0_T = 0; //定義記錄逆時針方向 t0+T 時刻脈沖數變量// 記錄角度 int Rad = 180;void setup(){pinMode(PinA, INPUT_PULLUP);//因為編碼器信號為歐姆龍E6B2-CWZ6C,為開漏輸出,因此需要上拉電阻,此處采用arduino的內部上拉輸入模式,置高pinMode(PinB, INPUT_PULLUP);//同上attachInterrupt(0, Encode, FALLING);//脈沖中斷函數:捕捉A相信號,并判斷A、B相先后順序Serial.begin (9600); }void loop() {// 角度計算程序Rad = int((PulSum_CW - PulSum_CCW)/6.944) % 360; if (Rad>=180) {Rad = Rad - 360;}PulSum_CW_t0 = PulSum_CW; PulSum_CCW_t0 = PulSum_CCW; //采集t0時刻的脈沖數delay(T); //等待一個T時間PulSum_CW_t0_T = PulSum_CW; PulSum_CCW_t0_T = PulSum_CCW; //采集t0+T時刻的脈沖數delay(T); //等待一個T時間// 如果檢測到正向角速度,那么就打印角速度,以及累計的角度if (PulSum_CW_t0_T - PulSum_CW_t0 != 0){Rad_CW_Speed = (PulSum_CW_t0_T - PulSum_CW_t0); //// 顯示正向(CW)角速度 Rad_CW_Speed---> //打印出來速度//Serial.print("AS:"); //打印出來速度wSerial.print(Rad_CW_Speed);Serial.print(":"); //Serial.print("/A:");Serial.print(Rad);Serial.print("\n");} // 如果檢測到反向角速度,那么就打印角速度,以及累計的角度if (PulSum_CCW_t0_T - PulSum_CCW_t0 != 0){Rad_CCW_Speed = (PulSum_CCW_t0 - PulSum_CCW_t0_T);//Serial.print("AS:");Serial.print(Rad_CCW_Speed);Serial.print(":"); //Serial.print("/A:");Serial.print(Rad);Serial.print("\n");}} void Encode() {//當編碼器碼盤的OUTA脈沖信號下跳沿每中斷一次,//if ((millis() - time1) > 5)//{if ((digitalRead(PinA) == LOW) && (digitalRead(PinB) == HIGH)){PulSum_CW ++;}else{PulSum_CCW ++;}//}//time1 == millis(); }注意事項
https://item.taobao.com/item.htm?spm=a1z09.2.0.0.7c462e8dW1JbJF&id=624810490543&_u=g1o5c92q9ce3
How to use the L298N Motor Driver
輪子直徑:42mm
一圈的周長為:π?d\pi \cdot dπ?d = 3.14 * 42 mm = 131.88 mm
觀察電機參數可知:旋轉一圈產生2個脈沖
其中有個參數為基礎脈沖:7ppr,理解為pulses per revolution電機每轉的脈沖數,即電機不轉編碼器也會產生7個脈沖。不過我們使用的測速方式是取一段時間的脈沖差值,所以不影響測速效果。
測試了一些數據,關于電機設置最大PWM=255時,電機在不同的時間間隔產生的脈沖數
| 255 | 1000 ms | 1933, 1936, 1947, 1940, 1951 | 2074, 2073, 2074, 2079, 2070 |
| 100 ms | 142, 143, 142, 141, 142 | 205, 205, 206, 204, 205 | |
| 200 ms | 338, 342, 343, 344, 345 | 205, 205, 206, 204, 205 | |
| 500 ms | 960, 958, 958, 959, 956 | 1037, 1037, 1036, 1038, 1040 |
| 55 | 1000 ms | 1032, 1031, 1029, 1033, 1032 | 1139, 1151, 1153, 1139, 1156 |
| 100 ms | 34, 33, 33, 32, 31 | 61, 59, 61, 61, 60 | |
| 200 ms | 104, 106, 101, 105, 101 | 173, 173, 173, 175, 175 | |
| 500 ms | 421, 427, 423, 426, 426 | 551, 552, 553, 554, 555 |
測量時電池電壓:7.44 V
最高輸出255時,電機測量脈沖近似為2000個(因為只測量了下降沿,全算上應該是4000個),即轉了2000圈。而電機的減速比為40:1,那么編碼器的2000就等價于輪子的50圈,與所標參數一致。
換算成實際距離,電機的全速運轉時轉速為131.88mm/s。這是理論計算出來的速度。
實際測試,8s 運行了3塊地磚,也就是120cm,速度大概是150mm/s。
而一圈是131.88mm,等價于1.14轉/秒。一秒產生了2000個脈沖。
通過上述分析,暫時建立如下關系
| 255 | 1s | 1 | 2000 | 131.88mm | 13.19cm/s |
| 55 | 1s | 1 | 1000 | 131.88mm | 7.19cm/s |
最小速度為 7cm/s。
總結
以上是生活随笔為你收集整理的【小项目关键技术二】UGV电机编码测速的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Paper】2020_多智能体系统的分
- 下一篇: 第4章-无人车UGV模型分析