找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1691|回复: 2
打印 上一主题 下一主题
收起左侧

滚球系统单点定位STM32代码

[复制链接]
跳转到指定楼层
楼主
ID:483536 发表于 2019-7-10 15:01 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
电赛要到了,自己花了两周做的滚球。

单片机源程序如下:
  1. #include "stm32f4xx.h"
  2. #include "usart.h"
  3. #include "delay.h"
  4. #include "sys.h"
  5. #include "led.h"
  6. #include "timer.h"
  7. #include "key.h"
  8. #include "lcd.h"
  9. #include "usmart.h"
  10. #include "usart2.h"
  11. #include "ov2640.h"
  12. #include "dcmi.h"
  13. #include "string.h"
  14. #include "pwm.h"




  15. u16 rgb_buf[240][240];
  16. u16 gray,hang=0,k=500;
  17. u8 X_MAX,Y_MAX=0,key=0;
  18. u8 X_MIN,Y_MIN=240;
  19. u8 X_MAX_LAST,X_MIN_LAST,Y_MAX_LAST,Y_MIN_LAST=0;//小球上一次坐标
  20. u8 X,Y=0;//小球质心坐标

  21. u16 PWM_X,PWM_Y=0;
  22. float ERR_X,ERR_Y=0;
  23. float ERR_X_LAST,ERR_Y_LAST=0;
  24. float AIM_X=107,AIM_Y=115;
  25. float KP,KI,KD=0;

  26. int main(void)
  27. {
  28.         u16 i,j,n,m;
  29.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);
  30.         delay_init(168);
  31.         uart_init(115200);//用于烧录程序
  32.         usart2_init(42,115200);//用于摄像头
  33.         LED_Init();
  34.         LCD_Init();
  35.         KEY_Init();
  36.         TIM3_Int_Init(200-1,8400-1);
  37.         TIM14_PWM_Init(10000-1,168-1);
  38.         TIM11_PWM_Init(10000-1,336-1);
  39.         usmart_dev.init(84);
  40.         POINT_COLOR=RED;//设置字体为红色
  41.         LCD_ShowString(30,50,200,16,16,"Explorer STM32F4");       
  42.         LCD_ShowString(30,70,200,16,16,"OV2640 TEST");       
  43.         LCD_ShowString(30,90,200,16,16,"ATOM@ALIENTEK");
  44.         LCD_ShowString(30,110,200,16,16,"2014/5/14");  
  45.         while(OV2640_Init())//初始化OV2640
  46.         {
  47.                 LCD_ShowString(30,130,240,16,16,"OV2640 ERR");
  48.                 delay_ms(200);
  49.             LCD_Fill(30,130,239,170,WHITE);
  50.                 delay_ms(200);
  51.         }
  52.         LCD_ShowString(30,130,200,16,16,"OV2640 OK");
  53.         OV2640_RGB565_Mode();        //RGB565模式
  54.         My_DCMI_Init();                        //DCMI配置
  55.         DCMI_DMA_Init((u32)rgb_buf,sizeof(rgb_buf)/4,DMA_MemoryDataSize_HalfWord,DMA_MemoryInc_Enable);//DCMI DMA配置  
  56.         OV2640_OutSize_Set(240,240);
  57.         DCMI_Start();                 //启动传输
  58.     while(1)
  59.         {       
  60.                 if(KEY_Scan(0)==WKUP_PRES)
  61.                 key=!key;
  62.                 LCD_SetCursor(0,0);
  63.                 LCD_WriteRAM_Prepare();
  64.                 for(i=0;i<240;i++)
  65.                 {
  66.                         for(j=0;j<240;j++)
  67.                         {
  68.                                 if(j==239)
  69.                                 {
  70.                                         LCD_SetCursor(0,i+1);
  71.                                         LCD_WriteRAM_Prepare();
  72.                                 }
  73.                 gray=((rgb_buf[i][j]>>11)*19595+((rgb_buf[i][j]>>5)&0x3f)*38469 +(rgb_buf[i][j]&0x1f)*7472)>>16;  //灰度计算。公式请百度
  74.                                 if(gray>=22)
  75.                                 {
  76.                                         LCD->LCD_RAM=WHITE;
  77.                                         if(i==200&&j==45)
  78.                                                 LCD->LCD_RAM=RED;
  79.                                         if(i==200&&j==170)
  80.                                                 LCD->LCD_RAM=RED;
  81.                                         if(i==30&&j==45)
  82.                                                 LCD->LCD_RAM=RED;
  83.                                         if(i==157&&j==138)
  84.                                                 LCD->LCD_RAM=RED;
  85.                                 }
  86.                                 else
  87.                                 {
  88.                                         if(i==200&&j==45)
  89.                                                 LCD->LCD_RAM=RED;
  90.                                         if(i==200&&j==170)
  91.                                                 LCD->LCD_RAM=RED;
  92.                                         if(i==30&&j==45)
  93.                                                 LCD->LCD_RAM=RED;
  94.                                         if(i==157&&j==138)//115 107
  95.                                                 LCD->LCD_RAM=RED;
  96.                                         else if(i>30&&i<200&&j>45&&j<170)
  97.                                         {
  98.                                                 if(i>X_MAX)
  99.                                                         X_MAX=i;
  100.                                                 if(i<X_MIN)
  101.                                                         X_MIN=i;
  102.                                                 if(j>Y_MAX)
  103.                                                         Y_MAX=j;
  104.                                                 if(j<Y_MIN)
  105.                                                         Y_MIN=j;
  106.                                         }
  107.                                         LCD->LCD_RAM=BLACK;
  108.                                 }
  109.                         }
  110.                 }
  111.                         X=(X_MAX+X_MIN)/2;
  112.                         Y=(Y_MIN+Y_MAX)/2;
  113.                         X_MAX=0;
  114.                         X_MIN=240;
  115.                         Y_MAX=0;
  116.                         Y_MIN=240;
  117.                         for(n=0;n<2;n++)
  118.                                 for(m=0;m<2;m++)
  119.                                 {
  120.                                         LCD_SetCursor(Y+m,X+n);
  121.                                         LCD_WriteRAM_Prepare();
  122.                                         LCD->LCD_RAM=RED;
  123.                                 }

  124.                         LCD_ShowxNum(80,80,ERR_X,5,16,0X80);
  125.                         LCD_ShowxNum(80,120,ERR_Y,5,16,0X80);
  126.                         LCD_ShowxNum(80,170,hang,5,16,0X80);
  127.         }
  128. }

  129. void TIM3_IRQHandler(void)
  130. {
  131.         if(TIM_GetITStatus(TIM3,TIM_IT_Update)==SET)
  132.         {       
  133.                                 KP=1.25;//0.75
  134.                                 KD=20;//17.5
  135.                                 KI=0.25;
  136.                                 ERR_X=X-AIM_X;
  137.                                 ERR_Y=Y-AIM_Y;
  138.                                 if(ERR_X<13&&ERR_Y<13)
  139.                                 {
  140.                                         KP=0.75;KD=17.5;
  141.                                         hang++;
  142.                                         if(AIM_X==107)
  143.                                         {
  144.                                                 if(hang==500)
  145.                                                 {
  146.                                                         AIM_X++;
  147.                                                         AIM_Y++;
  148.                                                         hang=0;
  149.                                                 }
  150.                                         }
  151.                                         if(AIM_X<160&&AIM_X>107)
  152.                                         {
  153.                                                 if(hang==10)
  154.                                                 {
  155.                                                         AIM_X++;
  156.                                                         AIM_Y++;
  157.                                                         hang=0;
  158.                                                 }
  159.                                         }
  160.                                         if(AIM_X==160)
  161.                                         {
  162.                                                 AIM_X=107;
  163.                                                 AIM_Y=115;
  164.                                         }
  165.                                 }
  166.                                
  167.                 PWM_X=9080+ERR_X*KP+(ERR_X+ERR_X_LAST)*KI+(ERR_X-ERR_X_LAST)*KD;
  168.                 PWM_Y=9105+ERR_Y*KP+(ERR_X+ERR_X_LAST)*KI+(ERR_Y-ERR_Y_LAST)*KD;
  169.                 if(PWM_Y>9250)PWM_Y=9250;
  170.                 if(PWM_Y<9000)PWM_Y=9000;
  171.                 if(PWM_X>9400)PWM_X=9400;
  172.                 if(PWM_X<8950)PWM_X=8950;
  173.                 ERR_X_LAST=ERR_X;
  174.                 ERR_Y_LAST=ERR_Y;
  175.                
  176.                 TIM_SetCompare1(TIM14,PWM_X);
  177.                 TIM_SetCompare1(TIM11,PWM_Y);
  178.         }
  179.         TIM_ClearITPendingBit(TIM3,TIM_IT_Update);
  180. }
复制代码

所有资料51hei提供下载:
单点定位最终版 - 副本.7z (373.46 KB, 下载次数: 27)


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2019-7-11 16:15 | 只看该作者
本帖需要重新编辑补全电路原理图,源码,详细说明与图片即可获得100+黑币(帖子下方有编辑按钮)
回复

使用道具 举报

板凳
ID:589396 发表于 2019-7-24 15:20 | 只看该作者
请问这个代码是整个滚球系统的所有代码吗?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表