新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 舵機程序之一個定時器帶32路

        舵機程序之一個定時器帶32路

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

        void mpf(struct HH *MP,unsigned int *p,unsigned char ong) //冒泡法
        {
        char i,j;
        unsigned int num;
        for(i=0;i{
        *((*MP->pwm)+i)=*(p+i); //把*p的數據存儲至MP->pwm【】
        }
        for(i=ong;i>0;i--)
        for(j=0;j<(i%4);j++)
        {
        if(MP->pwm[i/4][j]>MP->pwm[i/4][j+1])
        {
        num=MP->pwm[i/4][j];
        MP->pwm[i/4][j]=MP->pwm[i/4][j+1];
        MP->pwm[i/4][j+1]=num;
        }
        } //冒泡法對大小進行排序,順序是從小到大
        }
        /**************************************************************************************************
        函數名:sjcl(struct HH *MP,unsigned char ong)
        功能: 經過冒泡法處理之后再把重復的數據進行處理使得每個數值只保留一個
        作者: the sea
        時間: ~~~
        備注: 大概可以總結為除同存異(前提必須經過冒泡法處理過的數據本函數才有效)
        ***************************************************************************************************/
        void sjcl(struct HH *MP,unsigned char ong) //數據處理,pwm數組當中大小相同的數值處理存儲到結構體Hpwm
        {
        char i,j,num;
        for(i=(ong/4);i>=0;i--)
        {
        num=0;
        for(j=0;j<3;j++)
        {
        if(MP->pwm[i][j]==MP->pwm[i][j+1])
        {
        num++;
        }
        else
        {
        MP->pwm[i][j-num]=MP->pwm[i][j];
        }
        }
        MP->pwm[i][3-num]=MP->pwm[i][3];
        MP->geshu[i]=4-num; //排除相同的數據之后數據的數目
        }
        }
        /**************************************************************************************************
        函數名:Shgx(unsigned int *p)
        功能: 更新舵機位置
        作者: the sea
        時間: ~~~
        備注: 刷新
        ***************************************************************************************************/
        void Shgx(unsigned int *p) //pwm數據更新
        {
        char i;
        for(i=Bijiao_7;i>=0;i--)
        pwm[i]=*(p+i); //數組數據更新
        mpf(hpwm,p,Bijiao_7);
        sjcl(hpwm,Bijiao_7); //數據更新之后再次刷新處理
        }
        /**************************************************************************************************
        函數名:ZT_fh(unsigned char cs)
        功能: 定時器中斷調用,用于返還io口電平狀態數據
        作者: the sea
        時間: ~~~
        備注:
        ***************************************************************************************************/
        unsigned int Zt_fh(unsigned char cs,unsigned char ong)
        {
        char i;
        static unsigned int num;
        if(cs==2)
        num=0xf; //一個周期把num復位至0xf
        for(i=ong;i>=0;i--)
        {
        if(hpwm->pwm[hpwm->Cs][cs-2]==pwm[i+(hpwm->Cs*4)])
        {
        num&=~(1< }
        }
        return num;
        }
        /**************************************************************************************************
        函數名:daley(unsigned int us)
        功能: 延時
        作者: the sea
        時間: ~~~
        備注: 延時函數
        ***************************************************************************************************/
        void daley(unsigned int us)
        {
        unsigned int i,j;
        for(i=100;i>0;i--)
        for(j=us;j>0;j--)
        {
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        }
        }
        /**************************************************************************************************
        函數名:T0_zd(void) interrupt 1
        功能: 定時器0中斷函數
        作者: the sea
        時間: ~~~
        備注: 制造控制舵機所需的pwm
        /***************************************************************************************************/
        void T0_zd(void) interrupt 1
        {
        static unsigned char num=0;
        num++;
        if(num==1)
        {
        switch(hpwm->Cs)
        {
        case 0: P0=0xf;break;
        case 1: P0=0xf<<4;break;
        case 2: P1=0xf;break;
        case 3: P1=0xf<<4;break;
        case 4: P2=0xf;break;
        case 5: P2=0xf<<4;break;
        case 6: P3=0xf;break;
        case 7: P3=0xf<<4;break;
        }
        Timer0(hpwm->pwm[hpwm->Cs][0]);
        }
        else if(hpwm->geshu[hpwm->Cs]>=num)
        {
        switch(hpwm->Cs)
        {
        case 0: P0=Zt_fh(num,3);break;
        case 1: P0=Zt_fh(num,3)<<4;break;
        case 2: P1=Zt_fh(num,3);break;
        case 3: P1=Zt_fh(num,3)<<4;break;
        case 4: P2=Zt_fh(num,3);break;
        case 5: P2=Zt_fh(num,3)<<4;break;
        case 6: P3=Zt_fh(num,3);break;
        case 7: P3=Zt_fh(num,3)<<4;break;
        } //把舵機所需的電平狀態傳給p口
        Timer0(hpwm->pwm[hpwm->Cs][num-1]-hpwm->pwm[hpwm->Cs][num-2]); //hpwm->geshu需要送人定時器hpwm->pwm【】數據個數
        }
        else
        {
        IoPH; //io口電平拉低
        Timer0(2500-hpwm->pwm[hpwm->Cs][hpwm->geshu[hpwm->Cs]-1]); //將舵機pwm所需低電平時間供出
        num=0;
        hpwm->Cs>=7? hpwm->Cs=0 : ++hpwm->Cs;
        }
        }

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

        上一頁 1 2 下一頁

        評論


        技術專區

        關閉
        主站蜘蛛池模板: 辽阳县| 民和| 高邑县| 长宁区| 海南省| 阳西县| 旅游| 鹰潭市| 武定县| 漾濞| 金寨县| 波密县| 额尔古纳市| 玛曲县| 呼图壁县| 青浦区| 泗洪县| 宁武县| 长治市| 明水县| 崇文区| 弥勒县| 松滋市| 宝应县| 鄯善县| 自治县| 阳山县| 大洼县| 泸水县| 万载县| 嘉峪关市| 石渠县| 乐亭县| 年辖:市辖区| 合作市| 梅河口市| 九龙县| 华池县| 扬州市| 鄱阳县| 汉川市|