中级会员
 
- 积分
- 407
- 金钱
- 407
- 注册时间
- 2014-10-22
- 在线时间
- 135 小时
|
10金钱
本帖最后由 I is alun 于 2016-6-12 12:06 编辑
[mw_shl_code=c,true]#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "exti.h"
#include "timer.h"
#include "24cxx.h"
#include "dma.h"
//Mini STM32开发板范例代码16
//IIC 实验
//正点原子@ALIENTEK
//技术论坛:www.openedv.com
u8 USART_RX_BUF_1[3700]={0};
int i=0;
u32 temp;
//要写入到24c02的字符串数组
int main(void)
{
int count=0;
float distance_averge=0;
u16 j=0,k0=0,k1=0,angle_count=0;
float distance=0,angle=0,min_distance=10000,min_distance_to_angle=0 ;
Stm32_Clock_Init(9);//系统时钟设置
delay_init(72); //延时初始化
// TIM4_PWM_Init(2000,719); //预分配1000。PWM频率=72M/(720)=100khz,周期20ms
delay_ms(3000);//中点初始化3秒内完成上电自检,自检完成后PWM波正常控制
uart_init(36,115200); //串口1初始化
MYDMA_Config(DMA1_Channel6,(u32)(&USART2->DR),(u32)USART_RX_BUF_1,sizeof(USART_RX_BUF_1));//配置DMA通道1
MYDMA_Enable(DMA1_Channel6);//开启DMA通道6
LED_Init();
LED0=1;
while(1)
{
i=0;
while(i++<3700)
USART_RX_BUF_1=0;
printf("DMA START:\r\n");
min_distance=10000,min_distance_to_angle=0;
while((USART2->SR&0x40)==0);
//发送SCAN命令
USART2->DR=0xA5;
while((USART2->SR&0x40)==0);
USART2->DR=0x20;
while((USART2->SR&0x40)==0);
USART2->CR3|=1<<6; //使能串口2的DMA接收
delay_ms(1800);
while(1)
{
if(DMA1->ISR&(1<<21)); //传输完成了
{
USART2->CR3&=~(1<<6); //禁止串口2的DMA接收
DMA1->IFCR|=1<<21;//清除完成中断标志
break;
}
printf("CNDTR:%d\r\n",DMA1_Channel6->CNDTR);
}
MYDMA_Enable(DMA1_Channel6);//开启DMA通道6
//发送stop指令
USART2->DR=0xA5;
while((USART2->SR&0x40)==0);
USART2->DR=0x25;
while((USART2->SR&0x40)==0);
// printf("angle distance\r\n");
// printf("A");
//找到1圈激光数据的起始数据点
for(k0=8;k0<3600;k0++)
{
if(((k0-6)%5==1)&&(USART_RX_BUF_1[k0]%2==1))
{
break;
}
}
//找到1圈激光数据的终止数据点
for(k1=k0+1;k1<3600;k1++)
{
if(((k1-6)%5==1)&&(USART_RX_BUF_1[k1]%2==1))
{
break;
}
}
for(j=k0;j<k1;j=j+5)
{
angle=(float)(USART_RX_BUF_1[j+2]*128+(USART_RX_BUF_1[j+1]-1)/2)/64;
distance=(float)(USART_RX_BUF_1[j+4]*256+USART_RX_BUF_1[j+3])/4;
if(distance!=0)
{
angle_count++;
//printf("%f ,%f\r\n ",angle,distance);
}
if((angle>=0 && angle<2)||(angle>=358 && angle<360))
{
count++;
distance_averge+=distance;
// printf("%f ,%f\r\n ",angle,distance);// 打印0度和360度左右的角度和距离,也就是正前方的信息
}
}
if(count==0) distance_averge=0;
else distance_averge/=count;
printf("count:%d ,distance_averge:%f \r\n ",count,distance_averge);
if(distance_averge<300) TIM4->CCR4=130;
if(distance_averge>320) TIM4->CCR4=170;
if(distance_averge>=300&&distance_averge<=320) TIM4->CCR4=150;
//printf("最短距离:%f,相应角度:%f,有效角度个数:%d\r\n",min_distance,min_distance_to_angle,angle_count);
angle_count=0;
distance_averge=0;
count=0;
LED0=!LED0;
printf("DMA END:\r\n");
}
}
[/mw_shl_code]数据有变化,但是应该是1次一变,咋这么奇葩,第1次和第2次一样,第3次和第4次一样,第1次和第3次又不一样
|
-
|