新聞中心

        ARM9舵機(jī)程序

        作者: 時(shí)間:2016-12-01 來源:網(wǎng)絡(luò) 收藏
        /*****************************************************************************************************************************

        S3C2440A 具有5 個(gè)16 位定時(shí)器,每個(gè)定時(shí)器可以按照中斷模式或DMA 模式工作。定時(shí)器0,1,2,3 具有PWM 功能。定時(shí)器4 是一個(gè)內(nèi)部定時(shí)器,不具有對(duì)外輸出口線。定時(shí)器0 還具有死區(qū)發(fā)生器,通常用于大電流設(shè)備。
        定時(shí)器特性總結(jié)如下。
        ● 5 個(gè)16 位定時(shí)器可以工作在中斷模式或DMA 模式。
        ● 包括2 個(gè)8 位預(yù)分頻器、2 個(gè)4 位分割器。
        ● 輸出波形的占空比可用編程控制(即進(jìn)行脈寬調(diào)制)。
        ● 具有自動(dòng)重載模式或單次觸發(fā)模式。
        ● 具有死區(qū)發(fā)生器。

        與定時(shí)器相關(guān)的寄存器有:TCFG0、TCFG1、TCON、TCMPBn、TCNTBn、TCNTOn
        定時(shí)器的頻率由PCLK分頻而來,即Ftimer = PCLK / (prescaler+1) / MUX
        prescaler位于TCFG0,MUX位于TCFG1
        TCON控制定時(shí)器的運(yùn)行:是否自動(dòng)裝載定時(shí)器初值,是否手動(dòng)裝載,開始/停止 定時(shí)器。
        TCNTBn放定時(shí)器n的初值,裝載用
        TCMPBn放定時(shí)器n的匹配值,用于調(diào)至PWM
        TCNTOn,只讀,用于觀察定時(shí)器n的初值

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

        編程方法如下:
        定時(shí)器初始化()
        {
        設(shè)置預(yù)分頻器prescaler (TCFG0)
        設(shè)置MUX (TCFG1)
        賦初值TCNTB TCNTB = (PCLK / (prescaler+1) / MUX) * 中斷時(shí)間間隔(單位秒)
        TCON: 手動(dòng)跟新打開
        手動(dòng)跟新關(guān)閉
        自動(dòng)裝載(計(jì)時(shí)器循環(huán)計(jì)數(shù))
        啟動(dòng)定時(shí)器
        }

        中斷初始化()
        {
        清除SRCPNF、INTPND中的相應(yīng)中斷標(biāo)志位(可以調(diào)用ClearPending函數(shù))
        填入中斷例程地址于中斷向量表 pISR_TIMER1
        使能相應(yīng)中斷 rINTMSK
        }

        中斷例程() __irq
        {
        ……中斷程序……
        清除SRCPND、INTPND中的相應(yīng)中斷標(biāo)志位
        }

        ******************************************************************************************************************************/

        //以下驅(qū)動(dòng)對(duì)于PCLK=50MHZ的開發(fā)板可以直接添加到工程中使用,GPG14引腳對(duì)應(yīng)一路舵機(jī),需要的話可以在添加7路

        #include "2440addr.h"
        #include "def.h"
        typedef unsigned int uint32;
        #define ClearPending(bit) {rSRCPND |= bit;rINTPND = rINTPND;}//宏定義清零中斷標(biāo)志位
        #define RGB(r,g,b) (unsigned int)(r << 16) + (g << 8) + b
        extern unsigned int pwm[8];
        extern unsigned int *p;//鎖定指針?biāo)傅臄?shù)組,防止跑偏
        void __irq timer0_ISR(void);
        void sifuTimer0(unsigned int);
        void Task1(void);
        void Glib_FilledRectangle(int x1,int y1,int x2,int y2,int color);
        void BUZZER_PWM_Test( void );
        void int_time0_init(void)
        {
        //Uart_Printf("Timer0中斷實(shí)驗(yàn)");
        //p=pwm; //指針初始化
        ClearPending(1<<10); //清楚中斷標(biāo)志
        pISR_TIMER0=(unsigned)timer0_ISR; //填入中斷例程地址于中斷向量表
        rINTMSK&=~(1<<10); //TIME0開中斷
        }

        void __irq timer0_ISR(void) //定時(shí)器中斷函數(shù)
        {
        static char n,biaozhi;
        static unsigned int hhe,good;
        good++;
        n++;
        switch(n)
        {
        case 1: sifuTimer0(*p-400); rGPGDAT|=1<<14; break;
        case 2: sifuTimer0(2900-*p); rGPGDAT&=~(1<<14);n=0; break;
        case 3: sifuTimer0(*(p+1)); break;
        case 4: sifuTimer0(2500-*(p+1)); break;
        case 5: sifuTimer0(*(p+2)); break;
        case 6: sifuTimer0(2500-*(p+2)); break;
        case 7: sifuTimer0(*(p+3)); break;
        case 8: sifuTimer0(2500-*(p+3)); break;
        case 9: sifuTimer0(*(p+4)); break;
        case 10: sifuTimer0(2500-*(p+4)); break;
        case 11: sifuTimer0(*(p+5)); break;
        case 12: sifuTimer0(2500-*(p+5)); break;
        case 13: sifuTimer0(*(p+6)); break;
        case 14: sifuTimer0(2500-*(p+6)); break;
        case 15: sifuTimer0(*(p+7)); break;
        case 16: sifuTimer0(2500-*(p+7)); n=0; break;
        }
        if(good==100)
        {
        // Task1();
        good=0;
        }
        /*biaozhi?(*p)++:(*p)--;
        if(*p>=2050)
        biaozhi=0;
        else if(*p<=50)
        biaozhi=1;*/
        ClearPending(1<<10); //清楚中斷標(biāo)志
        }


        void time0_init(void)
        {
        rTCFG0 = (rTCFG0 &(~0xFF)) | 24;
        rTCFG1 = (rTCFG1 &(~0xF)) | 0;
        rTCNTB0 = 1500;
        rTCON |= 1<<1; //開啟手動(dòng)更新,將TCNTB0的值載入定時(shí)器0
        rTCON &= ~(1<<1); //關(guān)閉手動(dòng)更新(必須)
        rTCON |=0x1<<0; //開啟定時(shí)器,關(guān)閉自動(dòng)裝載模式
        rGPGCON|=1<<28; //舵機(jī)輸出引腳初始化
        rGPGUP=0x00; //舵機(jī)輸出引腳初始化

        //關(guān)于中斷時(shí)間的設(shè)定: TCNTB =(PCLK / (prescaler+1) / MUX) * 中斷時(shí)間間隔(單位秒)
        }
        //裝載的頻率是1MHz
        void sifuTimer0(U32 us)
        {
        rTCON |= 1<<1; //開啟手動(dòng)更新,將TCNTB0的值載入定時(shí)器0
        rTCNTB0=us;
        rTCON &= ~(1<<1); //關(guān)閉更新
        }

        //***********************************************************************************************************
        void Task1(void)
        {
        static unsigned int task1Cnt=0;
        //實(shí)現(xiàn)流水燈
        if((task1Cnt%5 == 0))
        rGPBDAT = 0x1E0; //全滅
        else
        rGPBDAT = rGPBDAT - (0x10<<(task1Cnt%5));
        task1Cnt++;
        }



        關(guān)鍵詞: ARM9舵機(jī)程

        評(píng)論


        技術(shù)專區(qū)

        關(guān)閉
        主站蜘蛛池模板: 贡觉县| 阿鲁科尔沁旗| 大名县| 巴中市| 揭阳市| 苏尼特左旗| 濉溪县| 科技| 湛江市| 东城区| 鄂伦春自治旗| 北流市| 民勤县| 酉阳| 佳木斯市| 揭东县| 宝兴县| 蒙山县| 邵东县| 罗定市| 西充县| 巩义市| 延寿县| 津南区| 田林县| 诏安县| 隆尧县| 华阴市| 松滋市| 巨鹿县| 邵东县| 介休市| 聂荣县| 东乌珠穆沁旗| 仙桃市| 娱乐| 仪征市| 郧西县| 铜川市| 高尔夫| 乌兰浩特市|