新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 微機控制/最小拍控制的C語言描述

        微機控制/最小拍控制的C語言描述

        作者: 時間:2016-11-18 來源:網絡 收藏
        參考電路圖:

        參考程序流程圖:

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

        參考程序:

        /*****************************************
        文件名:ACC4-1-1.C
        功能描述:最小拍有紋波實驗程序。
        *****************************************/
        #include
        #include
        #include
        /*****************************************
        宏定義
        *****************************************/
        #define uchar unsigned char
        #define uint unsigned int
        #define ADC_7 XBYTE[0x7ff0] //定義模數轉換IO地址
        #define DAC_1 XBYTE[0x7ff2] //定義D/A第一路的IO地

        /*****************************************
        全局變量定義
        *****************************************/
        sbit str = P1^7; //定義A/D啟動信號
        sbit DIN0 = P1^0; //聲明同步信號
        uint data time; //聲明變量,用于定時
        uchar data t0_h,t0_l; //用于存儲定時器0的初值
        int TK=100; //聲明采樣周期變量,//采樣周期=TK*10ms
        int TC; //TK的變量
        float KK0=0.5435; //系數kk0
        float KK1=-0.2000; //系數kk1
        float KK2=0; //系數kk2
        float KK3=0; //系數kk3
        float PP1=0.7170; //系數pp1
        float PP2=0; //系數pp2
        float PP3=0; //系數pp3
        char UK; //當前時刻的D/A輸出
        char EK; //當前時刻的偏差
        char UK_1,UK_2,UK_3,EK_1,EK_2,EK_3;//前3次采樣時刻的控制量和偏差
        /*****************************************
        主函數
        *****************************************/
        void main(void)
        {
        TMOD = 0x01;
        time = 10; //定時10ms
        t0_h = (65536-500*time)/256; //計算定時器0初值
        t0_l = (65536-500*time)%256;
        t0_l = t0_l+20; //修正因初值重裝而引起的定時誤差
        TH0 = t0_h;
        TL0 = t0_l;
        IT1 = 1; //邊沿觸發中斷
        EX1 = 1; //開外部中斷1
        ET0 = 1; //開定時中斷0
        TR0 = 1; //啟動定時器

        TC = 1;
        DAC_1= 0x80; //D/A清零
        UK=UK_1=UK_2=UK_3=0;
        EK=EK_1=EK_2=EK_3=0;

        EA = 1; //開總中斷
        while(1);
        }

        /**********************************************
        函數名:INT1
        功能 :1號外部中斷服務程序
        參數 :無*
        返回值:無 *
        ***********************************************/
        void int1() interrupt 2 using 2
        { float i,j;

        DIN0 = 1; //讀取輸入前,先輸出高電平
        if(DIN0) //判同步信號到否
        {
        UK=UK_1=UK_2=UK_3=0;
        EK=EK_1=EK_2=EK_3=0;
        DAC_1 =0x80; //D/A輸出零
        TC=1;
        }
        else
        {
        TC--; //判采樣周期到否
        if(TC==0)
        {
        EK = ADC_7-128; //采樣當前的偏差值,并計算偏差的變化量

        i=EK*KK0; //計算i=EK*KK0+EK_1*KK1+EK_2*KK2+EK_3*KK3)
        i=i+EK_1*KK1;
        i=i+EK_2*KK2;
        i=i+EK_3*KK3;
        j=UK_1*PP1; //計算j=UK_1*PP1+UK_2*PP2+UK_3*PP3
        j=j+UK_2*PP2;
        j=j+UK_3*PP3;
        i=i-j; //i-j

        if(i>0) //判控制量是否溢出,溢出賦極值
        {
        if(i>=127)
        UK=127;
        else
        UK=(char)i;
        }
        else
        {
        if(i<-128)
        UK=-128;
        else
        UK=(char)i;
        }
        DAC_1=UK+128; //D/A輸出控制量
        UK_3=UK_2; //控制量遞推
        UK_2=UK_1;
        UK_1=UK;
        EK_3=EK_2; //偏差遞退
        EK_2=EK_1;
        EK_1=EK;
        TC=TK; //采樣周期變量恢復
        }
        }
        }

        /**********************************************
        函數名:Timer0
        功能 :定時器0中斷服務程序
        參數 :無
        返回值:無
        ***********************************************/
        void Timer0() interrupt 1 using 1
        {
        str = !str; //產生A/D啟動信號
        TH0 = t0_h; //重新裝入初值
        TL0 = t0_l;
        }

        參考結果:

        階躍有波紋

        階躍無波紋

        斜坡有波紋

        斜坡有波紋



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 虎林市| 高密市| 阿坝县| 滁州市| 新兴县| 漳浦县| 平安县| 乌兰浩特市| 隆化县| 中阳县| 横峰县| 沂源县| 浦北县| 山阴县| 连南| 湾仔区| 邯郸市| 青铜峡市| 辽宁省| 黄陵县| 北京市| 都匀市| 永兴县| 长乐市| 鸡泽县| 云梦县| 广西| 南康市| 高淳县| 元阳县| 渑池县| 高尔夫| 濮阳县| 香港 | 肥乡县| 三河市| 原阳县| 盐津县| 格尔木市| 嫩江县| 和龙市|