/*****************************************************************************
*
* File Name : main.c
*
* Description: main
*
* Copyright (c) 2014 Winner Micro Electronic Design Co., Ltd.
* All rights reserved.
*
* Author : dave
*
* Date : 2014-6-14
*****************************************************************************/
#include "wm_include.h"
#include "wm_timer.h"
#include "math.h"
double get_distance01()
{
tls_gpio_write(WM_IO_PB_18,0);
delay_1us(40);
tls_gpio_write(WM_IO_PB_18,1);
delay_1us(60);
tls_gpio_write(WM_IO_PB_18,0);
delay_1us(20);
int32 count_num=0;
while(tls_gpio_read(WM_IO_PB_10)==0){;}
while(tls_gpio_read(WM_IO_PB_10)==1)
{
count_num+=1;
}
double distance = count_num*0.17/16;
return distance;
}
double get_distance02()
{
tls_gpio_write(WM_IO_PB_17,0);
delay_1us(40);
tls_gpio_write(WM_IO_PB_17,1);
delay_1us(60);
tls_gpio_write(WM_IO_PB_17,0);
delay_1us(20);
int32 count_num=0;
while(tls_gpio_read(WM_IO_PB_14)==0){;}
while(tls_gpio_read(WM_IO_PB_14)==1)
{
count_num+=1;
}
double distance = count_num*0.17/16;
return distance;
}
int32 get_angle(int a, int b)
{
double r = sqrt(2*(a*a+b*b)-144)/2;
double angle_para = acos((36+r*r-a*a)/(12*r))*170/3.14159265;
int32 angle_theta=round(angle_para);
return angle_theta;
}
int32 get_rotate()
{
int16 i;
int16 j;
int32 angle;
int32 angles[5]={0,0,0,0,0};
int16 count[5]={0,0,0,0,0};
for(i=0;i<10;i++)
{
double a = get_distance01();
delay_1us(200000);
double b = get_distance02();
delay_1us(200000);
angle=get_angle(a, b);
printf("%f %f %d \n", a, b,angle);
for(j=0;j<5;j++)
{
if(angles[j]==angle)
{
count[j]+=1;
break;
}
else if(angles[j]==0)
{
angles[j]=angle;
break;
}
}
}
j=0;
for(i=0;i<5;i++)
{
if(count[j]<count[i])j=i;
}
printf("%d \n", angles[j]);
return angles[j];
}
void sg90_rotate(int32 angle)
{
int32 freq_para=80000;
int16 turn_para=6000+(angle*8000)/180;
int16 i;
for(i=0;i<60;i++)
{
tls_gpio_write(WM_IO_PB_25,0);
delay_1us(freq_para-turn_para);
tls_gpio_write(WM_IO_PB_25,1);
delay_1us(turn_para);
}
tls_gpio_write(WM_IO_PB_25,0);
}
void UserMain(void)
{
printf("\n user task \n");
tls_gpio_cfg(WM_IO_PB_25,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
tls_gpio_cfg(WM_IO_PB_18,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
tls_gpio_cfg(WM_IO_PB_17,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
tls_gpio_cfg(WM_IO_PB_10,WM_GPIO_DIR_INPUT,WM_GPIO_ATTR_PULLLOW);
tls_gpio_cfg(WM_IO_PB_14,WM_GPIO_DIR_INPUT,WM_GPIO_ATTR_PULLLOW);
tls_gpio_cfg(WM_IO_PB_09,WM_GPIO_DIR_OUTPUT,WM_GPIO_ATTR_PULLLOW);
//*
while(1)
{
sg90_rotate(90-get_rotate());
tls_gpio_write(WM_IO_PB_09,1);
delay_1us(4000000);
tls_gpio_write(WM_IO_PB_09,0);
}
#if DEMO_CONSOLE
CreateDemoTask();
#endif
}
这就是主程序代码
调用-m math.h库方法(联盛德W801):
联盛德W801系列8-编译链接时找不到标准数学库函数的解决方法-优快云博客
CDK配置参考上述链接,配好保存代码后重启应用,再重启电脑后重新打开。