3903|3

1059

帖子

0

TA的资源

纯净的硅(高级)

楼主
 

超声波模块+步进电机做雷达的童鞋们.来公开源码讨论下吧 [复制链接]

本帖最后由 paulhyde 于 2014-9-15 09:13 编辑

很多人说类似于雷达的东西今年必须弄一个.我弄了个.超声波模块效果不大好.总体效果就没出来.源码上了.明天新的超声波模块到.说实话.国赛弄成这个样子真没多大意思了.我现在只求速度比完...

 

#include "stm32f10x_lib.h"
#include "ili9320.h"
#include "math.h"

/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
#define ADC1_DR_Address    ((u32)0x4001244C)
#define X0 80   //80为显示180°,R=150  120在中央.显示360°,R=100
#define Y0 160
#define kmax 120  // 方向最大值
#define rmax 150  //最大显示长度的坐标数
#define appscale 10  //小于接近尺度的点将被合并.单位为mm
#define pi 3.14//15926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
TIM_OCInitTypeDef  TIM_OCInitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
TIM_ICInitTypeDef  TIM_ICInitStructure;

u16 dutytime =0x3ff ;
vu16 T2value;
u16 distance[kmax];
u16 drawlenth;
int rotateflag;
int k,ktemp,ksum;//共200,步进电机的200个方向

double xlen,ylen;  //~


volatile short TIM1_Period=35;

ErrorStatus HSEStartUpStatus;

/* Private function prototypes -----------------------------------------------*/
void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);
void TIM_Configuration(void);

void SetAxis(void);

/* Private functions ---------------------------------------------------------*/
u8 AsciiBuff[5];
void HexToASCII(u16 data)
{
 AsciiBuff[0] = data/1000%10 + 0x30;
 AsciiBuff[1] = data/100%10 + 0x30;
 AsciiBuff[2] = data/10%10 + 0x30;
 AsciiBuff[3] = data%10 + 0x30;
 AsciiBuff[4] = 0;
}
/*******************************************************************************
* Function Name  : main
* Description    : Main program
* Input          : None
* Output         : None
* Return         : None
*******************************************************************************/
int main(void)
{
#ifdef DEBUG
  debug();
#endif

 int i,t;
 
 /* System Clocks Configuration */
 RCC_Configuration(); 
 
 /* NVIC configuration */
 NVIC_Configuration();
 
 /* GPIO Configuration */
 GPIO_Configuration();

 ili9320_Initializtion(); //LCD初始化
 ili9320_Clear(White);    //清屏
 ili9320_Clear(White);    //清屏
 
 TIM_Configuration();
 

 
 GPIO_ResetBits(GPIOC, GPIO_Pin_0);
 GPIO_ResetBits(GPIOC, GPIO_Pin_1);


// WriteString(30,70,"启动",Blue);
 SetAxis();
 k=1;  //防止第一次k-1无效

 while (1)
 {
  for(i=0;i<5;i++)
  {
   GPIO_SetBits(GPIOC, GPIO_Pin_7);
   for(t=0;t<100;t++);
   GPIO_ResetBits(GPIOC, GPIO_Pin_7);
  
   while(!GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8));  //等待高电平开始
   TIM_ITConfig(TIM8, TIM_IT_Update, ENABLE);
   TIM_Cmd(TIM8, ENABLE);
   while(GPIO_ReadInputDataBit(GPIOC, GPIO_Pin_8));   //计高电平时间
   TIM_ITConfig(TIM8, TIM_IT_Update, DISABLE);
   TIM_Cmd(TIM8, DISABLE);
  
   if(T2value<1000)distance[k]+=T2value/5;  //判断取值是否有效
   else i--; 
  }
  distance[k]=(distance[k]*2/58);
  if(1) rotateflag=1;  //此处判断是否返回了有效值
 
  //新绘图方式
  if((distance[k]-distance[k-1])<appscale)
  {
   ksum++;  
  }
  else
  {
   if(ksum==0)
   {
    drawlenth=distance[k]/1;  //显示drawlenth与距离distance的比例
    xlen=sin(pi*k/kmax);
    ylen=cos(pi*k/kmax);
    Draw_Circle(X0+drawlenth*xlen,Y0-drawlenth*ylen,2); //~
    Draw_Circle(120,160,2);
    HexToASCII(distance[k]);
    WriteString(X0+drawlenth*xlen-40,Y0-drawlenth*ylen,AsciiBuff,Blue);
   }
   else
   {
    for(i=0;i<ksum;i++) drawlenth=distance[k-i];    

    drawlenth =drawlenth/1;
    ktemp=k-ksum/2;
    xlen=sin(pi*ktemp/kmax);
    ylen=cos(pi*ktemp/kmax);
    Draw_Circle(X0+drawlenth*xlen,Y0-drawlenth*ylen,2); //~
    Draw_Circle(120,160,2);
    HexToASCII(distance[ktemp]);
    WriteString(X0+drawlenth*xlen-40,Y0-drawlenth*ylen,AsciiBuff,Blue);

   }
  } 
 
  T2value=0;
  //distance=0;
 
  if(!GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0)) k++;
  else if(GPIO_ReadOutputDataBit(GPIOC, GPIO_Pin_0)) k--;
 
  if(k==kmax)
  {
   GPIO_SetBits(GPIOC, GPIO_Pin_0);   //步进电机方向改变
 
   ili9320_Clear(White);    //清屏.以下为画图
   SetAxis();
  }
  else if(k==0)
  {
   GPIO_ResetBits(GPIOC, GPIO_Pin_0);
 
   ili9320_Clear(White);    //清屏.以下为画图
   SetAxis();
  }
  rotateflag=1;
 // TIM_CtrlPWMOutputs(TIM1,ENABLE);
 
 
  GPIO_SetBits(GPIOA, GPIO_Pin_11); //400Hz
  for(t=0;t<15000;t++);
  GPIO_ResetBits(GPIOA, GPIO_Pin_11);
 // for(t=0;t<5000;t++);
 
 // while(1); 
 }
}


/*自写函数*/
void SetAxis(void)
{
 LCD_DrawLine(0, Y0, 240, Y0);
 LCD_DrawLine(X0, 0, X0, 320);
 LCD_DrawLine(X0-5, Y0-rmax, X0+5, Y0-rmax);
 LCD_DrawLine(X0-5, Y0+rmax, X0+5, Y0+rmax);
 WriteString(X0-40,Y0-rmax-10,"1.5m",Red);
 WriteString(X0-40,Y0+rmax-10,"1.5m",Red);
 LCD_DrawLine(X0-5, Y0-rmax*2/3, X0+5, Y0-rmax*2/3);
 LCD_DrawLine(X0-5, Y0+rmax*2/3, X0+5, Y0+rmax*2/3);
 WriteString(X0-40,Y0-rmax*2/3-10,"1.0m",Red);
 WriteString(X0-40,Y0+rmax*2/3-10,"1.0m",Red);
 LCD_DrawLine(X0-5, Y0-rmax/3, X0+5, Y0-rmax/3);
 LCD_DrawLine(X0-5, Y0+rmax/3, X0+5, Y0+rmax/3);
 WriteString(X0-40,Y0-rmax/3-10,"0.5m",Red);
 WriteString(X0-40,Y0+rmax/3-10,"0.5m",Red);
}

[ 本帖最后由 astwyg 于 2011-8-27 16:58 编辑 ]

 

此帖出自电子竞赛论坛

最新回复

本帖最后由 paulhyde 于 2014-9-15 09:13 编辑 自动进仓库车的原理图和    详情 回复 发表于 2011-8-29 17:46
点赞 关注
 
 

回复
举报

2

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
本帖最后由 paulhyde 于 2014-9-15 09:13 编辑

萨法

 

此帖出自电子竞赛论坛
 
 
 

回复

17

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
本帖最后由 paulhyde 于 2014-9-15 09:13 编辑

具体的思路是什么啊?雷达是怎么实现的啊?、

 

此帖出自电子竞赛论坛
 
 
 

回复

8

帖子

0

TA的资源

一粒金砂(初级)

4
 
本帖最后由 paulhyde 于 2014-9-15 09:13 编辑

自动进仓库车的原理图和

 

此帖出自电子竞赛论坛
 
 
 

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

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表