新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 單片機控制的步進電機PWM控制程序

        單片機控制的步進電機PWM控制程序

        作者: 時間:2016-11-18 來源:網絡 收藏
        8051單片機控制步進電機的C51語言編寫的PWM控制程序

        #include
        #include
        #include
        #include "UPSD3200.H"
        #include "upsd_pwm.h"
        #define uint unsigned int
        #define uchar unsigned char
        PSD_REGS PSD8xx_reg _at_ csiop;
        #define KEYIO (~(PSD8xx_reg.DATAIN_A)) & 0x07
        sbit CP=P4^7;
        sbit U_D=P1^1;
        void init_system(); // 系統初始化
        uchar keyboard();
        void uPSD_PWM4_Variable(unsigned char PWM_Period, unsigned char PWM_PulseWidth);
        uchar Adjust_station=NO;
        unsigned char data x,flag;
        unsigned char keyboard() //鍵盤輸入
        {
        unsigned char a=0xff,b=0x01,c=0xf8,d;//有按鍵的位置
        uint i;
        do{
        a=KEYIO|c;
        }while(a==0xff);
        if (a == 0xfe){d = 1;}
        else if (a == 0xfd){d = 2;}
        else if (a == 0xfb){d = 3;}
        else {d = 0;}
        return(d);
        }
        void uPSD_PWM4_Init(void)
        unsigned int PWM_prescaler;
        P4SFS |= 0x80;
        PWM_prescaler = (unsigned int)((FREQ_OSC/2)/PWM4_INPUT_freq);//PWM4輸入脈沖頻率 K

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

        PSCL1L = PWM_prescaler & 0x00ff;
        PSCL1H = (PWM_prescaler >> 8);
        }
        void StepMotor_GO(bit direction,uint speed) {
        unsigned char PWM_Period, PWM_PulseWidth;
        uint temp_uint;
        U_D = direction;//方向
        temp_uint = (PWM4_INPUT_freq*1000)/speed;
        PWM_Period = (unsigned char)temp_uint;
        PWM_PulseWidth = PWM_Period/2;
        uPSD_PWM4_Variable(PWM_Period,PWM_PulseWidth);
        }
        void StepMotor_STOP(void)
        {
        P4SFS &= 0x7f;
        }
        void uPSD_PWM4_Variable(unsigned char PWM_Period, unsigned char PWM_PulseWidth)
        {
        P4SFS |= 0x80;
        PWMVP = PWM_Period;
        PWMVPW = PWM_PulseWidth;
        PWMCON |= 0x20;
        }
        void initkey(void){
        PSD8xx_reg.DATAOUT_A=0xFF;
        PSD8xx_reg.CONTROL_A=0x00;
        PSD8xx_reg.DIRECTION_A=0x00;
        }
        void init_system() // 系統初始化
        {
        WDKEY=0x55;
        P4SFS = (unsigned char) (0x08 << 3);
        uPSD_PWM_Channel_8bit(3,243);
        問題補充:(接著上面的序)
        void uPSD_PWM_Init_8bit(unsigned char PWM_channel_no, unsigned int PWM_freq8, unsigned char PWMCON_value)
        {
        unsigned int PWM_prescaler;
        unsigned char output_polarity_mode;
        output_polarity_mode = PWMCON_value & 0x8F;
        PWMCON = (PWMCON & 0x70) | output_polarity_mode;
        P4SFS = (unsigned char) (0x08 << PWM_channel_no);
        PWM_prescaler = (unsigned int) ( (((unsigned int) FREQ_OSC) / 2) / PWM_freq8);
        PSCL0L = PWM_prescaler & 0x00ff;
        PSCL0H = (PWM_prescaler >> 8);
        PSCL1L = PWM_prescaler & 0x00ff;
        PSCL1H = (PWM_prescaler >> 8);
        }
        void uPSD_PWM_Disable(void)
        {
        PWMCON &= 0xDF;
        }
        void main(void){
        x=0;
        init_system();
        flag=1;
        while(flag==1){
        x=keyboard();
        if(x==1) {StepMotor_GO(0,100);}
        else if(x==2) {StepMotor_GO(1,500);}
        else if(x==3) { StepMotor_STOP();uPSD_PWM_Disable();}
        else if(x==0) {uPSD_PWM_Disable();}
        }
        }



        評論


        技術專區

        關閉
        主站蜘蛛池模板: 黄大仙区| 潮州市| 苗栗县| 桦南县| 喀喇沁旗| 宜兰县| 岳池县| 兰溪市| 大方县| 佛学| 乳山市| 阿克陶县| 徐闻县| 五华县| 剑河县| 肇庆市| 醴陵市| 鱼台县| 阳春市| 南安市| 铁岭县| 黑山县| 馆陶县| 芒康县| 云和县| 万全县| 屏山县| 奉贤区| 革吉县| 萍乡市| 勐海县| 望奎县| 广州市| 古交市| 舞阳县| 象州县| 林西县| 确山县| 岑溪市| 南木林县| 治多县|