<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 設(shè)計(jì)應(yīng)用 > 基于ATmega128編碼器控制步進(jìn)電機(jī)的平衡系統(tǒng)

          基于ATmega128編碼器控制步進(jìn)電機(jī)的平衡系統(tǒng)

          作者: 時(shí)間:2012-08-13 來(lái)源:網(wǎng)絡(luò) 收藏


          這里是delay.h
          //根據(jù)CPU時(shí)鐘頻率選擇
          #ifndef F_CPU
          //#define F_CPU 7372800
          //#define F_CPU 8000000
          //#define F_CPU 11059200
          //#define F_CPU 12000000
          #define F_CPU 16000000
          #endif

          //------------------------------------------------------------------------------
          //1、2、3、5和10us的精確延時(shí),用于需要精確時(shí)間的場(chǎng)合,比如DS18B20
          //------------------------------------------------------------------------------
          #if F_CPU == 7372800
          #define DELAY_1US NOP();NOP();NOP();NOP();NOP();NOP();NOP()
          #define DELAY_2US DELAY_1US;DELAY_1US
          #define DELAY_3US DELAY_1US;DELAY_1US;DELAY_1US
          #define DELAY_5US DELAY_2US;DELAY_3US
          #define DELAY_10US DELAY_5US;DELAY_5US

          #elif F_CPU == 8000000
          #define DELAY_1US NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
          #define DELAY_2US DELAY_1US;DELAY_1US
          #define DELAY_3US DELAY_1US;DELAY_1US;DELAY_1US
          #define DELAY_5US DELAY_2US;DELAY_3US
          #define DELAY_10US DELAY_5US;DELAY_5US

          #elif F_CPU == 11059200
          #define DELAY_1US NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
          #define DELAY_2US DELAY_1US;DELAY_1US
          #define DELAY_3US DELAY_1US;DELAY_1US;DELAY_1US
          #define DELAY_5US DELAY_2US;DELAY_3US
          #define DELAY_10US DELAY_5US;DELAY_5US

          #elif F_CPU == 12000000
          #define DELAY_1US NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
          #define DELAY_2US DELAY_1US;DELAY_1US
          #define DELAY_3US DELAY_1US;DELAY_1US;DELAY_1US
          #define DELAY_5US DELAY_2US;DELAY_3US
          #define DELAY_10US DELAY_5US;DELAY_5US

          #elif F_CPU == 16000000
          #define DELAY_1US NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP();NOP()
          #define DELAY_2US DELAY_1US;DELAY_1US
          #define DELAY_3US DELAY_1US;DELAY_1US;DELAY_1US
          #define DELAY_5US DELAY_2US;DELAY_3US
          #define DELAY_10US DELAY_5US;DELAY_5US
          #endif


          //------------------------------------------------------------------------------
          //函數(shù)聲明
          //------------------------------------------------------------------------------

          void delay_nus(unsigned int);//10us時(shí)誤差較大,用于無(wú)須精確延時(shí)的場(chǎng)合

          void delay_nms(unsigned int);


          #endif//__DELAY_H


          這里是delay.c
          //|文件名稱|delay.c
          //|--------|--------------------------------------------------------------------
          //|描 述|延時(shí)文件
          //|--------|--------------------------------------------------------------------
          //|說(shuō) 明|delay_us(unsigned int time)用于不需精確定時(shí)的場(chǎng)合,10us時(shí)誤差較大
          //| |若要精確定時(shí)用delay.h里的宏
          //|--------|--------------------------------------------------------------------
          //|調(diào)用文件|delay.h
          //|--------|--------------------------------------------------------------------
          //|作 者|
          //|--------|--------------------------------------------------------------------
          //|版 本|
          //|--------|--------------------------------------------------------------------
          //|時(shí) 間|
          //|--------|--------------------------------------------------------------------
          //|E-mail |
          //|--------|--------------------------------------------------------------------
          //|開(kāi)發(fā)環(huán)境|ICCAVR6.31
          //==================================================

          #include "delay.h"

          #if F_CPU == 7372800
          void delay_nus(unsigned int time)
          {
          unsigned int i;
          for(i=0;itime;i++)
          {
          NOP();
          }
          }

          void delay_nms(unsigned int time)
          {
          unsigned int i,j;
          for(i=0;itime;i++)
          {
          for(j=0;j1045;j++);
          }
          }

          #elif F_CPU == 8000000
          void delay_nus(unsigned int time)
          {
          unsigned int i;
          for(i=0;itime;i++)
          {
          NOP();NOP();
          }
          }

          void delay_nms(unsigned int time)
          {
          unsigned int i,j;
          for(i=0;itime;i++)
          {
          for(j=0;j1178;j++);
          }
          }

          #elif F_CPU == 11059200
          void delay_nus(unsigned int time)
          {
          unsigned int i;
          for(i=0;itime;i++)
          {
          NOP();NOP();NOP();NOP();NOP();
          }
          }

          void delay_nms(unsigned int time)
          {
          unsigned int i,j;
          for(i=0;itime;i++)
          {
          for(j=0;j1578;j++);
          }
          }

          #elif F_CPU == 12000000
          void delay_nus(unsigned int time)
          {
          unsigned int i;
          for(i=0;itime;i++)
          {
          NOP();NOP();NOP();NOP();NOP();
          }
          }

          void delay_nms(unsigned int time)
          {
          unsigned int i,j;
          for(i=0;itime;i++)
          {
          for(j=0;j1713;j++);
          }
          }

          #elif F_CPU == 16000000
          void delay_us(unsigned int time)
          {
          unsigned int i;
          for(i=0;itime;i++)
          {
          NOP();NOP();NOP();NOP();NOP();NOP();
          NOP();NOP();NOP();NOP();
          }
          }

          void delay_ms(unsigned int time)
          {
          unsigned int i,j;
          for(i=0;itime;i++)
          {
          for(j=0;j2288;j++);
          }
          }

          #endif
          這里是dianji.h
          #ifndef __DIANJI_H
          #define __DIANJI_H

          #define EN_1 PORTC|=(10)
          #define EN_0 PORTC=~(10)

          void one_circle(void);
          void circle(unsigned int xcircle);

          #endif

          這里是dianji.c
          #include"dianji.h"
          #include"delay.h"
          #includeiom128v.h>


          /*旋轉(zhuǎn)一周子函數(shù)*/
          void one_circle(void)
          {
          unsigned int i;
          for(i=0;i3200;i++)
          {
          EN_1;
          delay_us(100);
          EN_0;
          delay_us(100);
          }
          }
          /*根據(jù)計(jì)算的數(shù)值旋轉(zhuǎn)任意角度子函數(shù)*/
          void circle(unsigned int xcircle)
          {
          unsigned int i,j;
          for(j=0;jxcircle;j++)
          {
          for(i=0;i3;i++)
          {
          EN_1;
          delay_us(100);
          EN_0;
          delay_us(100);
          }
          }
          }
          這里是caiji.h
          #ifndef __CAIJI_H
          #define __CAIJI_H

          //宏定義595
          #define SCK_0 PORTB=~(1PB4)
          #define SCK_1 PORTB|=(1PB4)
          #define LCK_0 PORTB=~(1PB5)
          #define LCK_1 PORTB|=(1PB5)
          #define SDI_0 PORTB=~(1PB6)
          #define SDI_1 PORTB|=(1PB6)

          #define DIR_0 PORTC=~(11)
          #define DIR_1 PORTC|=(11)


          void init_xianshi(void);
          void send_595(unsigned char dat);
          void jiaoduzhuanhuan(void);


          #endif

          這里是caiji.c
          #include"caiji.h"
          #include"dianji.h"
          #includeiom128v.h>
          #includemacros.h>
          #includemath.h>

          //一些變量的定義
          int k=0;
          unsigned int x=1,d=0,c=0,cir=0;
          unsigned int a,aa,q,angle=0,p=0;
          //595(數(shù)碼管)顯示數(shù)組
          unsigned char led[]=
          {
          0x3F, // 0
          0x06, // 1
          0x5B, // 2
          0x4F, // 3
          0x66, // 4
          0x6D, // 5
          0x7D, // 6
          0x07, // 7
          0x7F, // 8
          0x6F, // 9
          };
          //外部中斷0~3向量號(hào)碼
          #pragma interrupt_handler Zhongduan_0:2
          #pragma interrupt_handler Zhongduan_1:3
          #pragma interrupt_handler Zhongduan_2:4

          //端口輸入輸出初始化
          void init_xianshi(void)
          {
          DDRA=0XFF;
          DDRB=0XFF;//595控制口
          DDRC=0XFF;//正反轉(zhuǎn)提示LED
          PORTC=0XFF;//LED初始化(暗)
          }


          //595串入一字節(jié)并處發(fā)送一字節(jié)子函數(shù)
          void send_595(unsigned char dat)
          {
          unsigned char i;
          LCK_0;
          SDI_1;
          SCK_0;
          //上面的三條語(yǔ)句為了初始化端口狀態(tài)
          for(i=0;i8;i++)
          {
          LCK_0;//時(shí)鐘線拉低

          if(dat0x80)
          SDI_1;
          else SDI_0;
          dat=dat1;
          delay_us(100);
          LCK_1; //時(shí)鐘線拉高將數(shù)據(jù)讀入595的移位寄存器
          delay_us(100);
          }
          SCK_1; //發(fā)送數(shù)據(jù)到并行端口
          SCK_0;
          }

          void jiaoduzhuanhuan(void)
          {
          init_xianshi();
          EIMSK=0X0F;
          EICRA=0XAA;
          while(1)
          {
          if(a!=aa) /*如果有角度變化就執(zhí)行下面的程序*/
          {
          angle++;

          if(!(PING0X04))
          cir++;
          while(cir)
          {
          if(!k)
          {
          delay_ms(800);
          if(d=3)
          one_circle();
          d++;
          }
          }

          if(!(PING0X02))
          {
          while(PING0X01)
          {
          DIR_0;
          circle(1);
          p++;
          while(p==angle);
          }
          while(PING0X01);
          if(q=-1)//正轉(zhuǎn)
          DIR_1;
          circle(1);

          if(q==1) //反轉(zhuǎn)
          DIR_1;
          }

          aa=a;

          if(!x)
          {
          PORTC=0X00;
          }
          }
          /*下面為數(shù)碼管顯示當(dāng)前計(jì)數(shù)的數(shù)值*/
          PORTA=0X08;
          send_595(0x00);
          send_595(led[abs(k)%10]);
          PORTA=0X01;
          send_595(0x00);
          send_595(led[(abs(k)%100)/10]);
          PORTA=0X02;
          send_595(0x00);
          send_595(led[(abs(k)%1000)/100]);
          PORTA=0X04;
          send_595(0x00);
          send_595(led[abs(k)/1000]);
          SEI(); /*使能中斷*/
          }
          }

          void Zhongduan_0(void)
          {
          CLI();
          x=0;
          //////////////////
          if(PIND0X02)
          q=-1;
          if(!(PIND0X02))
          q=1;
          ////////////////
          k=k+q;
          SEI();
          }

          void Zhongduan_1(void)
          {
          CLI();

          if(PIND0X01)
          q=1;
          k=k+q;
          if(abs(k)==10000)
          {
          k=0;
          }
          a=k;
          //EIMSK=0X0E;
          SEI();
          }
          void Zhongduan_2(void)
          {
          CLI();
          k=0;
          SEI();
          }
          這里是main.c
          #includeiom128v.h>
          #includemacros.h>
          #include"delay.h"
          #include"caiji.h"
          #include"dianji.h"

          void init(void)
          {
          DDRC=0X03;
          PORTC=0X00;
          }

          void main(void)
          {
          init(); //初始化子函數(shù)
          jiaoduzhuanhuan(); //主程序的實(shí)現(xiàn)
          }


          上一頁(yè) 1 2 下一頁(yè)

          評(píng)論


          相關(guān)推薦

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

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();