新聞中心

        EEPW首頁 > 電源與新能源 > 設計應用 > 聲音引導系統完整硬件設計和源代碼

        聲音引導系統完整硬件設計和源代碼

        作者: 時間:2016-12-08 來源:網絡 收藏

        電機進行前進和后退,因此需采用位置式PID控制。

        本文引用地址:http://www.104case.com/article/201612/327594.htm

        經過不斷的測試,比例,積分,微分常數目前調出的最佳參數如下:

        Kp: 1.6 Ki: 2.1 Kd:1.4 具體部分代碼參見附錄。第五章調試及結果分析

        5.1音頻信號采集模塊調試

        次數

        聲源離接收器的距離/cm

        波形是否有變化

        1

        10

        2

        50

        3

        100

        4

        150

        不定

        5

        200

        5.2路程測量測試

        次數

        測試距離(cm)

        實際距離(cm)

        誤差計算

        1

        45

        47

        4.44%

        2

        50

        51

        2.00%

        3

        55

        57

        5.18%

        4

        60

        59

        1.67%

        調試儀器:20MHz雙蹤示波器、信號發生器、數字萬用表、秒表、米尺等

        5.3結果分析

        經測試,在外界干擾不是太強的情況下,可移動聲源能夠通過接收器方傳回的數據精確地定位,精度在1—3cm.

        PID調試部分代碼:

        // define difference : the difference between the latest data and the previous data

        // define U0 : the PWM to send to the moto

        int main (void)

        {

        ······ // Omitted the previous code

        int P = 0 , D = 0 ;

        tcount++ ;

        CarState.E0 = BitNum ;

        if ( CarState.E0 == CarState.E1 ) if ( CarState.E0 == 0 ) FlagD = 0 ;

        else if ( CarState.E0 < CarState.E1 ) FlagD = -1 ;

        else if ( CarState.E0 > CarState.E1 ) FlagD = 1 ;

        P = CarState.E0 * Kp ;

        D = Kd * KdS * ( CarState.E0 + 3*CarState.E1 - 3*CarState.E2 - CarState.E3 ) ;

        if ( D < - 30 * KdS ) D = -30*KdS ;

        else if ( D > 30*KdS ) D = 30*KdS ;

        if ( D != 0 ) D_old = D ;

        if ( D_old < -10 ) D_old++ ;

        else if ( D_old > 10 ) D_old-- ;

        if ( (CarState.E0 > -3)&&(CarState.E0 < 3) ) S = 0 ;

        else if ( ( FlagD == -1) && ( CarState.E0 <= -1 ) )

        if ( S > ( BitNum * BitNum * 20 * KsS ) ) S-- ;

        else if ( ( FlagD == -1) && ( CarState.E0 >= -1 ) ) S = 0 ; //

        else if ( ( FlagD == 1 ) && ( CarState.E0 <= 1 ) ) S = 0 ; //

        else if ( ( FlagD == 1 ) && ( CarState.E0 >= 1 ) )

        if ( S < ( BitNum * BitNum * 20 * KsS) ) S++ ; //

        u8_pwm_a = U0 + P + ( D_old / KdS )+ ( S / KsS ); // ;

        ······ // Omitted the following code

        }


        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 凌云县| 丹寨县| 若羌县| 正阳县| 肇庆市| 双辽市| 淳化县| 平远县| 叶城县| 大埔县| 礼泉县| 双辽市| 周口市| 长顺县| 沾益县| 任丘市| 灵寿县| 鄂尔多斯市| 珠海市| 屯昌县| 广安市| 湘潭市| 微山县| 阿拉善盟| 安吉县| 怀集县| 临安市| 神池县| 金川县| 寿光市| 新河县| 太白县| 桂东县| 包头市| 洛隆县| 页游| 威海市| 攀枝花市| 洞口县| 广安市| 特克斯县|