【TI 技术资料分享】+对太阳点光源进行跟踪

2019-07-30 18:33发布

MSP430F149,IAR,ADC采样之后对太阳点光源进行跟踪 MSP430F149,IAR,ADC采样之后对太阳点光源进行跟踪.zip (30.58 KB, 下载次数: 7) 2015-3-9 21:47 上传 点击文件名下载附件
  1. #include "msp430x14x.h"
  2. #define left result[0]
  3. #define right result[1]
  4. #define key_zuo      (P4IN & 0x10)
  5. #define key_you      (P4IN & 0x20)
  6. #define uchar unsigned char
  7. uchar i_1,i_2;
  8. unsigned char sd=0;
  9. unsigned char ct=0;
  10. unsigned char tf=0;
  11. unsigned char sf=1;
  12. unsigned char zf=0;
  13. unsigned char reset=0;
  14. unsigned char adc_flag=0;
  15. unsigned int tt=0;
  16. unsigned int a,b,c,d;
  17. unsigned int ctx,cty;
  18. int x,y,xt,yt;
  19. unsigned int results[4];
  20. unsigned char  F_Rotation[4]={0x03,0x06,0x0c,0x09};//正转表格0x01,0x02,0x04,0x08
  21. unsigned char  B_Rotation[4]={0x09,0x0c,0x06,0x03};//反转表格
  22. void delay(unsigned int z)
  23. {
  24. while(z)
  25. {z--;}
  26. }
  27. void zuozhuan()
  28. {
  29.   uchar i;
  30.   for(i=0;i<4;i++)
  31.   {
  32.     for(i_1=0;i_1<4;i_1++)
  33.     {
  34.     P4OUT =B_Rotation[i_1];
  35.     delay(16000);
  36.     }
  37.   }
  38. }


  39. void youzhuan()
  40. {
  41.   uchar i;
  42.   for(i=0;i<4;i++)
  43.   {
  44.     for(i_1=0;i_1<4;i_1++)
  45.     {
  46.     P4OUT =F_Rotation[i_1];
  47.     delay(26000);
  48.     }
  49.   }
  50. }
  51. int abs(int x)//取绝对值函数
  52. {
  53.   int y;
  54.   if(x>=0)
  55.   {
  56.     y=x;
  57.   }
  58.   else
  59.   {
  60.     y=-x;
  61.   }
  62.   return y;
  63. }


  64. void delayms(unsigned int z)
  65. {
  66.   unsigned int x,y;
  67.    for(x=0;x<z;x++)
  68.    {
  69.      for(y=0;y<1000;y++);
  70.    }
  71. }


  72. void init_timerA()
  73. {
  74.   TACTL|=TASSEL1+TACLR+ID0+ID1;
  75.   TACTL|=MC0+TAIE;//中断使能&停止模式
  76.   TACCR0=2999;
  77. }

  78. void init_clk()
  79. {
  80.   unsigned char i;
  81.   BCSCTL1&=~XT2OFF;
  82.   BCSCTL2|=SELM1+SELS;
  83.   do
  84.   {
  85.     IFG1 &= ~OFIFG;
  86.     for(i=0;i<100;i++)
  87.       delay(1);
  88.   }
  89.   while((IFG1 & OFIFG) != 0);
  90.   IFG1&=~OFIFG;
  91. }
  92. void init_adc()
  93. {
  94.   P6SEL |= 0x0f;
  95.   ADC12CTL0=ADC12ON+MSC+SHT0_2;
  96.   ADC12CTL1=SHP+CONSEQ_1;
  97.   ADC12MCTL0=0x00;
  98.   ADC12MCTL1=0x01;
  99.   ADC12MCTL2=0x02;
  100.   ADC12MCTL3=0x83;
  101.   ADC12IE=0x08;
  102.   ADC12CTL0 |= ENC;
  103. }
  104. void zuobiao()      //实时坐标,亮度显示
  105. {  
  106.     zf=0;
  107. }
  108. void aim()                  //初始对准程序
  109. {
  110.   //unsigned char i,k;
  111.   init_timerA();
  112.   sf=1;
  113.   adc_flag=1;
  114.   tf=1;
  115.   _EINT();
  116.   if(zf)
  117.     {
  118.       zf=0;
  119.       zuobiao();
  120.     }
  121.   sf=0;
  122.   adc_flag=0;
  123.   tf=0;
  124. }
  125. void move()                       //电机运动控制
  126. {
  127. // unsigned char k;
  128.   TACTL&=~MC0;
  129.   //k='n';
  130.   if(sd==1)
  131.   {
  132.    // k=keyscan();
  133.     //switch(k)
  134.     while(1)
  135.     {
  136.      // if() yt=y+1;
  137.       //case '8':yt=y-1;break;
  138.       if(key_zuo!=0x10) xt=x+1;
  139.       if(key_you!=0x20)  xt=x-1;
  140.     }
  141.   }
  142. // if(yt<0)
  143. // {
  144. //   yt=0;
  145. // }
  146.   if(xt<0)
  147.   {
  148.     xt=0;
  149.   }
  150.   //yt=yt%90;
  151.   xt=xt%180;
  152.   if(sf==0)
  153.   {
  154.    if(x>xt)
  155.    {
  156.      zuozhuan();
  157.      ctx--;
  158.      x=ctx/24;
  159.    }
  160.    if(x<xt)
  161.    {
  162.      youzhuan();
  163.      ctx++;
  164.      x=ctx/24;
  165.    }
  166.   // if(y>yt)
  167.   // {
  168. //    P4OUT&=~(diry);
  169. //    P4OUT^=clky;
  170.   //   cty--;
  171.   //   y=cty/24;
  172. //  }
  173. //  if(y<yt)
  174. //  {
  175. //    P4OUT|=diry;
  176. //    P4OUT^=clky;
  177. //    cty++;
  178. //    y=cty/24;
  179. //  }
  180.   }
  181.   TACTL|=MC0;
  182. }

  183. void track()                   //寻光
  184. {
  185. // int dx,dy;
  186.   int dx;
  187. /* dy=a-b;
  188.   if(dy>=0)
  189.   {
  190.     yt=y+1;
  191.     if(yt==90)
  192.     {yt=y-1;}
  193.     yt=yt%90;
  194.   }
  195.   else
  196.   {
  197.     yt=y-1;
  198.     if(yt<0)
  199.     { yt=0;}
  200.     yt=yt%90;
  201.   }*/
  202. dx=a-b;
  203.   if(dx>=0)
  204.   {
  205.     xt=x+1;
  206.     if(xt==180)
  207.     {xt=x-1;}
  208.     xt=xt%180;
  209.   }
  210.   else
  211.   {
  212.     xt=x-1;
  213.     if(xt<0)
  214.     { xt=0;}
  215.     xt=xt%180;
  216.   }
  217. // if((abs(dx)<100)&&(abs(dy)<100))
  218.     if((abs(dx)<100))
  219.   {
  220.     sf=1;
  221.   }
  222.   if((abs(dx)>200))
  223.   {
  224.     sf=0;
  225.   }
  226. }

  227. void main()
  228. {
  229.   // Stop watchdog timer to prevent time out reset
  230.   WDTCTL = WDTPW + WDTHOLD;
  231.   init_clk();
  232.   delayms(1000);
  233.   P4DIR=0xff;
  234.   init_adc();
  235.   aim();
  236.   while(1)
  237.   {if(reset)
  238.      reset=0;

  239.    if(zf)
  240.      zf=0;
  241.   }
  242.   
  243. }
  244. #pragma vector=TIMERA1_VECTOR
  245. __interrupt void Timer_A(void)
  246. {
  247.   switch(TAIV)
  248.   {
  249.   case 2:break;
  250.   case 4:break;
  251.   case 10:
  252.           _EINT();
  253.           tt++;
  254.           if(tt==200)
  255.           {zf=1;tt=0;}
  256.           if(tf)
  257.           {  
  258.             TACTL&=~MC0;
  259.            while(ct<10)
  260.            {
  261.             while(adc_flag==1)
  262.             {
  263.              ADC12CTL0 |= ADC12SC;
  264.              adc_flag=0;
  265.             }
  266.            }
  267.               ct=0;
  268.               a=results[0]/10;
  269.               results[0]=0;
  270.               b=results[1]/10;
  271.               results[1]=0;
  272.               c=results[2]/10;
  273.               results[2]=0;
  274.               d=results[3]/10;
  275.               results[3]=0;
  276.               track();
  277.               TACTL|=MC0;
  278.           }
  279.           move();
  280.           break;
  281.   default:break;
  282.   }
  283. }
  284. #pragma vector=ADC_VECTOR
  285. __interrupt void ADC12ISR()
  286. {
  287.   results[0]+=ADC12MEM0;
  288.   results[1]+=ADC12MEM1;
  289.   results[2]+=ADC12MEM2;
  290.   results[3]+=ADC12MEM3;
  291.   ct++;
  292.   adc_flag=1;
  293. }
复制代码



0条回答

一周热门 更多>