新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 直流電機控制Keil c51源代碼

        直流電機控制Keil c51源代碼

        作者: 時間:2016-11-11 來源:網絡 收藏
        直流電機開環控制Keil c51源代碼

        //-----------------------函數聲明,變量定義------------------------
        #include
        #include
        #include
        //-----------------------定義管腳----------------------------------
        sbit PWM=P1^0; //PWM波形輸出
        sbit DR=P1^1;//方向控制
        #define timer_data (256-100) //定時器預置值,12M時鐘是,定時0.1ms
        #define PWM_T 100 //定義PWM的周期T為10ms
        unsigned char PWM_t; //PWM_t為脈沖寬度(0~100)時間為0~10ms
        unsigned char PWM_count;//輸出PWM周期計數
        unsigned char time_count; //定時計數
        bit direction; //方向標志位
        //-----------------------------------------------------------------
        // 函數名稱:timer_init
        // 函數功能:初始化設施定時器
        //-----------------------------------------------------------------
        void timer_init()
        {
        TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位自動重裝) */
        PCON=0x00;
        TF0=0;
        TH0=timer_data; //保證定時時長為0.1ms
        TL0=TH0;
        ET0=1;
        TR0=1; //開始計數
        EA=1;//中斷允許
        }
        //-----------------------------------------------------------------
        // 函數名稱:setting_PWM
        // 函數功能:設置PWM的脈沖寬度和設定方向
        //-----------------------------------------------------------------
        void setting_PWM()
        {
        if(PWM_count==0) //初始設置
        {
        PWM_t=20;
        direction=1;
        }
        }
        //-----------------------------------------------------------------
        // 函數名稱:IntTimer0
        // 函數功能:定時器中斷處理程序
        //-----------------------------------------------------------------
        void IntTimer0() interrupt 1
        {
        time_count++;
        DR=direction;
        if(time_count>=PWM_T)
        {
        time_count=0;
        PWM_count++;
        setting_PWM(); //每輸出一個PWM波調用一次
        }
        if(time_count PWM=1;
        else
        PWM=0;
        }
        //-----------------------------------------------------------------
        // 函數名稱:main
        // 用戶主函數
        // 函數功能:主函數
        //-----------------------------------------------------------------
        void main()
        {
        timer_init();
        setting_PWM();
        }

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

        //=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=·=

        直流電機閉環控制Keil c51源代碼

        //-----------------------函數聲明,變量定義------------------------
        #include
        sbit INT_0 =P3^2; // 將p3.2外部中斷0
        sbit pulse_A=P1^2; // P1.2為脈沖A輸入
        sbit PWM=P1^0; //PWM波形輸出
        sbit DR=P1^1; //方向控制
        //-----------------------預定義值----------------------------------
        #define PWM_T 1800 //定義PWM的周期T為18ms
        #define Ts 1000 //定義光電編碼器采樣時間為10ms
        #define timer_data (256-10) //定時器預置值,12M時鐘是,定時0.01ms
        //-----------------------預設定值----------------------------------
        bit direction; //方向標志位 用戶設定
        unsigned char R; //需要得到的直流電機轉速 用戶設定
        //-----------------------實際運行狀態------------------------------
        bit real_direction; //電機實際運行方向
        unsigned char Rr; //直流電機實際轉速
        //-----------------------計算所得補償狀態--------------------------
        bit compensate_polarity; //補償極性
        unsigned char dR; //轉速補償
        //-----------------------經補償后得到的脈寬------------------------
        unsigned char PWM_t; //PWM_t為脈沖寬度(320~400)時間為3.2~4.0ms
        unsigned char PWM_count; //輸出PWM周期計數
        //-----------------------各中間計數值------------------------------
        unsigned char pulseB_count; //脈沖計數
        unsigned char time0_count; //定時計數
        unsigned char time1_count; //定時計數
        //-----------------------------------------------------------------
        // 函數名稱:timer_init
        // 函數功能:初始化設置定時器
        //-----------------------------------------------------------------
        void timer_init()
        {
        TMOD=0x22; /*定時器1為工作模式2(8位自動重裝),0為模式2(8位自動重裝) */
        PCON=0x00;
        TF0=0;
        TH0=timer_data; //保證定時時長為0.01ms
        TL0=TH0;
        TH1=timer_data; //保證定時時長為0.01ms
        TL1=TH0;
        ET0=1; //定時器0中斷允許
        TR0=1; //定時器0開始計數
        ET1=1; //定時器1中斷允許
        TR1=1; //定時器1開始計數
        EA=1; //中斷允許
        }
        //-----------------------------------------------------------------
        // 函數名稱: INT0_init()
        // 函數功能: 初始化設置
        // 設定INT0的工作方式
        //-----------------------------------------------------------------
        void INT0_init(void )
        {
        pulseB_count=0; //脈沖計數器清零
        IT0=1; //選擇INT0為沿觸發方式
        EX0=1; //外部中斷允許
        EA=1; //系統中斷允許
        }
        //-----------------------------------------------------------------
        // 函數名稱:setting_PWM
        // 函數功能:設置PWM的脈沖寬度和設定方向
        //-----------------------------------------------------------------
        void setting_PWM()
        {
        // direction=1; //設定轉動方向
        // R=540; //設定轉速
        // dR=0; //轉速補償為零
        // calculate_PWM_t(); //重新計算脈寬
        }
        //-----------------------------------------------------------------
        // 函數名稱: calculate_PWM_t
        // 入口參數: R需要得到的直流電機轉速,dR轉速補償
        // 出口參數: PWM_t為脈沖寬度(320~400)時間為3.2~4.0ms
        // 函數功能: 計算脈沖寬度,PWM_t=R/150;
        //-----------------------------------------------------------------
        void calculate_PWM_t()
        {
        if(compensate_polarity==1) //正補償
        PWM_t=(R+dR)/150;
        else
        PWM_t=(R-dR)/150; //負修正
        }
        //-----------------------------------------------------------------
        // 函數名稱: calculate_Rr
        // 入口參數: pulseB_count脈沖計數
        // 出口參數: Rr直流電機實際轉速
        // 函數功能: 計算實際轉速
        //-----------------------------------------------------------------
        void calculate_Rr()
        {
        Rr=pulseB_count/6;
        }
        //-----------------------------------------------------------------
        // 函數名稱: compensate_dR
        // 入口參數: Rr直流電機實際轉速
        // R需要得到的直流電機轉速
        // 出口參數: dR轉速補償
        // 函數功能: 計算實際補償值和補償極性 ,根據不同的補償算法重新設計
        //-----------------------------------------------------------------
        void compensate_Rr()
        {
        Rr=1;
        if(Rr>R)
        compensate_polarity=0; //補償極性
        else
        compensate_polarity=1;
        }
        //-----------------------------------------------------------------
        // 函數名稱: INT0_intrupt
        // 函數功能: 外部中斷0處理程序
        //-----------------------------------------------------------------
        void INT0_intrupt() interrupt 0 using 1
        {
        pulseB_count++;
        if(pulse_A==0)
        {
        real_direction=1; //若P1.2為低電平,則電機為正轉,計數器N的值加1
        }
        else //若為高電平,則電機為反轉,計數器N值減l。
        {
        real_direction=1;
        }
        }
        //-----------------------------------------------------------------
        // 函數名稱:IntTimer0
        // 函數功能:定時器中斷處理程序
        //-----------------------------------------------------------------
        void IntTimer0() interrupt 1
        {
        time0_count++;
        DR=direction;
        if(time0_count>=PWM_T)
        {
        time0_count=0;
        PWM_count++;
        setting_PWM(); //每輸出一個PWM波調用一次
        }
        if(time0_count PWM=1;
        else
        PWM=0;
        }
        //-----------------------------------------------------------------
        // 函數名稱:IntTimer1
        // 函數功能:定時器中斷處理程序
        //-----------------------------------------------------------------
        void IntTimer1() interrupt 3
        {
        time1_count++;
        if(time1_count==1)
        {
        INT0_init(); //初始化外部中斷設置
        }
        if(time1_count>=Ts)
        {
        time1_count=0; //一個補償周期結束,計數器清零
        calculate_Rr(); //計算實際轉速
        compensate_Rr(); //計算實際補償值和補償極性
        calculate_PWM_t(); //重新計算脈寬
        }
        }
        //-----------------------------------------------------------------
        // 函數名稱:main
        // 用戶主函數
        // 函數功能:主函數
        //-----------------------------------------------------------------
        void main()
        {
        direction=1; //設定轉動方向
        R=540; //設定轉速
        dR=0; //轉速補償為零
        calculate_PWM_t(); //重新計算脈寬
        timer_init();
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 普定县| 泰兴市| 宝丰县| 盐山县| 舟山市| 蓬莱市| 禄劝| 邳州市| 讷河市| 林甸县| 舟山市| 昌图县| 阿拉善右旗| 梓潼县| 得荣县| 新邵县| 二连浩特市| 邵阳市| 铁力市| 临潭县| 溆浦县| 垣曲县| 盐边县| 虹口区| 铜川市| 五河县| 那曲县| 梅河口市| 长兴县| 平塘县| 崇礼县| 蒙阴县| 台东市| 白山市| 望城县| 洪江市| 梧州市| 新化县| 通城县| 缙云县| 邵阳市|