找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1721|回复: 1
收起左侧

2020年电赛省赛非接触物体测量STM32F4单片机+OPENMV源程序

[复制链接]
ID:524037 发表于 2022-5-14 21:05 | 显示全部楼层 |阅读模式
  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"
  5. #include "lcd.h"
  6. #include "pwm.h"
  7. #include "key.h"
  8. #include "openmv.h"
  9. #include "data_deal.h"
  10. #include "control.h"
  11. #include "ui.h"
  12. extern int32_t  out_pwm,last_out_pwm;
  13. #define Focal 180//焦距 测量所得
  14. #define X_Error_MAX 0 //X 轴偏差允许范围
  15. openmv_s Dealover_OV;
  16. TFmini   Dealover_TF;
  17. int32_t X_error,cen_x;
  18. u16 OV_Deal_count=0,TF_Deal_count=0;
  19. int Shape_buf[100],i;
  20. u32 distance_buf[100];
  21. float Cx_buf[100],Cy_buf[100],Length_buf[100];
  22. float  dealover_distance,Actual_length;
  23. int        still_pwm=0;
  24. u8 First_start_test_flag,TF_over_flag=0,OV_over_flag=0,Third_start_test_flag=0;
  25. void GET_Size();
  26. int main(void)
  27. {      
  28.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
  29.         delay_init(168);      //初始化延时函数
  30.         LED_Init();
  31.         KEY_Init();
  32.         uart1_init(115200);                //初始化串口波特率为115200
  33.         openmv_init();
  34.         TIM10_PWM_Init(40000,50);  //设置为 20000  20ms/20000=0.001ms  脉宽范围为(20000-500)19500-(20000-2500) 17500
  35.          LCD_Init();           //初始化LCD FSMC接口
  36.         POINT_COLOR=BLACK;      //画笔颜色:红色
  37.         LED1=0;     //PF10 连接openMV p7 LED1亮为1,2        
  38.         Servo=1;     // PF9 连接openMV p LED1灭为4        
  39.         delay_ms(1000);//等待数据稳定
  40.         
  41.           while(1)
  42.         {  
  43.                
  44. /**********题1.2**********/               
  45.                  if(KEY_Scan(1)==1)
  46.                 {
  47.                         
  48.                         First_start_test_flag=1;
  49.                         LED1=1;
  50.                 }
  51. /**********题3**********/
  52.                 if(KEY_Scan(1)==3)
  53.                 {
  54.                         Third_start_test_flag=1;
  55.                 }
  56. /***************开始读取值并处理***************/
  57.                 if(First_start_test_flag)   
  58.                 {

  59.                         LCD_ShowString(60,10,140,140,16,"Testing");
  60.                         GET_Size();
  61.                         //delay_ms(1000);//测完值就等待1s
  62.                         /***********所有数据处理完毕 显示界面*******************/
  63.                         if(TF_over_flag&&OV_over_flag)
  64.                         {   
  65.                                 LCD_ShowString(20,10,140,140,16,"Test Over");
  66.                                 if(First_start_test_flag)
  67.                                         UI_1(Dealover_OV,Actual_length,dealover_distance);
  68.                                 TF_over_flag=0;
  69.                                 OV_over_flag=0;
  70.                                 First_start_test_flag=0;                        
  71.                         }
  72.                 }
  73.                 if(Third_start_test_flag==1)
  74.                 {   
  75.                         LCD_ShowString(60,10,140,140,16,"Start Find");
  76.                         if(openmvs.flag==1)
  77.                         {        

  78.                                  if(openmvs.shape==2)
  79.                                 cen_x=openmvs.cx+openmvs.length/2;
  80.                                 else
  81.                                         cen_x=openmvs.cx;
  82.                                 if((int)cen_x<80)
  83.                                          X_error= 80-(int)cen_x;
  84.                                 else
  85.                                         X_error= (int)cen_x-80;
  86.                                 LCD_ShowNum(80,160,(int)openmvs.cx,5,16);
  87.                                 /*************获取中点**************/

  88.                                 /************得出偏差************/
  89.                                 //LCD_ShowNum(80,160,openmvs.shape,5,16);
  90.                                 LCD_ShowNum(80,200,X_error,5,16);
  91.                         if(X_error<=X_Error_MAX)
  92.                         {
  93.                                 GET_Size();
  94.                                 LCD_ShowNum(80,200,X_error,5,16);
  95.                                 LCD_ShowString(20,10,140,140,16,"Find over");
  96.                                 UI_1(openmvs,Actual_length,dealover_distance);
  97.                                 Servo=0; //舵机断电
  98.                                 TF_over_flag=0;
  99.                                 OV_over_flag=0;
  100.                                 Third_start_test_flag=0;
  101.                                 still_pwm=last_out_pwm;
  102.                         }
  103.                         if(Third_start_test_flag==1)
  104.                         {
  105.                                 if(openmvs.shape!=0)
  106.                                 {   
  107.                                                 PlacePID_CS(cen_x);
  108.                                                 delay_ms(30);
  109.                                         if(X_error<=15)
  110.                                                 delay_ms(50);
  111.                                 }
  112.                                 else
  113.                                 {
  114.                                         saomiao();
  115.                                         delay_ms(30);
  116.                                 
  117.                                 }
  118.                         }
  119.                         }
  120.                 }
  121.         }
  122. }
  123. void GET_Size(void )
  124. {
  125.                 if(tfmini.receiveComplete==1&&TF_Deal_count<100)
  126.                         {
  127.                                 distance_buf[TF_Deal_count]=tfmini.distance;
  128.                                   TF_Deal_count++;
  129.                         
  130.                         }
  131.                         if(TF_Deal_count>=100)
  132.                         {
  133.                            dealover_distance=tfmini_deal(distance_buf);
  134.                                 //LCD_ShowNum(150,50,dealover_distance,5,16);
  135.                                 TF_Deal_count=0;
  136.                                 TF_over_flag=1;
  137.                                 //LCD_ShowString(10,70,140,140,16,"2");
  138.                         }
  139.                         
  140.                         if((openmvs.flag==1)&&(OV_Deal_count<100)  )
  141.                         {   
  142.                                 //LCD_ShowString(10,70,140,140,16,"2");
  143.                                 Shape_buf[OV_Deal_count]=openmvs.shape ;
  144.                                 Cx_buf[OV_Deal_count]= openmvs.cx;
  145.                                 Cy_buf[OV_Deal_count]= openmvs.cx ;
  146.                                 Length_buf[OV_Deal_count]= openmvs.length ;
  147.                                 openmvs.flag=0;
  148.                                 OV_Deal_count++;
  149.                         }
  150.                 //        LCD_ShowNum(80,300,(u16)Shape_buf[OV_Deal_count-1],1,16);
  151.                         if(OV_Deal_count>=100)
  152.                         {
  153.                                 // for(i=0;i<100;i++) //数据处理
  154.                                 // LCD_ShowNum(80,200,Shape_buf[i],5,16);
  155.                          Dealover_OV=openmv_data_deal(Shape_buf,Cx_buf,Cy_buf,Length_buf) ;
  156.                          OV_Deal_count=0;
  157.                          OV_over_flag=1;
  158.                         //LCD_ShowNum(80,200,(u16)Dealover_OV.shape,5,16);
  159.                         }                                                                  
  160.                         Actual_length=Get_Actuallength(Dealover_OV,dealover_distance,Focal);
  161. }
复制代码

Keil代码下载: 代码.7z (364.22 KB, 下载次数: 33)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:1084874 发表于 2023-6-19 10:37 | 显示全部楼层
大佬可以发个openmv端的程序吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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